Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java |
index 23e115f2a52abf5b5c1cba05939f8efc06fbd396..619b0e1dc4d2821df067bd502e03913b58d7c926 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java |
@@ -12,8 +12,12 @@ import android.widget.TextView; |
import org.chromium.base.ApiCompatibilityUtils; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; |
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason; |
import org.chromium.chrome.browser.dom_distiller.ReaderModeManager; |
import org.chromium.chrome.browser.tab.Tab; |
+import org.chromium.content_public.browser.WebContents; |
+import org.chromium.content_public.browser.WebContentsObserver; |
/** |
* This is the InfoBar implementation of the Reader Mode UI. This is used in place of the |
@@ -23,6 +27,12 @@ public class ReaderModeInfoBar extends InfoBar { |
/** A handle to the {@link ReaderModeManager} to trigger page navigations. */ |
private static ReaderModeManager sManager; |
+ /** A {@link WebContentsObserver} to watch for page navigations. */ |
+ private WebContentsObserver mWebContentsObserver; |
+ |
+ /** The {@link WebContents} that this infobar is operating on. */ |
+ private WebContents mWebContents; |
+ |
/** |
* Default constructor. |
*/ |
@@ -46,20 +56,53 @@ public class ReaderModeInfoBar extends InfoBar { |
ApiCompatibilityUtils.getColor(layout.getResources(), R.color.default_text_color)); |
prompt.setGravity(Gravity.CENTER_VERTICAL); |
+ mWebContentsObserver = new WebContentsObserver() { |
+ @Override |
+ public void didStartNavigation(String url, boolean isInMainFrame, |
+ boolean isSameDocument, boolean isErrorPage) { |
+ if (!isInMainFrame) return; |
+ |
+ // If a navigation was triggered close this infobar. |
+ nativeHide(getNativeInfoBarPtr()); |
+ destroyWebContentsObserver(); |
+ } |
+ }; |
+ |
+ mWebContents = sManager.getBasePageWebContents(); |
+ sManager.getBasePageWebContents().addObserver(mWebContentsObserver); |
+ |
prompt.setOnClickListener(new View.OnClickListener() { |
@Override |
public void onClick(View v) { |
- // TODO(mdjones): Trigger navigation from manager. |
+ destroyWebContentsObserver(); |
+ sManager.navigateToReaderMode(); |
} |
}); |
layout.addContent(prompt, 1f); |
} |
+ @Override |
public void onCloseButtonClicked() { |
super.onCloseButtonClicked(); |
+ destroyWebContentsObserver(); |
+ sManager.onClosed(StateChangeReason.CLOSE_BUTTON); |
+ } |
+ |
+ /** |
+ * Detach and null the infobar's web contents observer. |
+ */ |
+ private void destroyWebContentsObserver() { |
+ if (mWebContentsObserver == null) return; |
- // TODO(mdjones): Notifiy the manager that the infobar was closed. |
+ mWebContents.removeObserver(mWebContentsObserver); |
+ mWebContentsObserver = null; |
+ } |
+ |
+ @Override |
+ protected void onNativeDestroyed() { |
+ super.onNativeDestroyed(); |
+ destroyWebContentsObserver(); |
} |
/** |
@@ -81,4 +124,5 @@ public class ReaderModeInfoBar extends InfoBar { |
} |
private static native void nativeCreate(Tab tab); |
+ private native void nativeHide(long nativeReaderModeInfoBar); |
} |