diff options
author | Mikhail Naganov <mnaganov@google.com> | 2015-03-04 13:49:12 +0000 |
---|---|---|
committer | Mikhail Naganov <mnaganov@google.com> | 2015-03-04 13:49:12 +0000 |
commit | 7699f2d5018da421c0f7baec70a78928772f8c6c (patch) | |
tree | 43e42d5cb47b34534ea72a6305be17a16bff3aa0 /android_webview | |
parent | 0fa3bbe20ad9f011f5a61b872fed5b69f9d65352 (diff) | |
download | chromium_org-7699f2d5018da421c0f7baec70a78928772f8c6c.tar.gz |
Back-port: "[Android WebView] Synthesize a fake page loading event on page source modification (Re-land)"webview-m40_r2
Back-port of https://codereview.chromium.org/970883002/ for m40.
Original description:
[Android WebView] Synthesize a fake page loading event on page source modification (Re-land)
When a script modifies page source of a non-committed page, we need to
notify clients, so they can update the URL bar to avoid confusion.
New logic since the last attempt (https://codereview.chromium.org/924833003/):
distinguish between a "vanilla" WebView state (basically, a newly created
WebView, where no loading attempts have been made) and an "attempted to
navigate" state. In the "vanilla" state, don't fire synthesized page loading
events to avoid confusing clients. This is safe, as WebView is guaranteed to be
on a blank page.
Implementation note: we detect navigation attempts using
didStartProvisionalLoadForFrame WebContentsObserver event on the Java side. As
for popups AwWebContentsObserver gets re-attached from the original popup
WebView to the one provided by the client, notifications issued inbetween can be
missed on the Java side. To work around this, we assume that WebViews opened as
popups can never be in "vanilla" state (as they are anyway opened as a result of
navigation).
BUG=458569, 462213
TBR=davidben@chromium.org,tedchoc@chromium.org
Bug: 19325392
Change-Id: I3df0484f00d2b816cb0293bec432b2fa6ac5e05b
Diffstat (limited to 'android_webview')
21 files changed, 177 insertions, 2 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index b3528e43da..b7b30b1f35 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -50,7 +50,6 @@ import org.chromium.content.browser.ContentViewClient; import org.chromium.content.browser.ContentViewCore; import org.chromium.content.browser.ContentViewStatics; import org.chromium.content.browser.SmartClipProvider; -import org.chromium.content.browser.WebContentsObserver; import org.chromium.content.common.CleanupReference; import org.chromium.content_public.browser.GestureStateListener; import org.chromium.content_public.browser.JavaScriptCallback; @@ -190,7 +189,7 @@ public class AwContents implements SmartClipProvider { private NavigationController mNavigationController; private final AwContentsClient mContentsClient; private final AwContentViewClient mContentViewClient; - private WebContentsObserver mWebContentsObserver; + private AwWebContentsObserver mWebContentsObserver; private final AwContentsClientBridge mContentsClientBridge; private final AwWebContentsDelegateAdapter mWebContentsDelegate; private final AwContentsIoThreadClient mIoThreadClient; @@ -213,6 +212,8 @@ public class AwContents implements SmartClipProvider { private boolean mHasRequestedVisitedHistoryFromClient; // TODO(boliu): This should be in a global context, not per webview. private final double mDIPScale; + // Whether the WebView has attempted to do any load (including uncommitted loads). + private boolean mDidAttemptLoad = false; // The base background color, i.e. not accounting for any CSS body from the current page. private int mBaseBackgroundColor = Color.WHITE; @@ -895,6 +896,9 @@ public class AwContents implements SmartClipProvider { if (wasWindowFocused) onWindowFocusChanged(wasWindowFocused); if (wasFocused) onFocusChanged(true, 0, null); + // Popups are always assumed as having made a load attempt. + mDidAttemptLoad = true; + // Restore injected JavaScript interfaces. for (Map.Entry<String, Pair<Object, Class>> entry : javascriptInterfaces.entrySet()) { @SuppressWarnings("unchecked") @@ -1217,6 +1221,19 @@ public class AwContents implements SmartClipProvider { return url; } + /** + * Gets the last committed URL. It represents the current page that is + * displayed in WebContents. It represents the current security context. + * + * @return The URL of the current page or null if it's empty. + */ + public String getLastCommittedUrl() { + if (isDestroyed()) return null; + String url = mWebContents.getLastCommittedUrl(); + if (url == null || url.trim().isEmpty()) return null; + return url; + } + public void requestFocus() { mAwViewMethods.requestFocus(); } @@ -1773,6 +1790,11 @@ public class AwContents implements SmartClipProvider { if (!isDestroyed()) mWebContents.evaluateJavaScript(script, null); } + public boolean hasAccessedInitialDocument() { + if (isDestroyed()) return false; + return mWebContents.hasAccessedInitialDocument(); + } + //-------------------------------------------------------------------------------------------- // View and ViewGroup method implementations //-------------------------------------------------------------------------------------------- @@ -1988,6 +2010,12 @@ public class AwContents implements SmartClipProvider { if (!isDestroyed()) nativeSetJsOnlineProperty(mNativeAwContents, networkUp); } + public boolean getDidAttemptLoad() { + if (mDidAttemptLoad) return mDidAttemptLoad; + mDidAttemptLoad = mWebContentsObserver.hasStartedAnyProvisionalLoad(); + return mDidAttemptLoad; + } + //-------------------------------------------------------------------------------------------- // Methods called from native via JNI //-------------------------------------------------------------------------------------------- diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java index 9adc3bb2e9..053038f5f7 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java +++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java @@ -41,4 +41,8 @@ public abstract class AwWebContentsDelegate extends WebContentsDelegateAndroid { // Call in response to a prior runFileChooser call. protected static native void nativeFilesSelectedInChooser(int processId, int renderId, int modeFlags, String[] filePath, String[] displayName); + + @Override + @CalledByNative + public abstract void navigationStateChanged(int flags); } diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java index be714d6a2f..8809ced9b6 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java +++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java @@ -11,6 +11,7 @@ import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; +import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; @@ -20,6 +21,7 @@ import android.webkit.ValueCallback; import org.chromium.base.ContentUriUtils; import org.chromium.base.ThreadUtils; import org.chromium.content.browser.ContentVideoView; +import org.chromium.content_public.browser.InvalidateTypes; /** * Adapts the AwWebContentsDelegate interface to the AwContentsClient interface. @@ -214,6 +216,22 @@ class AwWebContentsDelegateAdapter extends AwWebContentsDelegate { } @Override + public void navigationStateChanged(int flags) { + if ((flags & InvalidateTypes.URL) != 0 + && mAwContents.hasAccessedInitialDocument() + && mAwContents.getDidAttemptLoad()) { + // Hint the client to show the last committed url, as it may be unsafe to show + // the pending entry. + String url = mAwContents.getLastCommittedUrl(); + url = TextUtils.isEmpty(url) ? "about:blank" : url; + mContentsClient.onPageStarted(url); + mContentsClient.onLoadResource(url); + mContentsClient.onProgressChanged(100); + mContentsClient.onPageFinished(url); + } + } + + @Override public void toggleFullscreenModeForTab(boolean enterFullscreen) { if (enterFullscreen) { mContentViewClient.enterFullscreen(); diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java index c3c381a6bd..cd45eadac2 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java +++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java @@ -13,12 +13,17 @@ import org.chromium.net.NetError; */ public class AwWebContentsObserver extends WebContentsObserver { private final AwContentsClient mAwContentsClient; + private boolean mHasStartedAnyProvisionalLoad = false; public AwWebContentsObserver(WebContents webContents, AwContentsClient awContentsClient) { super(webContents); mAwContentsClient = awContentsClient; } + boolean hasStartedAnyProvisionalLoad() { + return mHasStartedAnyProvisionalLoad; + } + @Override public void didFinishLoad(long frameId, String validatedUrl, boolean isMainFrame) { String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl(); @@ -67,4 +72,15 @@ public class AwWebContentsObserver extends WebContentsObserver { public void didNavigateAnyFrame(String url, String baseUrl, boolean isReload) { mAwContentsClient.doUpdateVisitedHistory(url, isReload); } + + @Override + public void didStartProvisionalLoadForFrame( + long frameId, + long parentFrameId, + boolean isMainFrame, + String validatedUrl, + boolean isErrorPage, + boolean isIframeSrcdoc) { + mHasStartedAnyProvisionalLoad = true; + } } diff --git a/android_webview/java_library_common.mk b/android_webview/java_library_common.mk index 7697834235..b5792edf7a 100644 --- a/android_webview/java_library_common.mk +++ b/android_webview/java_library_common.mk @@ -50,6 +50,7 @@ $(call intermediates-dir-for,GYP,shared)/enums/certificate_mime_types_java/org/c $(call intermediates-dir-for,GYP,shared)/enums/content_gamepad_mapping/org/chromium/content/browser/input/CanonicalAxisIndex.java \ $(call intermediates-dir-for,GYP,shared)/enums/content_gamepad_mapping/org/chromium/content/browser/input/CanonicalButtonIndex.java \ $(call intermediates-dir-for,GYP,shared)/enums/gesture_event_type_java/org/chromium/content/browser/GestureEventType.java \ +$(call intermediates-dir-for,GYP,shared)/enums/invalidate_types_java/org/chromium/content_public/browser/InvalidateTypes.java \ $(call intermediates-dir-for,GYP,shared)/enums/popup_item_type_java/org/chromium/content/browser/input/PopupItemType.java \ $(call intermediates-dir-for,GYP,shared)/enums/private_key_types_java/org/chromium/net/PrivateKeyType.java \ $(call intermediates-dir-for,GYP,shared)/enums/result_codes_java/org/chromium/content_public/common/ResultCode.java \ diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java index 0f62bbd54d..b657d9d54b 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java @@ -276,4 +276,84 @@ public class ClientOnPageFinishedTest extends AwTestBase { webServer.shutdown(); } } + + @MediumTest + @Feature({"AndroidWebView"}) + public void testOnPageFinishedNotCalledOnDomModificationForBlankWebView() throws Throwable { + TestWebServer webServer = TestWebServer.start(); + try { + doTestOnPageFinishedNotCalledOnDomMutation(webServer); + } finally { + webServer.shutdown(); + } + } + + @MediumTest + @Feature({"AndroidWebView"}) + public void testOnPageFinishedCalledOnDomModificationAfterNonCommittedLoad() throws Throwable { + enableJavaScriptOnUiThread(mAwContents); + TestWebServer webServer = TestWebServer.start(); + try { + final String noContentUrl = webServer.setResponseWithNoContentStatus("/nocontent.html"); + TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = + mContentsClient.getOnPageFinishedHelper(); + final int onPageFinishedCallCount = onPageFinishedHelper.getCallCount(); + loadUrlAsync(mAwContents, noContentUrl); + // Mutate DOM. + executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, + "document.body.innerHTML='Hello, World!'"); + onPageFinishedHelper.waitForCallback(onPageFinishedCallCount); + assertEquals("about:blank", onPageFinishedHelper.getUrl()); + } finally { + webServer.shutdown(); + } + } + + @MediumTest + @Feature({"AndroidWebView"}) + public void testOnPageFinishedNotCalledOnDomModificationAfterLoadUrl() throws Throwable { + TestWebServer webServer = TestWebServer.start(); + try { + final String testUrl = + webServer.setResponse("/test.html", CommonResources.ABOUT_HTML, null); + loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), testUrl); + doTestOnPageFinishedNotCalledOnDomMutation(webServer); + } finally { + webServer.shutdown(); + } + } + + @MediumTest + @Feature({"AndroidWebView"}) + public void testOnPageFinishedNotCalledOnDomModificationAfterLoadData() + throws Throwable { + TestWebServer webServer = TestWebServer.start(); + try { + loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), + CommonResources.ABOUT_HTML, "text/html", false); + doTestOnPageFinishedNotCalledOnDomMutation(webServer); + } finally { + webServer.shutdown(); + } + } + + private void doTestOnPageFinishedNotCalledOnDomMutation(TestWebServer webServer) + throws Throwable { + enableJavaScriptOnUiThread(mAwContents); + TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = + mContentsClient.getOnPageFinishedHelper(); + final int onPageFinishedCallCount = onPageFinishedHelper.getCallCount(); + // Mutate DOM. + executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, + "document.body.innerHTML='Hello, World!'"); + // Rather than wait a fixed time to see that an onPageFinished callback isn't issued + // we load another valid page. Since callbacks arrive sequentially if the next callback + // we get is for the synchronizationUrl we know that DOM mutation did not schedule + // a callback for the iframe. + final String syncUrl = webServer.setResponse("/sync.html", "", null); + loadUrlAsync(mAwContents, syncUrl); + onPageFinishedHelper.waitForCallback(onPageFinishedCallCount); + assertEquals(syncUrl, onPageFinishedHelper.getUrl()); + assertEquals(onPageFinishedCallCount + 1, onPageFinishedHelper.getCallCount()); + } } diff --git a/android_webview/libwebviewchromium.gypi b/android_webview/libwebviewchromium.gypi index c99a6f4826..544e051e96 100644 --- a/android_webview/libwebviewchromium.gypi +++ b/android_webview/libwebviewchromium.gypi @@ -18,6 +18,7 @@ '../base/base.gyp:base_java_memory_pressure_level', '../content/content.gyp:content_gamepad_mapping', '../content/content.gyp:gesture_event_type_java', + '../content/content.gyp:invalidate_types_java', '../content/content.gyp:popup_item_type_java', '../content/content.gyp:result_codes_java', '../content/content.gyp:screen_orientation_values_java', diff --git a/android_webview/libwebviewchromium.target.darwin-arm.mk b/android_webview/libwebviewchromium.target.darwin-arm.mk index bce74a8f02..daf9152946 100644 --- a/android_webview/libwebviewchromium.target.darwin-arm.mk +++ b/android_webview/libwebviewchromium.target.darwin-arm.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.darwin-arm64.mk b/android_webview/libwebviewchromium.target.darwin-arm64.mk index dceafab64f..cc868663dc 100644 --- a/android_webview/libwebviewchromium.target.darwin-arm64.mk +++ b/android_webview/libwebviewchromium.target.darwin-arm64.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.darwin-mips.mk b/android_webview/libwebviewchromium.target.darwin-mips.mk index 6c489f1554..833116c325 100644 --- a/android_webview/libwebviewchromium.target.darwin-mips.mk +++ b/android_webview/libwebviewchromium.target.darwin-mips.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.darwin-mips64.mk b/android_webview/libwebviewchromium.target.darwin-mips64.mk index b1ba66a2e5..2ae79c2e22 100644 --- a/android_webview/libwebviewchromium.target.darwin-mips64.mk +++ b/android_webview/libwebviewchromium.target.darwin-mips64.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.darwin-x86.mk b/android_webview/libwebviewchromium.target.darwin-x86.mk index d4510dbf03..00d4d377db 100644 --- a/android_webview/libwebviewchromium.target.darwin-x86.mk +++ b/android_webview/libwebviewchromium.target.darwin-x86.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.darwin-x86_64.mk b/android_webview/libwebviewchromium.target.darwin-x86_64.mk index 32f7d4c70a..f4f21ccffb 100644 --- a/android_webview/libwebviewchromium.target.darwin-x86_64.mk +++ b/android_webview/libwebviewchromium.target.darwin-x86_64.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.linux-arm.mk b/android_webview/libwebviewchromium.target.linux-arm.mk index bce74a8f02..daf9152946 100644 --- a/android_webview/libwebviewchromium.target.linux-arm.mk +++ b/android_webview/libwebviewchromium.target.linux-arm.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.linux-arm64.mk b/android_webview/libwebviewchromium.target.linux-arm64.mk index dceafab64f..cc868663dc 100644 --- a/android_webview/libwebviewchromium.target.linux-arm64.mk +++ b/android_webview/libwebviewchromium.target.linux-arm64.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.linux-mips.mk b/android_webview/libwebviewchromium.target.linux-mips.mk index 6c489f1554..833116c325 100644 --- a/android_webview/libwebviewchromium.target.linux-mips.mk +++ b/android_webview/libwebviewchromium.target.linux-mips.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.linux-mips64.mk b/android_webview/libwebviewchromium.target.linux-mips64.mk index b1ba66a2e5..2ae79c2e22 100644 --- a/android_webview/libwebviewchromium.target.linux-mips64.mk +++ b/android_webview/libwebviewchromium.target.linux-mips64.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.linux-x86.mk b/android_webview/libwebviewchromium.target.linux-x86.mk index d4510dbf03..00d4d377db 100644 --- a/android_webview/libwebviewchromium.target.linux-x86.mk +++ b/android_webview/libwebviewchromium.target.linux-x86.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/libwebviewchromium.target.linux-x86_64.mk b/android_webview/libwebviewchromium.target.linux-x86_64.mk index 32f7d4c70a..f4f21ccffb 100644 --- a/android_webview/libwebviewchromium.target.linux-x86_64.mk +++ b/android_webview/libwebviewchromium.target.linux-x86_64.mk @@ -18,6 +18,7 @@ GYP_TARGET_DEPENDENCIES := \ $(call intermediates-dir-for,GYP,base_base_java_memory_pressure_level_gyp,,,$(GYP_VAR_PREFIX))/base_java_memory_pressure_level.stamp \ $(call intermediates-dir-for,GYP,content_content_gamepad_mapping_gyp,,,$(GYP_VAR_PREFIX))/content_gamepad_mapping.stamp \ $(call intermediates-dir-for,GYP,content_gesture_event_type_java_gyp,,,$(GYP_VAR_PREFIX))/gesture_event_type_java.stamp \ + $(call intermediates-dir-for,GYP,content_invalidate_types_java_gyp,,,$(GYP_VAR_PREFIX))/invalidate_types_java.stamp \ $(call intermediates-dir-for,GYP,content_popup_item_type_java_gyp,,,$(GYP_VAR_PREFIX))/popup_item_type_java.stamp \ $(call intermediates-dir-for,GYP,content_result_codes_java_gyp,,,$(GYP_VAR_PREFIX))/result_codes_java.stamp \ $(call intermediates-dir-for,GYP,content_screen_orientation_values_java_gyp,,,$(GYP_VAR_PREFIX))/screen_orientation_values_java.stamp \ diff --git a/android_webview/native/aw_web_contents_delegate.cc b/android_webview/native/aw_web_contents_delegate.cc index ff73c1d65f..27efec439e 100644 --- a/android_webview/native/aw_web_contents_delegate.cc +++ b/android_webview/native/aw_web_contents_delegate.cc @@ -163,6 +163,18 @@ void AwWebContentsDelegate::AddNewContents(WebContents* source, } } +void AwWebContentsDelegate::NavigationStateChanged( + const content::WebContents* source, + content::InvalidateTypes changed_flags) { + JNIEnv* env = AttachCurrentThread(); + + ScopedJavaLocalRef<jobject> java_delegate = GetJavaDelegate(env); + if (java_delegate.obj()) { + Java_AwWebContentsDelegate_navigationStateChanged(env, java_delegate.obj(), + changed_flags); + } +} + // Notifies the delegate about the creation of a new WebContents. This // typically happens when popups are created. void AwWebContentsDelegate::WebContentsCreated( diff --git a/android_webview/native/aw_web_contents_delegate.h b/android_webview/native/aw_web_contents_delegate.h index f45d3128ac..e898b84915 100644 --- a/android_webview/native/aw_web_contents_delegate.h +++ b/android_webview/native/aw_web_contents_delegate.h @@ -41,6 +41,9 @@ class AwWebContentsDelegate bool user_gesture, bool* was_blocked) override; + virtual void NavigationStateChanged( + const content::WebContents* source, + content::InvalidateTypes changed_flags) override; virtual void WebContentsCreated(content::WebContents* source_contents, int opener_render_frame_id, const base::string16& frame_name, |