[go: up one dir, main page]

[Message] Update scope change on #navigationEntryCommitted

The LoadCommittedDetails can offer info of whether the navigation is due
to entry replacement or not. Similar to infobar, messages should not be
dismissed when that happens.

(cherry picked from commit 3b1d0f421ba53fdb711dd2859e61a8a4d372ca21)

This CL adds LoadCommittedDetails to WCO#navigationEntryCommitted in
java side so that the clients can get the info of #isSameDocument
and so on.

(cherry picked from commit f308c0bfbee372b969b25db48194df1a4c73c6c0)

Bug: 1171941, 1195877
Change-Id: I83196be39d88ca8abd6b5b41f1d311e629eac74f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2832115
Reviewed-by: Theresa  <twellington@chromium.org>
Reviewed-by: Pavel Yatsuk <pavely@chromium.org>
Reviewed-by: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: Christian Dullweber <dullweber@chromium.org>
Commit-Queue: Lijin Shen <lazzzis@google.com>
Cr-Commit-Position: refs/branch-heads/4430@{#1309}
Cr-Branched-From: e5ce7dc4f7518237b3d9bb93cccca35d25216cbe-refs/heads/master@{#857950}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
index ecedc573..6f0ccd00 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -28,6 +28,7 @@
 import org.chromium.components.external_intents.ExternalNavigationHandler;
 import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
 import org.chromium.components.navigation_interception.NavigationParams;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.RenderCoordinates;
@@ -352,7 +353,7 @@
                     }
 
                     @Override
-                    public void navigationEntryCommitted() {
+                    public void navigationEntryCommitted(LoadCommittedDetails details) {
                         mContentDelegate.onNavigationEntryCommitted();
                     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
index 7ffbea4c..e3f817c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
@@ -26,6 +26,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.browser_ui.widget.ContextMenuDialog;
 import org.chromium.components.embedder_support.contextmenu.ContextMenuParams;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
 import org.chromium.ui.base.MenuSourceType;
@@ -201,7 +202,7 @@
 
         mWebContentsObserver = new WebContentsObserver(mWebContents) {
             @Override
-            public void navigationEntryCommitted() {
+            public void navigationEntryCommitted(LoadCommittedDetails details) {
                 dismissDialog();
             }
         };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
index 083534f4..76872ba6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -39,6 +39,7 @@
 import org.chromium.chrome.browser.tab.TabUtils;
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.NavigationEntry;
@@ -368,7 +369,7 @@
             }
 
             @Override
-            public void navigationEntryCommitted() {
+            public void navigationEntryCommitted(LoadCommittedDetails details) {
                 if (mIsDestroyed) return;
                 // Reset closed state of reader mode in this tab once we know a navigation is
                 // happening.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/NavigationRecorder.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/NavigationRecorder.java
index 95662d2..d5ecb6d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/NavigationRecorder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/NavigationRecorder.java
@@ -13,6 +13,7 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabHidingType;
 import org.chromium.chrome.browser.tab.TabSelectionType;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.WebContents;
@@ -57,7 +58,7 @@
             int startStackIndex = navController.getLastCommittedEntryIndex();
             mWebContentsObserver = new WebContentsObserver() {
                 @Override
-                public void navigationEntryCommitted() {
+                public void navigationEntryCommitted(LoadCommittedDetails details) {
                     if (startStackIndex != navController.getLastCommittedEntryIndex()) return;
                     endRecording(tab, tab.getUrlString());
                 }
diff --git a/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java b/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java
index 09ce2c3..d5d8e81 100644
--- a/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java
+++ b/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java
@@ -18,6 +18,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
 import org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
 import org.chromium.net.ConnectionType;
@@ -122,7 +123,7 @@
             }
 
             @Override
-            public void navigationEntryCommitted() {
+            public void navigationEntryCommitted(LoadCommittedDetails details) {
                 mDismissalCause = DialogDismissalCause.NAVIGATE;
                 unregisterObserverAndDismiss();
             }
diff --git a/components/messages/android/internal/BUILD.gn b/components/messages/android/internal/BUILD.gn
index cb6ded94..896a99e 100644
--- a/components/messages/android/internal/BUILD.gn
+++ b/components/messages/android/internal/BUILD.gn
@@ -30,6 +30,7 @@
   testonly = true
   sources = [
     "java/src/org/chromium/components/messages/MessageQueueManagerTest.java",
+    "java/src/org/chromium/components/messages/ScopeChangeControllerTest.java",
   ]
   deps = [
     ":java",
@@ -42,5 +43,6 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
+    "//ui/android:ui_java",
   ]
 }
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java
index a67f0aa..6a54f7b 100644
--- a/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java
+++ b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeController.java
@@ -5,7 +5,9 @@
 package org.chromium.components.messages;
 
 import org.chromium.components.messages.MessageScopeChange.ChangeType;
-import org.chromium.content_public.browser.NavigationHandle;
+import org.chromium.content_public.browser.LoadCommittedDetails;
+import org.chromium.content_public.browser.NavigationController;
+import org.chromium.content_public.browser.NavigationEntry;
 import org.chromium.content_public.browser.Visibility;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
@@ -71,25 +73,24 @@
             public void wasHidden() {
                 super.wasHidden();
                 mDelegate.onScopeChange(
-                        new MessageScopeChange(scopeType, scopeKey, ChangeType.INACTIVE));
+                        new MessageScopeChange(scopeKey.scopeType, scopeKey, ChangeType.INACTIVE));
             }
 
             @Override
-            public void didFinishNavigation(NavigationHandle navigation) {
-                if (scopeType != MessageScopeType.NAVIGATION) {
+            public void navigationEntryCommitted(LoadCommittedDetails details) {
+                if (scopeKey.scopeType != MessageScopeType.NAVIGATION) {
                     return;
                 }
-                super.didFinishNavigation(navigation);
-                // TODO(crbug.com/1184084): Investigate more on:
-                // 1. whether entry id should be checked to ensure entry id is not changed
-                // 2. whether to set ingore_next_reload_ like infobars to ignore non-user triggered
-                // reload
-                if (!navigation.hasCommitted() || !navigation.isInMainFrame()
-                        || navigation.isSameDocument()) {
+                if (!details.isMainFrame() || details.isSameDocument()
+                        || details.didReplaceEntry()) {
                     return;
                 }
+                super.navigationEntryCommitted(details);
+                NavigationController controller = scopeKey.webContents.getNavigationController();
+                NavigationEntry entry =
+                        controller.getEntryAtIndex(controller.getLastCommittedEntryIndex());
 
-                int transition = navigation.pageTransition();
+                int transition = entry.getTransition();
                 if ((transition & PageTransition.RELOAD) != PageTransition.RELOAD
                         && (transition & PageTransition.IS_REDIRECT_MASK) == 0) {
                     destroy();
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeControllerTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeControllerTest.java
new file mode 100644
index 0000000..d243e5c
--- /dev/null
+++ b/components/messages/android/internal/java/src/org/chromium/components/messages/ScopeChangeControllerTest.java
@@ -0,0 +1,98 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.messages;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.description;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.components.messages.MessageScopeChange.ChangeType;
+import org.chromium.content_public.browser.LoadCommittedDetails;
+import org.chromium.content_public.browser.NavigationController;
+import org.chromium.content_public.browser.NavigationEntry;
+import org.chromium.content_public.browser.WebContentsObserver;
+import org.chromium.content_public.browser.test.mock.MockWebContents;
+import org.chromium.ui.base.PageTransition;
+
+/**
+ * A test for {@link ScopeChangeController}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class ScopeChangeControllerTest {
+    @Test
+    @SmallTest
+    public void testNavigationScopeChange() {
+        ScopeChangeController.Delegate delegate =
+                Mockito.mock(ScopeChangeController.Delegate.class);
+        ScopeChangeController controller = new ScopeChangeController(delegate);
+
+        MockWebContents webContents = mock(MockWebContents.class);
+        NavigationController navigationController = mock(NavigationController.class);
+        NavigationEntry entry = mock(NavigationEntry.class);
+        when(webContents.getNavigationController()).thenReturn(navigationController);
+        when(navigationController.getLastCommittedEntryIndex()).thenReturn(1);
+        when(navigationController.getEntryAtIndex(anyInt())).thenReturn(entry);
+        when(entry.getTransition()).thenReturn(PageTransition.HOME_PAGE);
+
+        ScopeKey key = new ScopeKey(
+                org.chromium.components.messages.MessageScopeType.NAVIGATION, webContents);
+        controller.firstMessageEnqueued(key);
+
+        final ArgumentCaptor<WebContentsObserver> runnableCaptor =
+                ArgumentCaptor.forClass(WebContentsObserver.class);
+        verify(webContents).addObserver(runnableCaptor.capture());
+
+        WebContentsObserver observer = runnableCaptor.getValue();
+
+        // Default visibility of web contents is invisible.
+        ArgumentCaptor<MessageScopeChange> captor =
+                ArgumentCaptor.forClass(MessageScopeChange.class);
+        verify(delegate, description("Delegate should be called when page is hidden"))
+                .onScopeChange(captor.capture());
+        Assert.assertEquals("Scope type should be inactive when page is hidden",
+                ChangeType.INACTIVE, captor.getValue().changeType);
+
+        observer.wasShown();
+        verify(delegate, times(2).description("Delegate should be called when page is shown"))
+                .onScopeChange(captor.capture());
+        Assert.assertEquals("Scope type should be active when page is shown", ChangeType.ACTIVE,
+                captor.getValue().changeType);
+
+        observer.wasHidden();
+        verify(delegate, times(3).description("Delegate should be called when page is hidden"))
+                .onScopeChange(captor.capture());
+        Assert.assertEquals("Scope type should be inactive when page is hidden",
+                ChangeType.INACTIVE, captor.getValue().changeType);
+
+        observer.navigationEntryCommitted(
+                new LoadCommittedDetails(-1, null, true, false, true, -1));
+        verify(delegate,
+                times(3).description("Delegate should not be called when entry is replaced"))
+                .onScopeChange(any());
+
+        observer.navigationEntryCommitted(
+                new LoadCommittedDetails(-1, null, false, false, true, -1));
+
+        verify(delegate,
+                times(4).description(
+                        "Delegate should be called when page is navigated to another page"))
+                .onScopeChange(captor.capture());
+        Assert.assertEquals("Scope type should be destroy when navigated to another page",
+                ChangeType.DESTROY, captor.getValue().changeType);
+    }
+}
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java b/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java
index 11e7914..31b610d 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java
@@ -23,6 +23,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
@@ -277,7 +278,7 @@
             mWebContents = webContents;
             mWebContentsObserver = new WebContentsObserver(mWebContents) {
                 @Override
-                public void navigationEntryCommitted() {
+                public void navigationEntryCommitted(LoadCommittedDetails details) {
                     // If a navigation is committed (e.g. from in-page redirect), the data we're
                     // showing is stale so dismiss the dialog.
                     dismiss(DialogDismissalCause.UNKNOWN);
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
index 0eef62f..e7c4e83 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
@@ -44,6 +44,7 @@
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.components.security_state.SecurityStateModel;
 import org.chromium.components.url_formatter.UrlFormatter;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
 import org.chromium.ui.base.Clipboard;
@@ -328,7 +329,7 @@
 
         mWebContentsObserver = new WebContentsObserver(webContents) {
             @Override
-            public void navigationEntryCommitted() {
+            public void navigationEntryCommitted(LoadCommittedDetails details) {
                 // If a navigation is committed (e.g. from in-page redirect), the data we're showing
                 // is stale so dismiss the dialog.
                 mDialog.dismiss(true);
diff --git a/content/browser/android/web_contents_observer_proxy.cc b/content/browser/android/web_contents_observer_proxy.cc
index c75fc96..e28a0f4d 100644
--- a/content/browser/android/web_contents_observer_proxy.cc
+++ b/content/browser/android/web_contents_observer_proxy.cc
@@ -17,6 +17,7 @@
 #include "content/browser/renderer_host/navigation_request.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
+#include "content/public/android/content_jni_headers/LoadCommittedDetails_jni.h"
 #include "content/public/android/content_jni_headers/WebContentsObserverProxy_jni.h"
 #include "content/public/browser/navigation_details.h"
 #include "content/public/browser/navigation_entry.h"
@@ -193,7 +194,14 @@
 void WebContentsObserverProxy::NavigationEntryCommitted(
     const LoadCommittedDetails& load_details) {
   JNIEnv* env = AttachCurrentThread();
-  Java_WebContentsObserverProxy_navigationEntryCommitted(env, java_observer_);
+  Java_WebContentsObserverProxy_navigationEntryCommitted(
+      env, java_observer_,
+      Java_LoadCommittedDetails_Constructor(
+          env, load_details.previous_entry_index,
+          url::GURLAndroid::FromNativeGURL(
+              env, load_details.previous_main_frame_url),
+          load_details.did_replace_entry, load_details.is_same_document,
+          load_details.is_main_frame, load_details.http_status_code));
 }
 
 void WebContentsObserverProxy::NavigationEntriesDeleted() {
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 713ca60..bed096c 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -331,6 +331,7 @@
     "java/src/org/chromium/content_public/browser/JavaScriptCallback.java",
     "java/src/org/chromium/content_public/browser/JavascriptInjector.java",
     "java/src/org/chromium/content_public/browser/LGEmailActionModeWorkaround.java",
+    "java/src/org/chromium/content_public/browser/LoadCommittedDetails.java",
     "java/src/org/chromium/content_public/browser/LoadUrlParams.java",
     "java/src/org/chromium/content_public/browser/MediaSession.java",
     "java/src/org/chromium/content_public/browser/MediaSessionObserver.java",
@@ -443,6 +444,7 @@
     "java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java",
     "java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java",
     "java/src/org/chromium/content/common/SurfaceWrapper.java",
+    "java/src/org/chromium/content_public/browser/LoadCommittedDetails.java",
     "java/src/org/chromium/content_public/browser/LoadUrlParams.java",
     "java/src/org/chromium/content_public/browser/NavigationHandle.java",
     "java/src/org/chromium/content_public/common/ResourceRequestBody.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
index 7d54ac5..c827518 100644
--- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
@@ -10,6 +10,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
+import org.chromium.content_public.browser.LoadCommittedDetails;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContentsObserver;
 import org.chromium.ui.base.WindowAndroid;
@@ -218,9 +219,9 @@
 
     @Override
     @CalledByNative
-    public void navigationEntryCommitted() {
+    public void navigationEntryCommitted(LoadCommittedDetails details) {
         for (mObserversIterator.rewind(); mObserversIterator.hasNext();) {
-            mObserversIterator.next().navigationEntryCommitted();
+            mObserversIterator.next().navigationEntryCommitted(details);
         }
     }
 
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/LoadCommittedDetails.java b/content/public/android/java/src/org/chromium/content_public/browser/LoadCommittedDetails.java
new file mode 100644
index 0000000..b77c5e92
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content_public/browser/LoadCommittedDetails.java
@@ -0,0 +1,59 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content_public.browser;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.url.GURL;
+
+/**
+ * Provides the details of a committed navigation entry for the
+ * {@link WebContentsObserver#navigationEntryCommitted(LoadCommittedDetails)}.
+ */
+@JNINamespace("content")
+public class LoadCommittedDetails {
+    private final boolean mDidReplaceEntry;
+    private final int mPreviousEntryIndex;
+    private final GURL mPreviousMainFrameUrl;
+    private final boolean mIsSameDocument;
+    private final boolean mIsMainFrame;
+    private final int mHttpStatusCode;
+
+    @CalledByNative
+    public LoadCommittedDetails(int previousEntryIndex, GURL previousMainFrameUrl,
+            boolean didReplaceEntry, boolean isSameDocument, boolean isMainFrame,
+            int httpStatusCode) {
+        mPreviousEntryIndex = previousEntryIndex;
+        mPreviousMainFrameUrl = previousMainFrameUrl;
+        mDidReplaceEntry = didReplaceEntry;
+        mIsSameDocument = isSameDocument;
+        mIsMainFrame = isMainFrame;
+        mHttpStatusCode = httpStatusCode;
+    }
+
+    public boolean didReplaceEntry() {
+        return mDidReplaceEntry;
+    }
+
+    public int getPreviousEntryIndex() {
+        return mPreviousEntryIndex;
+    }
+
+    public GURL getPreviousMainFrameUrl() {
+        return mPreviousMainFrameUrl;
+    }
+
+    public boolean isSameDocument() {
+        return mIsSameDocument;
+    }
+
+    public boolean isMainFrame() {
+        return mIsMainFrame;
+    }
+
+    public int getHttpStatusCode() {
+        return mHttpStatusCode;
+    }
+}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java
index 2473b365..d9e6161 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java
@@ -162,8 +162,9 @@
 
     /**
      * Notifies that a navigation entry has been committed.
+     * @param details Details of committed navigation entry.
      */
-    public void navigationEntryCommitted() {}
+    public void navigationEntryCommitted(LoadCommittedDetails details) {}
 
     /**
      * Called when navigation entries were removed.