summaryrefslogtreecommitdiff
path: root/android_webview
diff options
context:
space:
mode:
authorMikhail Naganov <mnaganov@google.com>2015-03-04 13:49:12 +0000
committerMikhail Naganov <mnaganov@google.com>2015-03-04 13:49:12 +0000
commit7699f2d5018da421c0f7baec70a78928772f8c6c (patch)
tree43e42d5cb47b34534ea72a6305be17a16bff3aa0 /android_webview
parent0fa3bbe20ad9f011f5a61b872fed5b69f9d65352 (diff)
downloadchromium_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')
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java32
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegate.java4
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java18
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java16
-rw-r--r--android_webview/java_library_common.mk1
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java80
-rw-r--r--android_webview/libwebviewchromium.gypi1
-rw-r--r--android_webview/libwebviewchromium.target.darwin-arm.mk1
-rw-r--r--android_webview/libwebviewchromium.target.darwin-arm64.mk1
-rw-r--r--android_webview/libwebviewchromium.target.darwin-mips.mk1
-rw-r--r--android_webview/libwebviewchromium.target.darwin-mips64.mk1
-rw-r--r--android_webview/libwebviewchromium.target.darwin-x86.mk1
-rw-r--r--android_webview/libwebviewchromium.target.darwin-x86_64.mk1
-rw-r--r--android_webview/libwebviewchromium.target.linux-arm.mk1
-rw-r--r--android_webview/libwebviewchromium.target.linux-arm64.mk1
-rw-r--r--android_webview/libwebviewchromium.target.linux-mips.mk1
-rw-r--r--android_webview/libwebviewchromium.target.linux-mips64.mk1
-rw-r--r--android_webview/libwebviewchromium.target.linux-x86.mk1
-rw-r--r--android_webview/libwebviewchromium.target.linux-x86_64.mk1
-rw-r--r--android_webview/native/aw_web_contents_delegate.cc12
-rw-r--r--android_webview/native/aw_web_contents_delegate.h3
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,