...24import org.openqa.selenium.remote.ExecuteMethod;25import org.openqa.selenium.remote.html5.RemoteApplicationCache;26import org.openqa.selenium.remote.html5.RemoteDatabaseStorage;27import org.openqa.selenium.remote.html5.RemoteLocationContext;28import org.openqa.selenium.remote.html5.RemoteWebStorage;29import java.lang.reflect.InvocationTargetException;30/**31 * Provides utility methods for converting a {@link WebDriver} instance to the various HTML532 * role interfaces. Each method will throw an {@link UnsupportedCommandException} if the driver33 * does not support the corresponding HTML5 feature.34 */35class Utils {36 static ApplicationCache getApplicationCache(WebDriver driver) {37 return convert(driver, ApplicationCache.class, CapabilityType.SUPPORTS_APPLICATION_CACHE,38 RemoteApplicationCache.class);39 }40 static LocationContext getLocationContext(WebDriver driver) {41 return convert(driver, LocationContext.class, CapabilityType.SUPPORTS_LOCATION_CONTEXT,42 RemoteLocationContext.class);43 }44 static DatabaseStorage getDatabaseStorage(WebDriver driver) {45 return convert(driver, DatabaseStorage.class, CapabilityType.SUPPORTS_SQL_DATABASE,46 RemoteDatabaseStorage.class);47 }48 static WebStorage getWebStorage(WebDriver driver) {49 return convert(driver, WebStorage.class, CapabilityType.SUPPORTS_WEB_STORAGE,50 RemoteWebStorage.class);51 }52 private static <T> T convert(53 WebDriver driver, Class<T> interfaceClazz, String capability,54 Class<? extends T> remoteImplementationClazz) {55 if (interfaceClazz.isInstance(driver)) {56 return interfaceClazz.cast(driver);57 }58 if (driver instanceof ExecuteMethod59 && driver instanceof HasCapabilities60 && ((HasCapabilities) driver).getCapabilities().is(capability)) {61 try {62 return remoteImplementationClazz63 .getConstructor(ExecuteMethod.class)64 .newInstance((ExecuteMethod) driver);...