Commit 8151f1dd authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

Android: TabWebContentsUserData

Tab is managing numerous classes used for the active WebContents
it is showing. This CL defines a TabWebContentsUserData that they
can inherit from. New interface initWebContents/cleanupWebContents
are to be defined by child classes.

It is first applied to TabGestureStateListener. The other classes
will follow.

Bug: 884597
Change-Id: I7d31b5a2d4c64aef49697fb0bbe8e3db4e3b2443
Reviewed-on: https://chromium-review.googlesource.com/c/1229734
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#596515}
parent 1062eb7a
...@@ -1781,7 +1781,7 @@ public class Tab ...@@ -1781,7 +1781,7 @@ public class Tab
new TabContextMenuPopulator( new TabContextMenuPopulator(
mDelegateFactory.createContextMenuPopulator(this), this)); mDelegateFactory.createContextMenuPopulator(this), this));
TabGestureStateListener.init(this); TabGestureStateListener.create(this, this::getFullscreenManager);
// The InfoBarContainer needs to be created after the ContentView has been natively // The InfoBarContainer needs to be created after the ContentView has been natively
// initialized. // initialized.
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
package org.chromium.chrome.browser.tab; package org.chromium.chrome.browser.tab;
import org.chromium.base.UserData; import org.chromium.base.Supplier;
import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.content_public.browser.GestureListenerManager; import org.chromium.content_public.browser.GestureListenerManager;
import org.chromium.content_public.browser.GestureStateListener; import org.chromium.content_public.browser.GestureStateListener;
...@@ -13,91 +13,75 @@ import org.chromium.content_public.browser.WebContents; ...@@ -13,91 +13,75 @@ import org.chromium.content_public.browser.WebContents;
/** /**
* {@link GestureStateListener} implementation for a {@link Tab}. Associated with an active * {@link GestureStateListener} implementation for a {@link Tab}. Associated with an active
* {@link WebContents} via its {@link GestureListenerManager}. The listener is managed as * {@link WebContents} via its {@link GestureListenerManager}. The listener is managed as
* UserData and added to (or removed from) the active WebContents. * UserData for the Tab, with WebContents updated as the active one changes over time.
*/ */
public final class TabGestureStateListener public final class TabGestureStateListener extends TabWebContentsUserData {
extends EmptyTabObserver implements GestureStateListener, UserData {
private static final Class<TabGestureStateListener> USER_DATA_KEY = private static final Class<TabGestureStateListener> USER_DATA_KEY =
TabGestureStateListener.class; TabGestureStateListener.class;
private final Tab mTab; private GestureStateListener mGestureListener;
private WebContents mWebContents; private Supplier<FullscreenManager> mFullscreenManager;
/** /**
* Initializes (creates if not present) TabGestureStateListener by adding it to * Creates TabGestureStateListener and lets the WebContentsUserData of the Tab manage it.
* {@link GestureListenerManager} of the active {@link WebContents}.
* @param tab Tab instance that the active WebContents instance gets loaded in. * @param tab Tab instance that the active WebContents instance gets loaded in.
*/ */
public static void init(Tab tab) { public static void create(Tab tab, Supplier<FullscreenManager> fullscreen) {
TabGestureStateListener listener = tab.getUserDataHost().getUserData(USER_DATA_KEY); tab.getUserDataHost().setUserData(
if (listener == null) { USER_DATA_KEY, new TabGestureStateListener(tab, fullscreen));
listener = tab.getUserDataHost().setUserData(
USER_DATA_KEY, new TabGestureStateListener(tab));
}
listener.init();
} }
private TabGestureStateListener(Tab tab) { private TabGestureStateListener(Tab tab, Supplier<FullscreenManager> fullscreenManager) {
mTab = tab; super(tab);
} mFullscreenManager = fullscreenManager;
private void init() {
WebContents newWebContents = mTab.getWebContents();
if (newWebContents == mWebContents) return;
if (mWebContents != null) removeFromManager();
if (newWebContents != null) {
GestureListenerManager.fromWebContents(newWebContents).addListener(this);
}
mWebContents = newWebContents;
}
// TabObserver
@Override
public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) {
init();
} }
@Override @Override
public void onDestroyed(Tab tab) { public void initWebContents(WebContents webContents) {
removeFromManager(); GestureListenerManager manager = GestureListenerManager.fromWebContents(webContents);
} mGestureListener = new GestureStateListener() {
@Override
private void removeFromManager() { public void onFlingStartGesture(int scrollOffsetY, int scrollExtentY) {
GestureListenerManager manager = GestureListenerManager.fromWebContents(mWebContents); onScrollingStateChanged();
if (manager != null) manager.removeListener(this); }
@Override
public void onFlingEndGesture(int scrollOffsetY, int scrollExtentY) {
onScrollingStateChanged();
}
@Override
public void onScrollStarted(int scrollOffsetY, int scrollExtentY) {
onScrollingStateChanged();
}
@Override
public void onScrollEnded(int scrollOffsetY, int scrollExtentY) {
onScrollingStateChanged();
}
private void onScrollingStateChanged() {
FullscreenManager fullscreenManager = mFullscreenManager.get();
if (fullscreenManager == null) return;
fullscreenManager.onContentViewScrollingStateChanged(isScrollInProgress());
}
private boolean isScrollInProgress() {
return manager != null ? manager.isScrollInProgress() : false;
}
};
manager.addListener(mGestureListener);
} }
// GestureStateListener
@Override @Override
public void onFlingStartGesture(int scrollOffsetY, int scrollExtentY) { public void cleanupWebContents(WebContents webContents) {
onScrollingStateChanged(); GestureListenerManager manager = GestureListenerManager.fromWebContents(webContents);
if (manager != null) manager.removeListener(mGestureListener);
mGestureListener = null;
} }
@Override @Override
public void onFlingEndGesture(int scrollOffsetY, int scrollExtentY) { public void destroy() {
onScrollingStateChanged(); cleanupWebContents(getWebContents());
}
@Override
public void onScrollStarted(int scrollOffsetY, int scrollExtentY) {
onScrollingStateChanged();
}
@Override
public void onScrollEnded(int scrollOffsetY, int scrollExtentY) {
onScrollingStateChanged();
}
private void onScrollingStateChanged() {
FullscreenManager fullscreenManager = mTab.getFullscreenManager();
if (fullscreenManager == null) return;
fullscreenManager.onContentViewScrollingStateChanged(isScrollInProgress());
}
private boolean isScrollInProgress() {
GestureListenerManager manager = GestureListenerManager.fromWebContents(mWebContents);
return manager != null ? manager.isScrollInProgress() : false;
} }
} }
// Copyright 2018 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.chrome.browser.tab;
import org.chromium.base.UserData;
import org.chromium.content_public.browser.WebContents;
/**
* UserData for a {@link Tab}. Used for a {@link WebContents} while it stays
* active for the Tab.
*/
public abstract class TabWebContentsUserData implements UserData {
private WebContents mWebContents;
public TabWebContentsUserData(Tab tab) {
tab.addObserver(new EmptyTabObserver() {
@Override
public void onContentChanged(Tab tab) {
if (mWebContents == tab.getWebContents()) return;
if (mWebContents != null) cleanupWebContents(mWebContents);
mWebContents = tab.getWebContents();
if (mWebContents != null) initWebContents(mWebContents);
}
@Override
public void onDestroyed(Tab tab) {
tab.removeObserver(this);
}
});
}
protected WebContents getWebContents() {
return mWebContents;
}
/**
* Called when {@link WebContents} becomes active (swapped in) for a {@link Tab}.
* @param webContents WebContents object that just became active.
*/
public abstract void initWebContents(WebContents webContents);
/**
* Called when {@link WebContents} gets swapped out.
* @param webContents WebContents object that just became inactive.
*/
public abstract void cleanupWebContents(WebContents webContents);
}
...@@ -1452,6 +1452,7 @@ chrome_java_sources = [ ...@@ -1452,6 +1452,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java", "java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java", "java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java", "java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java",
"java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java",
"java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java", "java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParams.java",
"java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java", "java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java",
"java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java", "java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment