Chromium Code Reviews| 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 |
|
Ted C
2017/05/19 23:19:07
per some offline discussion, infobars "should" del
mdjones
2017/05/22 21:11:02
Done.
|
| + 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); |
| } |