Commit 1d47eec0 authored by Ted Choc's avatar Ted Choc Committed by Commit Bot

Split tab browser controls offset and constraint handling.

BUG=966272

Change-Id: I627f2137adb00a7acd312012d53d57050861426f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1935288Reviewed-by: default avatarJinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Commit-Queue: Ted Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#719192}
parent 830c5b00
......@@ -2726,7 +2726,7 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java",
"java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsState.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java",
"java/src/org/chromium/chrome/browser/tab/TabFavicon.java",
"java/src/org/chromium/chrome/browser/tab/TabImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabState.java",
......
......@@ -1562,7 +1562,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributeKeys.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributes.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsState.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java",
"java/src/org/chromium/chrome/browser/tab/TabBuilder.java",
"java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java",
"java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java",
......
......@@ -12,9 +12,9 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/DelayedScreenLockIntentHandlerTest.java",
"junit/src/org/chromium/chrome/browser/InsetObserverViewTest.java",
"junit/src/org/chromium/chrome/browser/IntentHeadersRecorderTest.java",
"junit/src/org/chromium/chrome/browser/SSLClientCertificateRequestTest.java",
"junit/src/org/chromium/chrome/browser/ShadowDeviceConditions.java",
"junit/src/org/chromium/chrome/browser/ShortcutHelperTest.java",
"junit/src/org/chromium/chrome/browser/SSLClientCertificateRequestTest.java",
"junit/src/org/chromium/chrome/browser/autofill/AutofillUiUtilsTest.java",
"junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java",
"junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskTest.java",
......@@ -30,11 +30,11 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/NotificationChannelPreserverTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/permissiondelegation/NotificationPermissionUpdaterTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/ClientAppDataRecorderTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/CurrentPageVerifierTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TestVerifier.java",
"junit/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityDisclosureControllerTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityOpenTimeRecorderTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TwaVerifierTest.java",
"junit/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/CurrentPageVerifierTest.java",
"junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java",
"junit/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimationHandlerTest.java",
"junit/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimatorTest.java",
......@@ -197,6 +197,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/suggestions/tile/TileGroupUnitTest.java",
"junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerTest.java",
"junit/src/org/chromium/chrome/browser/tab/TabAttributesTest.java",
"junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelperTest.java",
"junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java",
"junit/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java",
"junit/src/org/chromium/chrome/browser/tabstate/TabStateUnitTest.java",
......@@ -221,8 +222,8 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogViewTest.java",
"junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediatorTest.java",
"junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinderTest.java",
"junit/src/org/chromium/chrome/browser/webshare/SharedFileCollatorTest.java",
"junit/src/org/chromium/chrome/browser/webshare/ShareServiceImplTest.java",
"junit/src/org/chromium/chrome/browser/webshare/SharedFileCollatorTest.java",
"junit/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetectorTest.java",
"junit/src/org/chromium/chrome/browser/widget/selection/SelectionDelegateTest.java",
]
......@@ -44,7 +44,7 @@ import org.chromium.chrome.browser.page_info.PageInfoController;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabAssociatedApp;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.tab.TabRedirectHandler;
import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
......@@ -477,7 +477,7 @@ public class VrShell extends GvrLayout
if (mTab != null) {
initializeTabForVR();
mTab.addObserver(mTabObserver);
TabBrowserControlsState.update(mTab, BrowserControlsState.HIDDEN, false);
TabBrowserControlsConstraintsHelper.update(mTab, BrowserControlsState.HIDDEN, false);
}
mTabObserver.onContentChanged(mTab);
}
......@@ -798,7 +798,7 @@ public class VrShell extends GvrLayout
View parent = mTab.getContentView();
mTab.getWebContents().setSize(parent.getWidth(), parent.getHeight());
}
TabBrowserControlsState.update(mTab, BrowserControlsState.SHOWN, false);
TabBrowserControlsConstraintsHelper.update(mTab, BrowserControlsState.SHOWN, false);
}
mContentVirtualDisplay.destroy();
......
......@@ -134,7 +134,7 @@ import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
import org.chromium.chrome.browser.sync.ProfileSyncService;
import org.chromium.chrome.browser.sync.SyncController;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tabmodel.AsyncTabParamsManager;
......@@ -831,7 +831,7 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
// When resuming the activity, force an update to the fullscreen state to ensure a
// subactivity did not change the fullscreen configuration of this ChromeTab's
// renderer in the case where it was shared.
TabBrowserControlsState.updateEnabledState(tab);
TabBrowserControlsConstraintsHelper.updateEnabledState(tab);
}
VrModuleProvider.getDelegate().onActivityShown(this);
} else {
......
......@@ -30,7 +30,7 @@ import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirectio
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.content_public.browser.SelectionPopupController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.common.BrowserControlsState;
......@@ -513,7 +513,7 @@ public class OverlayPanel extends OverlayPanelAnimation implements ActivityState
* should jump immediately.
*/
public void updateBrowserControlsState(int current, boolean animate) {
TabBrowserControlsState.update(mActivity.getActivityTab(), current, animate);
TabBrowserControlsConstraintsHelper.update(mActivity.getActivityTab(), current, animate);
}
/**
......
......@@ -39,7 +39,7 @@ import org.chromium.chrome.browser.native_page.NativePageFactory;
import org.chromium.chrome.browser.tab.SadTab;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.Tab.TabHidingType;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.browser.tab.TabThemeColorHelper;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
......@@ -514,7 +514,8 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
@Override
public void releaseOverlayPanelContent() {
if (getTabModelSelector() == null) return;
TabBrowserControlsState.updateEnabledState(getTabModelSelector().getCurrentTab());
TabBrowserControlsConstraintsHelper.updateEnabledState(
getTabModelSelector().getCurrentTab());
}
/**
......
......@@ -9,7 +9,7 @@ import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.tab.BrowserControlsVisibilityDelegate;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.content_public.common.BrowserControlsState;
import javax.inject.Inject;
......@@ -60,6 +60,6 @@ public class CustomTabBrowserControlsVisibilityDelegate
}
private void updateActiveTabFullscreenEnabledState() {
TabBrowserControlsState.updateEnabledState(mTabProvider.get());
TabBrowserControlsConstraintsHelper.updateEnabledState(mTabProvider.get());
}
}
......@@ -33,7 +33,8 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.Tab.TabHidingType;
import org.chromium.chrome.browser.tab.TabAttributeKeys;
import org.chromium.chrome.browser.tab.TabAttributes;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabBrowserControlsOffsetHelper;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.browser.tabmodel.TabModelImpl;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
......@@ -208,7 +209,7 @@ public class ChromeFullscreenManager extends FullscreenManager
@Override
public void run() {
if (getTab() != null) {
TabBrowserControlsState.updateEnabledState(getTab());
TabBrowserControlsConstraintsHelper.updateEnabledState(getTab());
} else if (!mBrowserVisibilityDelegate.canAutoHideBrowserControls()) {
setPositionsForTabToNonFullscreen();
}
......@@ -449,7 +450,7 @@ public class ChromeFullscreenManager extends FullscreenManager
// We should hide browser controls first.
mPendingFullscreenOptions = options;
mIsEnteringPersistentModeState = true;
TabBrowserControlsState.updateEnabledState(tab);
TabBrowserControlsConstraintsHelper.updateEnabledState(tab);
}
}
......@@ -465,7 +466,7 @@ public class ChromeFullscreenManager extends FullscreenManager
public void onFullscreenExited(Tab tab) {
// At this point, browser controls are hidden. Show browser controls only if it's
// permitted.
TabBrowserControlsState.update(tab, BrowserControlsState.SHOWN, true);
TabBrowserControlsConstraintsHelper.update(tab, BrowserControlsState.SHOWN, true);
}
@Override
......@@ -617,8 +618,8 @@ public class ChromeFullscreenManager extends FullscreenManager
if (mInGesture || mContentViewScrolling) return;
// Update content viewport size only when the browser controls are not animating.
int topContentOffset = (int) mRendererTopContentOffset;
int bottomControlOffset = (int) mRendererBottomControlOffset;
int topContentOffset = mRendererTopContentOffset;
int bottomControlOffset = mRendererBottomControlOffset;
if ((topContentOffset != 0 && topContentOffset != getTopControlsHeight())
&& bottomControlOffset != 0 && bottomControlOffset != getBottomControlsHeight()) {
return;
......@@ -811,7 +812,7 @@ public class ChromeFullscreenManager extends FullscreenManager
@Override
public void setPositionsForTabToNonFullscreen() {
Tab tab = getTab();
if (tab == null || TabBrowserControlsState.get(tab).canShow()) {
if (tab == null || TabBrowserControlsConstraintsHelper.get(tab).canShow()) {
setPositionsForTab(0, 0, getTopControlsHeight());
} else {
setPositionsForTab(-getTopControlsHeight(), getBottomControlsHeight(), 0);
......@@ -910,14 +911,14 @@ public class ChromeFullscreenManager extends FullscreenManager
// Make sure the dominant control offsets have been set.
Tab tab = getTab();
TabBrowserControlsState controlState = TabBrowserControlsState.get(tab);
if (controlState.offsetInitialized()) {
updateFullscreenManagerOffsets(false, controlState.topControlsOffset(),
controlState.bottomControlsOffset(), controlState.contentOffset());
TabBrowserControlsOffsetHelper offsetHelper = TabBrowserControlsOffsetHelper.get(tab);
if (offsetHelper.offsetInitialized()) {
updateFullscreenManagerOffsets(false, offsetHelper.topControlsOffset(),
offsetHelper.bottomControlsOffset(), offsetHelper.contentOffset());
} else {
showAndroidControls(false);
}
TabBrowserControlsState.updateEnabledState(tab);
TabBrowserControlsConstraintsHelper.updateEnabledState(tab);
}
/**
......@@ -973,7 +974,8 @@ public class ChromeFullscreenManager extends FullscreenManager
private void runBrowserDrivenShowAnimation() {
if (mControlsAnimator != null) return;
TabBrowserControlsState controlState = TabBrowserControlsState.get(getTab());
TabBrowserControlsConstraintsHelper controlState =
TabBrowserControlsConstraintsHelper.get(getTab());
setOffsetOverridden(true);
final float hiddenRatio = getBrowserControlHiddenRatio();
......
......@@ -11,7 +11,7 @@ import androidx.annotation.Nullable;
import org.chromium.chrome.browser.fullscreen.FullscreenHtmlApiHandler.FullscreenHtmlApiDelegate;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.content_public.browser.GestureListenerManager;
import org.chromium.content_public.browser.WebContents;
......@@ -138,7 +138,7 @@ public abstract class FullscreenManager {
*/
protected void enterPersistentFullscreenMode(FullscreenOptions options) {
mHtmlApiHandler.enterPersistentFullscreenMode(options);
TabBrowserControlsState.updateEnabledState(getTab());
TabBrowserControlsConstraintsHelper.updateEnabledState(getTab());
updateMultiTouchZoomSupport(false);
}
......@@ -148,7 +148,7 @@ public abstract class FullscreenManager {
*/
public void exitPersistentFullscreenMode() {
mHtmlApiHandler.exitPersistentFullscreenMode();
TabBrowserControlsState.updateEnabledState(getTab());
TabBrowserControlsConstraintsHelper.updateEnabledState(getTab());
updateMultiTouchZoomSupport(true);
}
......
......@@ -27,7 +27,7 @@ import org.chromium.chrome.browser.omnibox.LocationBar;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabAttributeKeys;
import org.chromium.chrome.browser.tab.TabAttributes;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.content_public.browser.SelectionPopupController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.common.BrowserControlsState;
......@@ -358,7 +358,7 @@ public class TabModalPresenter
if (isShowing && areRendererInputEventsIgnored()) {
mChromeFullscreenManager.showAndroidControls(true);
} else {
TabBrowserControlsState.update(mActiveTab, BrowserControlsState.SHOWN,
TabBrowserControlsConstraintsHelper.update(mActiveTab, BrowserControlsState.SHOWN,
!mChromeFullscreenManager.offsetOverridden());
}
}
......
......@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.tab;
import org.chromium.base.ObserverList.RewindableIterator;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.content_public.browser.ImeAdapter;
import org.chromium.content_public.browser.ImeEventObserver;
......@@ -14,26 +13,21 @@ import org.chromium.content_public.common.BrowserControlsState;
/**
* Manages the state of tab browser controls.
*/
public class TabBrowserControlsState extends TabWebContentsUserData implements ImeEventObserver {
private static final Class<TabBrowserControlsState> USER_DATA_KEY =
TabBrowserControlsState.class;
public class TabBrowserControlsConstraintsHelper
extends TabWebContentsUserData implements ImeEventObserver {
private static final Class<TabBrowserControlsConstraintsHelper> USER_DATA_KEY =
TabBrowserControlsConstraintsHelper.class;
private final TabImpl mTab;
private long mNativeTabBrowserControlsState; // Lazily initialized in |update|
private long mNativeTabBrowserControlsConstraintsHelper; // Lazily initialized in |update|
private BrowserControlsVisibilityDelegate mVisibilityDelegate;
private int mTopControlsOffset;
private int mBottomControlsOffset;
private int mContentOffset;
/** {@code true} if offset was changed by compositor. */
private boolean mOffsetInitialized;
public static void createForTab(Tab tab) {
tab.getUserDataHost().setUserData(USER_DATA_KEY, new TabBrowserControlsState(tab));
tab.getUserDataHost().setUserData(
USER_DATA_KEY, new TabBrowserControlsConstraintsHelper(tab));
}
public static TabBrowserControlsState get(Tab tab) {
public static TabBrowserControlsConstraintsHelper get(Tab tab) {
return tab.getUserDataHost().getUserData(USER_DATA_KEY);
}
......@@ -75,7 +69,7 @@ public class TabBrowserControlsState extends TabWebContentsUserData implements I
}
/** Constructor */
private TabBrowserControlsState(Tab tab) {
private TabBrowserControlsConstraintsHelper(Tab tab) {
super(tab);
mTab = (TabImpl) tab;
mTab.addObserver(new EmptyTabObserver() {
......@@ -113,14 +107,6 @@ public class TabBrowserControlsState extends TabWebContentsUserData implements I
updateEnabledState();
}
@Override
public void onCrash(Tab tab) {
mTopControlsOffset = 0;
mBottomControlsOffset = 0;
mContentOffset = 0;
mOffsetInitialized = false;
}
@Override
public void onDestroyed(Tab tab) {
tab.removeObserver(this);
......@@ -128,40 +114,12 @@ public class TabBrowserControlsState extends TabWebContentsUserData implements I
});
}
/**
* Sets new top control and content offset from renderer.
* @param topControlsOffset Top control offset.
* @param contentOffset Content offset.
*/
void setTopOffset(int topControlsOffset, int contentOffset) {
mTopControlsOffset = topControlsOffset;
mContentOffset = contentOffset;
notifyControlsOffsetChanged();
}
/**
* Sets new bottom control offset from renderer.
* @param bottomControlsOffset Bottom control offset.
*/
void setBottomOffset(int bottomControlsOffset) {
mBottomControlsOffset = bottomControlsOffset;
notifyControlsOffsetChanged();
}
private void notifyControlsOffsetChanged() {
mOffsetInitialized = true;
RewindableIterator<TabObserver> observers = mTab.getTabObservers();
while (observers.hasNext()) {
observers.next().onBrowserControlsOffsetChanged(
mTab, mTopControlsOffset, mBottomControlsOffset, mContentOffset);
}
}
@Override
public void destroyInternal() {
if (mNativeTabBrowserControlsState != 0) {
TabBrowserControlsStateJni.get().onDestroyed(
mNativeTabBrowserControlsState, TabBrowserControlsState.this);
if (mNativeTabBrowserControlsConstraintsHelper != 0) {
TabBrowserControlsConstraintsHelperJni.get().onDestroyed(
mNativeTabBrowserControlsConstraintsHelper,
TabBrowserControlsConstraintsHelper.this);
}
}
......@@ -197,12 +155,15 @@ public class TabBrowserControlsState extends TabWebContentsUserData implements I
&& current == BrowserControlsState.HIDDEN)) {
return;
}
if (mNativeTabBrowserControlsState == 0) {
mNativeTabBrowserControlsState =
TabBrowserControlsStateJni.get().init(TabBrowserControlsState.this);
if (mNativeTabBrowserControlsConstraintsHelper == 0) {
mNativeTabBrowserControlsConstraintsHelper =
TabBrowserControlsConstraintsHelperJni.get().init(
TabBrowserControlsConstraintsHelper.this);
}
TabBrowserControlsStateJni.get().updateState(mNativeTabBrowserControlsState,
TabBrowserControlsState.this, mTab.getWebContents(), constraints, current, animate);
TabBrowserControlsConstraintsHelperJni.get().updateState(
mNativeTabBrowserControlsConstraintsHelper,
TabBrowserControlsConstraintsHelper.this, mTab.getWebContents(), constraints,
current, animate);
}
/**
......@@ -231,26 +192,6 @@ public class TabBrowserControlsState extends TabWebContentsUserData implements I
return constraints;
}
/** @return Top control offset */
public int topControlsOffset() {
return mTopControlsOffset;
}
/** @return Bottom control offset */
public int bottomControlsOffset() {
return mBottomControlsOffset;
}
/** @return content offset */
public int contentOffset() {
return mContentOffset;
}
/** @return Whether the control offset is initialized by compositor. */
public boolean offsetInitialized() {
return mOffsetInitialized;
}
// ImeEventObserver
@Override
......@@ -261,9 +202,11 @@ public class TabBrowserControlsState extends TabWebContentsUserData implements I
@NativeMethods
interface Natives {
long init(TabBrowserControlsState caller);
void onDestroyed(long nativeTabBrowserControlsState, TabBrowserControlsState caller);
void updateState(long nativeTabBrowserControlsState, TabBrowserControlsState caller,
WebContents webContents, int contraints, int current, boolean animate);
long init(TabBrowserControlsConstraintsHelper caller);
void onDestroyed(long nativeTabBrowserControlsConstraintsHelper,
TabBrowserControlsConstraintsHelper caller);
void updateState(long nativeTabBrowserControlsConstraintsHelper,
TabBrowserControlsConstraintsHelper caller, WebContents webContents, int contraints,
int current, boolean animate);
}
}
// Copyright 2019 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 androidx.annotation.NonNull;
import org.chromium.base.ObserverList.RewindableIterator;
import org.chromium.base.UserData;
/**
* Helper that coordinates the browser controls offsets from the perspective of a particular Tab.
*/
public class TabBrowserControlsOffsetHelper extends EmptyTabObserver implements UserData {
private static final Class<TabBrowserControlsOffsetHelper> USER_DATA_KEY =
TabBrowserControlsOffsetHelper.class;
private final TabImpl mTab;
private int mTopControlsOffset;
private int mBottomControlsOffset;
private int mContentOffset;
/** {@code true} if offset was changed by compositor. */
private boolean mOffsetInitialized;
/**
* Get (or lazily create) the offset helper for a particular Tab.
* @param tab The tab whose helper is being retrieved.
* @return The offset helper for a given tab.
*/
@NonNull
public static TabBrowserControlsOffsetHelper get(Tab tab) {
TabBrowserControlsOffsetHelper helper = tab.getUserDataHost().getUserData(USER_DATA_KEY);
if (helper == null) {
helper = new TabBrowserControlsOffsetHelper(tab);
tab.getUserDataHost().setUserData(USER_DATA_KEY, helper);
}
return helper;
}
private TabBrowserControlsOffsetHelper(Tab tab) {
mTab = (TabImpl) tab;
tab.addObserver(this);
}
/**
* Sets new top control and content offset from renderer.
* @param topControlsOffset Top control offset.
* @param contentOffset Content offset.
*/
void setTopOffset(int topControlsOffset, int contentOffset) {
if (mOffsetInitialized && topControlsOffset == mTopControlsOffset
&& mContentOffset == contentOffset) {
return;
}
mTopControlsOffset = topControlsOffset;
mContentOffset = contentOffset;
notifyControlsOffsetChanged();
}
/**
* Sets new bottom control offset from renderer.
* @param bottomControlsOffset Bottom control offset.
*/
void setBottomOffset(int bottomControlsOffset) {
if (mOffsetInitialized && mBottomControlsOffset == bottomControlsOffset) return;
mBottomControlsOffset = bottomControlsOffset;
notifyControlsOffsetChanged();
}
private void notifyControlsOffsetChanged() {
mOffsetInitialized = true;
RewindableIterator<TabObserver> observers = mTab.getTabObservers();
while (observers.hasNext()) {
observers.next().onBrowserControlsOffsetChanged(
mTab, mTopControlsOffset, mBottomControlsOffset, mContentOffset);
}
}
@Override
public void onCrash(Tab tab) {
super.onCrash(tab);
mTopControlsOffset = 0;
mBottomControlsOffset = 0;
mContentOffset = 0;
mOffsetInitialized = false;
}
/** @return Top control offset */
public int topControlsOffset() {
return mTopControlsOffset;
}
/** @return Bottom control offset */
public int bottomControlsOffset() {
return mBottomControlsOffset;
}
/** @return content offset */
public int contentOffset() {
return mContentOffset;
}
/** @return Whether the control offset is initialized by compositor. */
public boolean offsetInitialized() {
return mOffsetInitialized;
}
}
......@@ -43,7 +43,7 @@ public final class TabHelpers {
}
MediaSessionTabHelper.createForTab(tab);
TaskTabHelper.createForTab(tab, parentTab);
TabBrowserControlsState.createForTab(tab);
TabBrowserControlsConstraintsHelper.createForTab(tab);
// TODO(jinsukkim): Do this by having something observe new tab creation.
if (tab.isIncognito()) CipherFactory.getInstance().triggerKeyGeneration();
......
......@@ -63,7 +63,7 @@ public class TabStateBrowserControlsVisibilityDelegate
if (!mIsFullscreenWaitingForLoad) return;
mIsFullscreenWaitingForLoad = false;
TabBrowserControlsState.updateEnabledState(mTab);
TabBrowserControlsConstraintsHelper.updateEnabledState(mTab);
}
private void cancelEnableFullscreenLoadDelay() {
......@@ -94,13 +94,13 @@ public class TabStateBrowserControlsVisibilityDelegate
mHandler.removeMessages(MSG_ID_ENABLE_FULLSCREEN_AFTER_LOAD);
mHandler.sendEmptyMessageDelayed(
MSG_ID_ENABLE_FULLSCREEN_AFTER_LOAD, getLoadDelayMs());
TabBrowserControlsState.updateEnabledState(mTab);
TabBrowserControlsConstraintsHelper.updateEnabledState(mTab);
}
@Override
public void onPageLoadStarted(Tab tab, String url) {
mIsFullscreenWaitingForLoad = !DomDistillerUrlUtils.isDistilledPage(url);
TabBrowserControlsState.updateEnabledState(mTab);
TabBrowserControlsConstraintsHelper.updateEnabledState(mTab);
}
@Override
......@@ -108,13 +108,13 @@ public class TabStateBrowserControlsVisibilityDelegate
// Handle the case where a commit or prerender swap notification failed to arrive
// and the enable fullscreen message was never enqueued.
scheduleEnableFullscreenLoadDelayIfNecessary();
TabBrowserControlsState.updateEnabledState(mTab);
TabBrowserControlsConstraintsHelper.updateEnabledState(mTab);
}
@Override
public void onPageLoadFailed(Tab tab, int errorCode) {
cancelEnableFullscreenLoadDelay();
TabBrowserControlsState.updateEnabledState(mTab);
TabBrowserControlsConstraintsHelper.updateEnabledState(mTab);
}
@Override
......
......@@ -33,12 +33,12 @@ public class TabViewAndroidDelegate extends ViewAndroidDelegate {
@Override
public void onTopControlsChanged(int topControlsOffsetY, int contentOffsetY) {
TabBrowserControlsState.get(mTab).setTopOffset(topControlsOffsetY, contentOffsetY);
TabBrowserControlsOffsetHelper.get(mTab).setTopOffset(topControlsOffsetY, contentOffsetY);
}
@Override
public void onBottomControlsChanged(int bottomControlsOffsetY, int bottomContentOffsetY) {
TabBrowserControlsState.get(mTab).setBottomOffset(bottomControlsOffsetY);
TabBrowserControlsOffsetHelper.get(mTab).setBottomOffset(bottomControlsOffsetY);
}
/**
......
......@@ -304,7 +304,7 @@ public class TabWebContentsObserver extends TabWebContentsUserData {
observers.next().onDidAttachInterstitialPage(mTab);
}
mTab.notifyLoadProgress(mTab.getProgress());
TabBrowserControlsState.updateEnabledState(mTab);
TabBrowserControlsConstraintsHelper.updateEnabledState(mTab);
PolicyAuditor auditor = AppHooks.get().getPolicyAuditor();
auditor.notifyCertificateFailure(
PolicyAuditorJni.get().getCertificateFailure(mTab.getWebContents()),
......@@ -320,7 +320,7 @@ public class TabWebContentsObserver extends TabWebContentsUserData {
observers.next().onDidDetachInterstitialPage(mTab);
}
mTab.notifyLoadProgress(mTab.getProgress());
TabBrowserControlsState.updateEnabledState(mTab);
TabBrowserControlsConstraintsHelper.updateEnabledState(mTab);
if (!mTab.maybeShowNativePage(mTab.getUrl(), false)) {
mTab.showRenderedPage();
}
......
......@@ -46,7 +46,7 @@ import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabBuilder;
import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabImpl;
......@@ -567,8 +567,8 @@ public class WebappActivity extends BaseCustomTabActivity<WebappActivityComponen
if (navigation.hasCommitted() && navigation.isInMainFrame()) {
// Notify the renderer to permanently hide the top controls since they do
// not apply to fullscreen content views.
TabBrowserControlsState.update(
tab, TabBrowserControlsState.getConstraints(tab), true);
TabBrowserControlsConstraintsHelper.update(
tab, TabBrowserControlsConstraintsHelper.getConstraints(tab), true);
RecordHistogram.recordBooleanHistogram(
HISTOGRAM_NAVIGATION_STATUS, !navigation.isErrorPage());
......
......@@ -39,7 +39,7 @@ import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabThemeColorHelper;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.ChromeTabUtils;
......@@ -254,6 +254,6 @@ public class TrustedWebActivityTest {
public boolean getCanShowToolbarState(Tab tab) {
return TestThreadUtils.runOnUiThreadBlockingNoException(
() -> TabBrowserControlsState.get(tab).canShow());
() -> TabBrowserControlsConstraintsHelper.get(tab).canShow());
}
}
......@@ -7,18 +7,18 @@ package org.chromium.chrome.browser.browserservices;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
import androidx.browser.customtabs.CustomTabsService;
import androidx.browser.customtabs.CustomTabsSessionToken;
import androidx.browser.customtabs.TrustedWebUtils;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.customtabs.CustomTabsConnection;
import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.util.concurrent.TimeoutException;
import androidx.browser.customtabs.CustomTabsService;
import androidx.browser.customtabs.CustomTabsSessionToken;
import androidx.browser.customtabs.TrustedWebUtils;
/**
* Common utilities for Trusted Web Activity tests.
*/
......@@ -50,8 +50,6 @@ public class TrustedWebActivityTestUtil {
public static boolean isTrustedWebActivity(CustomTabActivity activity) {
// A key part of the Trusted Web Activity UI is the lack of browser controls.
return !TestThreadUtils.runOnUiThreadBlockingNoException(
() -> TabBrowserControlsState
.get(activity.getActivityTab())
.canShow());
() -> TabBrowserControlsConstraintsHelper.get(activity.getActivityTab()).canShow());
}
}
......@@ -10,6 +10,8 @@ import android.support.test.InstrumentationRegistry;
import android.view.View;
import android.view.ViewGroup;
import androidx.browser.customtabs.TrustedWebUtils;
import org.junit.Assert;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
......@@ -18,7 +20,7 @@ import org.chromium.base.test.util.UrlUtils;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
import org.chromium.chrome.browser.tab.TabBrowserControlsState;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
......@@ -26,8 +28,6 @@ import org.chromium.content_public.browser.test.util.DOMUtils;
import org.chromium.content_public.browser.test.util.JavaScriptUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import androidx.browser.customtabs.TrustedWebUtils;
/**
* Custom {@link ChromeActivityTestRule} for tests using {@link WebappActivity}.
*/
......@@ -152,7 +152,10 @@ public class WebappActivityTestRule extends ChromeActivityTestRule<WebappActivit
public static void assertToolbarShowState(ChromeActivity activity, boolean showState) {
Assert.assertEquals(showState,
TestThreadUtils.runOnUiThreadBlockingNoException(
() -> TabBrowserControlsState.get(activity.getActivityTab()).canShow()));
()
-> TabBrowserControlsConstraintsHelper
.get(activity.getActivityTab())
.canShow()));
}
/**
......
// Copyright 2019 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.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.base.ObserverList;
import org.chromium.base.UserDataHost;
import org.chromium.base.test.BaseRobolectricTestRunner;
/** Unit tests for {@link TabBrowserControlsOffsetHelper}. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class TabBrowserControlsOffsetHelperTest {
private final UserDataHost mUserDataHost = new UserDataHost();
@Mock
public TabImpl mTab;
@Mock
public TabObserver mDispatchedTabObserver;
private TabBrowserControlsOffsetHelper mHelper;
private TabObserver mRegisteredTabObserver;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
Mockito.when(mTab.getUserDataHost()).thenReturn(mUserDataHost);
ObserverList<TabObserver> observers = new ObserverList<>();
observers.addObserver(mDispatchedTabObserver);
Mockito.when(mTab.getTabObservers())
.thenAnswer(invocation -> observers.rewindableIterator());
ArgumentCaptor<TabObserver> observerArg = ArgumentCaptor.forClass(TabObserver.class);
mHelper = TabBrowserControlsOffsetHelper.get(mTab);
Mockito.verify(mTab).addObserver(observerArg.capture());
mRegisteredTabObserver = observerArg.getValue();
Assert.assertFalse(mHelper.offsetInitialized());
}
@Test
public void testSetTopOffset() {
int bottomValue = mHelper.bottomControlsOffset();
mHelper.setTopOffset(20, 50);
Mockito.verify(mDispatchedTabObserver)
.onBrowserControlsOffsetChanged(mTab, 20, bottomValue, 50);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(20, mHelper.topControlsOffset());
Assert.assertEquals(50, mHelper.contentOffset());
Assert.assertEquals(bottomValue, mHelper.bottomControlsOffset());
// Different top offset, different content offset.
mHelper.setTopOffset(25, 55);
Mockito.verify(mDispatchedTabObserver)
.onBrowserControlsOffsetChanged(mTab, 25, bottomValue, 55);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(25, mHelper.topControlsOffset());
Assert.assertEquals(55, mHelper.contentOffset());
Assert.assertEquals(bottomValue, mHelper.bottomControlsOffset());
// Different top offset, same content offset.
mHelper.setTopOffset(40, 55);
Mockito.verify(mDispatchedTabObserver)
.onBrowserControlsOffsetChanged(mTab, 40, bottomValue, 55);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(40, mHelper.topControlsOffset());
Assert.assertEquals(55, mHelper.contentOffset());
Assert.assertEquals(bottomValue, mHelper.bottomControlsOffset());
// Same top offset, different content offset.
mHelper.setTopOffset(40, 60);
Mockito.verify(mDispatchedTabObserver)
.onBrowserControlsOffsetChanged(mTab, 40, bottomValue, 60);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(40, mHelper.topControlsOffset());
Assert.assertEquals(60, mHelper.contentOffset());
Assert.assertEquals(bottomValue, mHelper.bottomControlsOffset());
// Same top offset, same content offset. Duplicate values should not dispatch additional
// change notifications.
mHelper.setTopOffset(40, 60);
Mockito.verifyNoMoreInteractions(mDispatchedTabObserver);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(40, mHelper.topControlsOffset());
Assert.assertEquals(60, mHelper.contentOffset());
Assert.assertEquals(bottomValue, mHelper.bottomControlsOffset());
}
@Test
public void testSetBottomOffset() {
int topValue = mHelper.topControlsOffset();
int contentValue = mHelper.contentOffset();
mHelper.setBottomOffset(37);
Mockito.verify(mDispatchedTabObserver)
.onBrowserControlsOffsetChanged(mTab, topValue, 37, contentValue);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(topValue, mHelper.topControlsOffset());
Assert.assertEquals(contentValue, mHelper.contentOffset());
Assert.assertEquals(37, mHelper.bottomControlsOffset());
// Different bottom offset.
mHelper.setBottomOffset(42);
Mockito.verify(mDispatchedTabObserver)
.onBrowserControlsOffsetChanged(mTab, topValue, 42, contentValue);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(topValue, mHelper.topControlsOffset());
Assert.assertEquals(contentValue, mHelper.contentOffset());
Assert.assertEquals(42, mHelper.bottomControlsOffset());
// Same bottom offset. Duplicate values should not dispatch additional change
// notifications.
mHelper.setBottomOffset(42);
Mockito.verifyNoMoreInteractions(mDispatchedTabObserver);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(topValue, mHelper.topControlsOffset());
Assert.assertEquals(contentValue, mHelper.contentOffset());
Assert.assertEquals(42, mHelper.bottomControlsOffset());
}
@Test
public void testTabCrashed() {
int initialBottomValue = mHelper.bottomControlsOffset();
mHelper.setTopOffset(11, 12);
Mockito.verify(mDispatchedTabObserver)
.onBrowserControlsOffsetChanged(mTab, 11, initialBottomValue, 12);
mHelper.setBottomOffset(13);
Mockito.verify(mDispatchedTabObserver).onBrowserControlsOffsetChanged(mTab, 11, 13, 12);
Assert.assertTrue(mHelper.offsetInitialized());
Assert.assertEquals(11, mHelper.topControlsOffset());
Assert.assertEquals(12, mHelper.contentOffset());
Assert.assertEquals(13, mHelper.bottomControlsOffset());
mRegisteredTabObserver.onCrash(mTab);
Assert.assertFalse(mHelper.offsetInitialized());
Assert.assertEquals(0, mHelper.topControlsOffset());
Assert.assertEquals(0, mHelper.contentOffset());
Assert.assertEquals(0, mHelper.bottomControlsOffset());
}
}
......@@ -2638,8 +2638,8 @@ jumbo_static_library("browser") {
"android/startup_bridge.h",
"android/tab_android.cc",
"android/tab_android.h",
"android/tab_browser_controls_state.cc",
"android/tab_browser_controls_state.h",
"android/tab_browser_controls_constraints_helper.cc",
"android/tab_browser_controls_constraints_helper.h",
"android/tab_favicon.cc",
"android/tab_favicon.h",
"android/tab_printer.cc",
......
......@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/android/tab_browser_controls_state.h"
#include "chrome/browser/android/tab_browser_controls_constraints_helper.h"
#include "chrome/android/chrome_jni_headers/TabBrowserControlsState_jni.h"
#include "chrome/android/chrome_jni_headers/TabBrowserControlsConstraintsHelper_jni.h"
#include "chrome/common/chrome_render_frame.mojom.h"
#include "content/public/browser/interstitial_page.h"
#include "content/public/browser/render_frame_host.h"
......@@ -15,19 +15,21 @@ using base::android::AttachCurrentThread;
using base::android::JavaParamRef;
using base::android::JavaRef;
TabBrowserControlsState::TabBrowserControlsState(
TabBrowserControlsConstraintsHelper::TabBrowserControlsConstraintsHelper(
JNIEnv* env,
const JavaParamRef<jobject>& obj)
: jobj_(env, obj) {}
TabBrowserControlsState::~TabBrowserControlsState() = default;
TabBrowserControlsConstraintsHelper::~TabBrowserControlsConstraintsHelper() =
default;
void TabBrowserControlsState::OnDestroyed(JNIEnv* env,
const JavaParamRef<jobject>& obj) {
void TabBrowserControlsConstraintsHelper::OnDestroyed(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
delete this;
}
void TabBrowserControlsState::UpdateState(
void TabBrowserControlsConstraintsHelper::UpdateState(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& jweb_contents,
......@@ -51,8 +53,9 @@ void TabBrowserControlsState::UpdateState(
}
}
static jlong JNI_TabBrowserControlsState_Init(
static jlong JNI_TabBrowserControlsConstraintsHelper_Init(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
return reinterpret_cast<intptr_t>(new TabBrowserControlsState(env, obj));
return reinterpret_cast<intptr_t>(
new TabBrowserControlsConstraintsHelper(env, obj));
}
......@@ -2,17 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ANDROID_TAB_BROWSER_CONTROLS_STATE_H_
#define CHROME_BROWSER_ANDROID_TAB_BROWSER_CONTROLS_STATE_H_
#ifndef CHROME_BROWSER_ANDROID_TAB_BROWSER_CONTROLS_CONSTRAINTS_HELPER_H_
#define CHROME_BROWSER_ANDROID_TAB_BROWSER_CONTROLS_CONSTRAINTS_HELPER_H_
#include "base/android/scoped_java_ref.h"
// Native TabBrowsreControlsState. Managed by Java class.
class TabBrowserControlsState {
// Dispatches changes to the browser controls constraints for a given tab.
class TabBrowserControlsConstraintsHelper {
public:
TabBrowserControlsState(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
~TabBrowserControlsState();
TabBrowserControlsConstraintsHelper(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
~TabBrowserControlsConstraintsHelper();
void UpdateState(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
......@@ -27,4 +28,4 @@ class TabBrowserControlsState {
base::android::ScopedJavaGlobalRef<jobject> jobj_;
};
#endif // CHROME_BROWSER_ANDROID_TAB_BROWSER_CONTROLS_STATE_H_
#endif // CHROME_BROWSER_ANDROID_TAB_BROWSER_CONTROLS_CONSTRAINTS_HELPER_H_
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