@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupSimplePreferencesScreen(); Preference button = (Preference)findPreference("clearCache"); button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { ConfigXmlParser parser = new ConfigXmlParser(); parser.parse(SettingsActivity.this); CordovaPreferences preferences = parser.getPreferences(); preferences.setPreferencesBundle(SettingsActivity.this.getIntent().getExtras()); CordovaWebView webView = new CordovaWebViewImpl(CordovaWebViewImpl.createEngine(SettingsActivity.this, preferences)); webView.clearCache(); return true; } }); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Set up the webview ConfigXmlParser parser = new ConfigXmlParser(); parser.parse(this); SystemWebView webView = (SystemWebView) findViewById(R.id.cordovaWebView); webInterface = new CordovaWebViewImpl(new SystemWebViewEngine(webView)); webInterface.init(cordovaInterface, parser.getPluginEntries(), parser.getPreferences()); webView.loadUrl(parser.getLaunchUrl()); }
@Test public void testThatCachedCallbackIdIsValid() throws Throwable { final CordovaWebView cordovaWebView = testActivity.getWebInterface(); Class cordovaWebViewImpl = CordovaWebViewImpl.class; //send a test event - this initializes cordovaWebViewImpl.appPlugin (the cached instance of CoreAndroid) Method method = cordovaWebViewImpl.getDeclaredMethod("sendJavascriptEvent", String.class); method.setAccessible(true); method.invoke(cordovaWebView, "testEvent"); sleep(1000); //load a page - this resets the plugin manager and nulls cordovaWebViewImpl.appPlugin //(previously this resets plugin manager but did not null cordovaWebViewImpl.appPlugin, leading to the issue) mActivityRule.runOnUiThread(new Runnable() { public void run() { cordovaWebView.loadUrl(START_URL); } }); assertEquals(START_URL, testActivity.onPageFinishedUrl.take()); //send a test event - this initializes cordovaWebViewImpl.appPlugin (the cached instance of CoreAndroid) method.invoke(cordovaWebView, "testEvent"); sleep(1000); //get reference to package protected class CoreAndroid Class coreAndroid = Class.forName("org.apache.cordova.CoreAndroid"); //get cached CoreAndroid Field appPluginField = cordovaWebViewImpl.getDeclaredField("appPlugin"); appPluginField.setAccessible(true); Object cachedAppPlugin = appPluginField.get(cordovaWebView); //get cached CallbackContext Field messageChannelField = coreAndroid.getDeclaredField("messageChannel"); messageChannelField.setAccessible(true); CallbackContext cachedCallbackContext = (CallbackContext) messageChannelField.get(cachedAppPlugin); //get live CoreAndroid PluginManager pluginManager = cordovaWebView.getPluginManager(); Field coreAndroidPluginNameField = coreAndroid.getField("PLUGIN_NAME"); String coreAndroidPluginName = (String) coreAndroidPluginNameField.get(null); Object liveAppPlugin = pluginManager.getPlugin(coreAndroidPluginName); //get live CallbackContext CallbackContext liveCallbackContext = (CallbackContext) messageChannelField.get(liveAppPlugin); //get callback id from live callbackcontext String liveCallbackId = (liveCallbackContext != null) ? liveCallbackContext.getCallbackId() : null; //get callback id from cached callbackcontext String cachedCallbackId = (cachedCallbackContext != null) ? cachedCallbackContext.getCallbackId() : null; //verify that the live message channel has been initialized assertNotNull(liveCallbackId); //verify that the cached message channel and the live message channel have the same id assertEquals(liveCallbackId, cachedCallbackId); }
protected CordovaWebViewEngine makeWebViewEngine() { return CordovaWebViewImpl.createEngine(dummyActivity, preferences); }
protected CordovaWebView makeWebView() { return new CordovaWebViewImpl(makeWebViewEngine()); }
protected CordovaWebViewEngine makeWebViewEngine() { return CordovaWebViewImpl.createEngine(getActivity(), preferences); }
/** * Construct the default web view object. * <p/> * Override this to customize the webview that is used. */ protected CordovaWebView makeWebView() { return new CordovaWebViewImpl(makeWebViewEngine()); }