| Index: chrome/android/java/src/org/chromium/chrome/browser/TabBase.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabBase.java b/chrome/android/java/src/org/chromium/chrome/browser/TabBase.java
|
| deleted file mode 100644
|
| index f227bc458474d8e2f19e2ee5d180cf990541c232..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/TabBase.java
|
| +++ /dev/null
|
| @@ -1,964 +0,0 @@
|
| -// Copyright 2012 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;
|
| -
|
| -import android.app.Activity;
|
| -import android.content.Context;
|
| -import android.graphics.Bitmap;
|
| -import android.graphics.Color;
|
| -import android.view.ContextMenu;
|
| -import android.view.View;
|
| -
|
| -import org.chromium.base.CalledByNative;
|
| -import org.chromium.base.ObserverList;
|
| -import org.chromium.chrome.browser.banners.AppBannerManager;
|
| -import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItemDelegate;
|
| -import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
|
| -import org.chromium.chrome.browser.contextmenu.ContextMenuParams;
|
| -import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator;
|
| -import org.chromium.chrome.browser.contextmenu.ContextMenuPopulatorWrapper;
|
| -import org.chromium.chrome.browser.contextmenu.EmptyChromeContextMenuItemDelegate;
|
| -import org.chromium.chrome.browser.infobar.AutoLoginProcessor;
|
| -import org.chromium.chrome.browser.infobar.InfoBarContainer;
|
| -import org.chromium.chrome.browser.profiles.Profile;
|
| -import org.chromium.chrome.browser.ui.toolbar.ToolbarModelSecurityLevel;
|
| -import org.chromium.content.browser.ContentView;
|
| -import org.chromium.content.browser.ContentViewClient;
|
| -import org.chromium.content.browser.ContentViewCore;
|
| -import org.chromium.content.browser.NavigationClient;
|
| -import org.chromium.content.browser.NavigationHistory;
|
| -import org.chromium.content.browser.PageInfo;
|
| -import org.chromium.content.browser.WebContentsObserverAndroid;
|
| -import org.chromium.content_public.browser.WebContents;
|
| -import org.chromium.ui.base.Clipboard;
|
| -import org.chromium.ui.base.WindowAndroid;
|
| -
|
| -import java.util.concurrent.atomic.AtomicInteger;
|
| -
|
| -/**
|
| - * The basic Java representation of a tab. Contains and manages a {@link ContentView}.
|
| - *
|
| - * TabBase provides common functionality for ChromiumTestshell's Tab as well as Chrome on Android's
|
| - * tab. It is intended to be extended either on Java or both Java and C++, with ownership managed
|
| - * by this base class.
|
| - *
|
| - * Extending just Java:
|
| - * - Just extend the class normally. Do not override initializeNative().
|
| - * Extending Java and C++:
|
| - * - Because of the inner-workings of JNI, the subclass is responsible for constructing the native
|
| - * subclass, which in turn constructs TabAndroid (the native counterpart to TabBase), which in
|
| - * turn sets the native pointer for TabBase. For destruction, subclasses in Java must clear
|
| - * their own native pointer reference, but TabBase#destroy() will handle deleting the native
|
| - * object.
|
| - */
|
| -public abstract class TabBase implements NavigationClient {
|
| - public static final int INVALID_TAB_ID = -1;
|
| -
|
| - /** Used for automatically generating tab ids. */
|
| - private static final AtomicInteger sIdCounter = new AtomicInteger();
|
| -
|
| - private long mNativeTabAndroid;
|
| -
|
| - /** Unique id of this tab (within its container). */
|
| - private final int mId;
|
| -
|
| - /** Whether or not this tab is an incognito tab. */
|
| - private final boolean mIncognito;
|
| -
|
| - /** An Application {@link Context}. Unlike {@link #mContext}, this is the only one that is
|
| - * publicly exposed to help prevent leaking the {@link Activity}. */
|
| - private final Context mApplicationContext;
|
| -
|
| - /** The {@link Context} used to create {@link View}s and other Android components. Unlike
|
| - * {@link #mApplicationContext}, this is not publicly exposed to help prevent leaking the
|
| - * {@link Activity}. */
|
| - private final Context mContext;
|
| -
|
| - /** Gives {@link TabBase} a way to interact with the Android window. */
|
| - private final WindowAndroid mWindowAndroid;
|
| -
|
| - /** The current native page (e.g. chrome-native://newtab), or {@code null} if there is none. */
|
| - private NativePage mNativePage;
|
| -
|
| - /** The {@link ContentView} showing the current page or {@code null} if the tab is frozen. */
|
| - private ContentView mContentView;
|
| -
|
| - /** InfoBar container to show InfoBars for this tab. */
|
| - private InfoBarContainer mInfoBarContainer;
|
| -
|
| - /** Manages app banners shown for this tab. */
|
| - private AppBannerManager mAppBannerManager;
|
| -
|
| - /** The sync id of the TabBase if session sync is enabled. */
|
| - private int mSyncId;
|
| -
|
| - /**
|
| - * The {@link ContentViewCore} for the current page, provided for convenience. This always
|
| - * equals {@link ContentView#getContentViewCore()}, or {@code null} if mContentView is
|
| - * {@code null}.
|
| - */
|
| - private ContentViewCore mContentViewCore;
|
| -
|
| - /**
|
| - * A list of TabBase observers. These are used to broadcast TabBase events to listeners.
|
| - */
|
| - private final ObserverList<TabObserver> mObservers = new ObserverList<TabObserver>();
|
| -
|
| - // Content layer Observers and Delegates
|
| - private ContentViewClient mContentViewClient;
|
| - private WebContentsObserverAndroid mWebContentsObserver;
|
| - private VoiceSearchTabHelper mVoiceSearchTabHelper;
|
| - private TabBaseChromeWebContentsDelegateAndroid mWebContentsDelegate;
|
| -
|
| - /**
|
| - * A default {@link ChromeContextMenuItemDelegate} that supports some of the context menu
|
| - * functionality.
|
| - */
|
| - protected class TabBaseChromeContextMenuItemDelegate
|
| - extends EmptyChromeContextMenuItemDelegate {
|
| - private final Clipboard mClipboard;
|
| -
|
| - /**
|
| - * Builds a {@link TabBaseChromeContextMenuItemDelegate} instance.
|
| - */
|
| - public TabBaseChromeContextMenuItemDelegate() {
|
| - mClipboard = new Clipboard(getApplicationContext());
|
| - }
|
| -
|
| - @Override
|
| - public boolean isIncognito() {
|
| - return mIncognito;
|
| - }
|
| -
|
| - @Override
|
| - public void onSaveToClipboard(String text, boolean isUrl) {
|
| - mClipboard.setText(text, text);
|
| - }
|
| -
|
| - @Override
|
| - public void onSaveImageToClipboard(String url) {
|
| - mClipboard.setHTMLText("<img src=\"" + url + "\">", url, url);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * A basic {@link ChromeWebContentsDelegateAndroid} that forwards some calls to the registered
|
| - * {@link TabObserver}s. Meant to be overridden by subclasses.
|
| - */
|
| - public class TabBaseChromeWebContentsDelegateAndroid
|
| - extends ChromeWebContentsDelegateAndroid {
|
| - @Override
|
| - public void onLoadProgressChanged(int progress) {
|
| - for (TabObserver observer : mObservers) {
|
| - observer.onLoadProgressChanged(TabBase.this, progress);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void onUpdateUrl(String url) {
|
| - for (TabObserver observer : mObservers) observer.onUpdateUrl(TabBase.this, url);
|
| - }
|
| -
|
| - @Override
|
| - public void showRepostFormWarningDialog(final ContentViewCore contentViewCore) {
|
| - RepostFormWarningDialog warningDialog = new RepostFormWarningDialog(
|
| - new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - contentViewCore.cancelPendingReload();
|
| - }
|
| - }, new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - contentViewCore.continuePendingReload();
|
| - }
|
| - });
|
| - Activity activity = (Activity) mContext;
|
| - warningDialog.show(activity.getFragmentManager(), null);
|
| - }
|
| -
|
| - @Override
|
| - public void toggleFullscreenModeForTab(boolean enableFullscreen) {
|
| - for (TabObserver observer : mObservers) {
|
| - observer.onToggleFullscreenMode(TabBase.this, enableFullscreen);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void navigationStateChanged(int flags) {
|
| - if ((flags & INVALIDATE_TYPE_TITLE) != 0) {
|
| - for (TabObserver observer : mObservers) observer.onTitleUpdated(TabBase.this);
|
| - }
|
| - if ((flags & INVALIDATE_TYPE_URL) != 0) {
|
| - for (TabObserver observer : mObservers) observer.onUrlUpdated(TabBase.this);
|
| - }
|
| - }
|
| - }
|
| -
|
| - private class TabBaseContextMenuPopulator extends ContextMenuPopulatorWrapper {
|
| - public TabBaseContextMenuPopulator(ContextMenuPopulator populator) {
|
| - super(populator);
|
| - }
|
| -
|
| - @Override
|
| - public void buildContextMenu(ContextMenu menu, Context context, ContextMenuParams params) {
|
| - super.buildContextMenu(menu, context, params);
|
| - for (TabObserver observer : mObservers) observer.onContextMenuShown(TabBase.this, menu);
|
| - }
|
| - }
|
| -
|
| - private class TabBaseWebContentsObserverAndroid extends WebContentsObserverAndroid {
|
| - public TabBaseWebContentsObserverAndroid(ContentViewCore contentViewCore) {
|
| - super(contentViewCore);
|
| - }
|
| -
|
| - @Override
|
| - public void navigationEntryCommitted() {
|
| - if (getNativePage() != null) {
|
| - pushNativePageStateToNavigationEntry();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void didFailLoad(boolean isProvisionalLoad, boolean isMainFrame, int errorCode,
|
| - String description, String failingUrl) {
|
| - for (TabObserver observer : mObservers) {
|
| - observer.onDidFailLoad(TabBase.this, isProvisionalLoad, isMainFrame, errorCode,
|
| - description, failingUrl);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Creates an instance of a {@link TabBase} with no id.
|
| - * @param incognito Whether or not this tab is incognito.
|
| - * @param context An instance of a {@link Context}.
|
| - * @param window An instance of a {@link WindowAndroid}.
|
| - */
|
| - public TabBase(boolean incognito, Context context, WindowAndroid window) {
|
| - this(INVALID_TAB_ID, incognito, context, window);
|
| - }
|
| -
|
| - /**
|
| - * Creates an instance of a {@link TabBase}.
|
| - * @param id The id this tab should be identified with.
|
| - * @param incognito Whether or not this tab is incognito.
|
| - * @param context An instance of a {@link Context}.
|
| - * @param window An instance of a {@link WindowAndroid}.
|
| - */
|
| - public TabBase(int id, boolean incognito, Context context, WindowAndroid window) {
|
| - // We need a valid Activity Context to build the ContentView with.
|
| - assert context == null || context instanceof Activity;
|
| -
|
| - mId = generateValidId(id);
|
| - mIncognito = incognito;
|
| - // TODO(dtrainor): Only store application context here.
|
| - mContext = context;
|
| - mApplicationContext = context != null ? context.getApplicationContext() : null;
|
| - mWindowAndroid = window;
|
| - }
|
| -
|
| - /**
|
| - * Adds a {@link TabObserver} to be notified on {@link TabBase} changes.
|
| - * @param observer The {@link TabObserver} to add.
|
| - */
|
| - public final void addObserver(TabObserver observer) {
|
| - mObservers.addObserver(observer);
|
| - }
|
| -
|
| - /**
|
| - * Removes a {@link TabObserver}.
|
| - * @param observer The {@link TabObserver} to remove.
|
| - */
|
| - public final void removeObserver(TabObserver observer) {
|
| - mObservers.removeObserver(observer);
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not this tab has a previous navigation entry.
|
| - */
|
| - public boolean canGoBack() {
|
| - return mContentViewCore != null && mContentViewCore.canGoBack();
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not this tab has a navigation entry after the current one.
|
| - */
|
| - public boolean canGoForward() {
|
| - return mContentViewCore != null && mContentViewCore.canGoForward();
|
| - }
|
| -
|
| - /**
|
| - * Goes to the navigation entry before the current one.
|
| - */
|
| - public void goBack() {
|
| - if (mContentViewCore != null) mContentViewCore.goBack();
|
| - }
|
| -
|
| - /**
|
| - * Goes to the navigation entry after the current one.
|
| - */
|
| - public void goForward() {
|
| - if (mContentViewCore != null) mContentViewCore.goForward();
|
| - }
|
| -
|
| - @Override
|
| - public NavigationHistory getDirectedNavigationHistory(boolean isForward, int itemLimit) {
|
| - if (mContentViewCore != null) {
|
| - return mContentViewCore.getDirectedNavigationHistory(isForward, itemLimit);
|
| - } else {
|
| - return new NavigationHistory();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void goToNavigationIndex(int index) {
|
| - if (mContentViewCore != null) mContentViewCore.goToNavigationIndex(index);
|
| - }
|
| -
|
| - /**
|
| - * Loads the current navigation if there is a pending lazy load (after tab restore).
|
| - */
|
| - public void loadIfNecessary() {
|
| - if (mContentViewCore != null) mContentViewCore.loadIfNecessary();
|
| - }
|
| -
|
| - /**
|
| - * Requests the current navigation to be loaded upon the next call to loadIfNecessary().
|
| - */
|
| - protected void requestRestoreLoad() {
|
| - if (mContentViewCore != null) mContentViewCore.requestRestoreLoad();
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not the {@link TabBase} is currently showing an interstitial page, such as
|
| - * a bad HTTPS page.
|
| - */
|
| - public boolean isShowingInterstitialPage() {
|
| - ContentViewCore contentViewCore = getContentViewCore();
|
| - return contentViewCore != null && contentViewCore.isShowingInterstitialPage();
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not the tab has something valid to render.
|
| - */
|
| - public boolean isReady() {
|
| - return mNativePage != null || (mContentViewCore != null && mContentViewCore.isReady());
|
| - }
|
| -
|
| - /**
|
| - * @return The {@link View} displaying the current page in the tab. This might be a
|
| - * {@link ContentView} but could potentially be any instance of {@link View}. This can
|
| - * be {@code null}, if the tab is frozen or being initialized or destroyed.
|
| - */
|
| - public View getView() {
|
| - PageInfo pageInfo = getPageInfo();
|
| - return pageInfo != null ? pageInfo.getView() : null;
|
| - }
|
| -
|
| - /**
|
| - * @return The width of the content of this tab. Can be 0 if there is no content.
|
| - */
|
| - public int getWidth() {
|
| - View view = getView();
|
| - return view != null ? view.getWidth() : 0;
|
| - }
|
| -
|
| - /**
|
| - * @return The height of the content of this tab. Can be 0 if there is no content.
|
| - */
|
| - public int getHeight() {
|
| - View view = getView();
|
| - return view != null ? view.getHeight() : 0;
|
| - }
|
| -
|
| - /**
|
| - * @return The application {@link Context} associated with this tab.
|
| - */
|
| - protected Context getApplicationContext() {
|
| - return mApplicationContext;
|
| - }
|
| -
|
| - /**
|
| - * @return The infobar container.
|
| - */
|
| - public final InfoBarContainer getInfoBarContainer() {
|
| - return mInfoBarContainer;
|
| - }
|
| -
|
| - /**
|
| - * Create an {@code AutoLoginProcessor} to decide how to handle login
|
| - * requests.
|
| - */
|
| - protected abstract AutoLoginProcessor createAutoLoginProcessor();
|
| -
|
| - /**
|
| - * Prints the current page.
|
| - *
|
| - * @return Whether the printing process is started successfully.
|
| - **/
|
| - public boolean print() {
|
| - assert mNativeTabAndroid != 0;
|
| - return nativePrint(mNativeTabAndroid);
|
| - }
|
| -
|
| - /**
|
| - * Reloads the current page content if it is a {@link ContentView}.
|
| - */
|
| - public void reload() {
|
| - // TODO(dtrainor): Should we try to rebuild the ContentView if it's frozen?
|
| - if (mContentViewCore != null) mContentViewCore.reload(true);
|
| - }
|
| -
|
| - /**
|
| - * Reloads the current page content if it is a {@link ContentView}.
|
| - * This version ignores the cache and reloads from the network.
|
| - */
|
| - public void reloadIgnoringCache() {
|
| - if (mContentViewCore != null) mContentViewCore.reloadIgnoringCache(true);
|
| - }
|
| -
|
| - /** Stop the current navigation. */
|
| - public void stopLoading() {
|
| - if (mContentViewCore != null) mContentViewCore.stopLoading();
|
| - }
|
| -
|
| - /**
|
| - * @return The background color of the tab.
|
| - */
|
| - public int getBackgroundColor() {
|
| - return getPageInfo() != null ? getPageInfo().getBackgroundColor() : Color.WHITE;
|
| - }
|
| -
|
| - /**
|
| - * @return The web contents associated with this tab.
|
| - */
|
| - public WebContents getWebContents() {
|
| - if (mNativeTabAndroid == 0) return null;
|
| - return nativeGetWebContents(mNativeTabAndroid);
|
| - }
|
| -
|
| - /**
|
| - * @return The profile associated with this tab.
|
| - */
|
| - public Profile getProfile() {
|
| - if (mNativeTabAndroid == 0) return null;
|
| - return nativeGetProfileAndroid(mNativeTabAndroid);
|
| - }
|
| -
|
| - /**
|
| - * @return The id representing this tab.
|
| - */
|
| - @CalledByNative
|
| - public int getId() {
|
| - return mId;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not this tab is incognito.
|
| - */
|
| - public boolean isIncognito() {
|
| - return mIncognito;
|
| - }
|
| -
|
| - /**
|
| - * @return The {@link ContentView} associated with the current page, or {@code null} if
|
| - * there is no current page or the current page is displayed using something besides a
|
| - * {@link ContentView}.
|
| - */
|
| - public ContentView getContentView() {
|
| - return mNativePage == null ? mContentView : null;
|
| - }
|
| -
|
| - /**
|
| - * @return The {@link ContentViewCore} associated with the current page, or {@code null} if
|
| - * there is no current page or the current page is displayed using something besides a
|
| - * {@link ContentView}.
|
| - */
|
| - public ContentViewCore getContentViewCore() {
|
| - return mNativePage == null ? mContentViewCore : null;
|
| - }
|
| -
|
| - /**
|
| - * @return A {@link PageInfo} describing the current page. This is always not {@code null}
|
| - * except during initialization, destruction, and when the tab is frozen.
|
| - */
|
| - public PageInfo getPageInfo() {
|
| - return mNativePage != null ? mNativePage : mContentView;
|
| - }
|
| -
|
| - /**
|
| - * @return The {@link NativePage} associated with the current page, or {@code null} if there is
|
| - * no current page or the current page is displayed using something besides
|
| - * {@link NativePage}.
|
| - */
|
| - public NativePage getNativePage() {
|
| - return mNativePage;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not the {@link TabBase} represents a {@link NativePage}.
|
| - */
|
| - public boolean isNativePage() {
|
| - return mNativePage != null;
|
| - }
|
| -
|
| - /**
|
| - * Set whether or not the {@link ContentViewCore} should be using a desktop user agent for the
|
| - * currently loaded page.
|
| - * @param useDesktop If {@code true}, use a desktop user agent. Otherwise use a mobile one.
|
| - * @param reloadOnChange Reload the page if the user agent has changed.
|
| - */
|
| - public void setUseDesktopUserAgent(boolean useDesktop, boolean reloadOnChange) {
|
| - if (mContentViewCore != null) {
|
| - mContentViewCore.setUseDesktopUserAgent(useDesktop, reloadOnChange);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not the {@link ContentViewCore} is using a desktop user agent.
|
| - */
|
| - public boolean getUseDesktopUserAgent() {
|
| - return mContentViewCore != null && mContentViewCore.getUseDesktopUserAgent();
|
| - }
|
| -
|
| - /**
|
| - * @return The current {ToolbarModelSecurityLevel} for the tab.
|
| - */
|
| - public int getSecurityLevel() {
|
| - if (mNativeTabAndroid == 0) return ToolbarModelSecurityLevel.NONE;
|
| - return nativeGetSecurityLevel(mNativeTabAndroid);
|
| - }
|
| -
|
| - /**
|
| - * @return The sync id of the tab if session sync is enabled, {@code 0} otherwise.
|
| - */
|
| - @CalledByNative
|
| - protected int getSyncId() {
|
| - return mSyncId;
|
| - }
|
| -
|
| - /**
|
| - * @param syncId The sync id of the tab if session sync is enabled.
|
| - */
|
| - @CalledByNative
|
| - protected void setSyncId(int syncId) {
|
| - mSyncId = syncId;
|
| - }
|
| -
|
| - /**
|
| - * @return An {@link ObserverList.RewindableIterator} instance that points to all of
|
| - * the current {@link TabObserver}s on this class. Note that calling
|
| - * {@link java.util.Iterator#remove()} will throw an
|
| - * {@link UnsupportedOperationException}.
|
| - */
|
| - protected ObserverList.RewindableIterator<TabObserver> getTabObservers() {
|
| - return mObservers.rewindableIterator();
|
| - }
|
| -
|
| - /**
|
| - * @return The {@link ContentViewClient} currently bound to any {@link ContentViewCore}
|
| - * associated with the current page. There can still be a {@link ContentViewClient}
|
| - * even when there is no {@link ContentViewCore}.
|
| - */
|
| - protected ContentViewClient getContentViewClient() {
|
| - return mContentViewClient;
|
| - }
|
| -
|
| - /**
|
| - * @param client The {@link ContentViewClient} to be bound to any current or new
|
| - * {@link ContentViewCore}s associated with this {@link TabBase}.
|
| - */
|
| - protected void setContentViewClient(ContentViewClient client) {
|
| - if (mContentViewClient == client) return;
|
| -
|
| - ContentViewClient oldClient = mContentViewClient;
|
| - mContentViewClient = client;
|
| -
|
| - if (mContentViewCore == null) return;
|
| -
|
| - if (mContentViewClient != null) {
|
| - mContentViewCore.setContentViewClient(mContentViewClient);
|
| - } else if (oldClient != null) {
|
| - // We can't set a null client, but we should clear references to the last one.
|
| - mContentViewCore.setContentViewClient(new ContentViewClient());
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Triggers the showing logic for the view backing this tab.
|
| - */
|
| - protected void show() {
|
| - if (mContentViewCore != null) mContentViewCore.onShow();
|
| - }
|
| -
|
| - /**
|
| - * Triggers the hiding logic for the view backing the tab.
|
| - */
|
| - protected void hide() {
|
| - if (mContentViewCore != null) mContentViewCore.onHide();
|
| - }
|
| -
|
| - /**
|
| - * Shows the given {@code nativePage} if it's not already showing.
|
| - * @param nativePage The {@link NativePage} to show.
|
| - */
|
| - protected void showNativePage(NativePage nativePage) {
|
| - if (mNativePage == nativePage) return;
|
| - NativePage previousNativePage = mNativePage;
|
| - mNativePage = nativePage;
|
| - pushNativePageStateToNavigationEntry();
|
| - for (TabObserver observer : mObservers) observer.onContentChanged(this);
|
| - destroyNativePageInternal(previousNativePage);
|
| - }
|
| -
|
| - /**
|
| - * Hides the current {@link NativePage}, if any, and shows the {@link ContentView}.
|
| - */
|
| - protected void showRenderedPage() {
|
| - if (mNativePage == null) return;
|
| - NativePage previousNativePage = mNativePage;
|
| - mNativePage = null;
|
| - for (TabObserver observer : mObservers) observer.onContentChanged(this);
|
| - destroyNativePageInternal(previousNativePage);
|
| - }
|
| -
|
| - /**
|
| - * Initializes this {@link TabBase}.
|
| - */
|
| - public void initialize() {
|
| - initializeNative();
|
| - }
|
| -
|
| - /**
|
| - * Builds the native counterpart to this class. Meant to be overridden by subclasses to build
|
| - * subclass native counterparts instead. Subclasses should not call this via super and instead
|
| - * rely on the native class to create the JNI association.
|
| - */
|
| - protected void initializeNative() {
|
| - if (mNativeTabAndroid == 0) nativeInit();
|
| - assert mNativeTabAndroid != 0;
|
| - }
|
| -
|
| - /**
|
| - * A helper method to initialize a {@link ContentView} without any native WebContents pointer.
|
| - */
|
| - protected final void initContentView() {
|
| - initContentView(ContentViewUtil.createNativeWebContents(mIncognito));
|
| - }
|
| -
|
| - /**
|
| - * Completes the {@link ContentView} specific initialization around a native WebContents
|
| - * pointer. {@link #getPageInfo()} will still return the {@link NativePage} if there is one.
|
| - * All initialization that needs to reoccur after a web contents swap should be added here.
|
| - * <p />
|
| - * NOTE: If you attempt to pass a native WebContents that does not have the same incognito
|
| - * state as this tab this call will fail.
|
| - *
|
| - * @param nativeWebContents The native web contents pointer.
|
| - */
|
| - protected void initContentView(long nativeWebContents) {
|
| - NativePage previousNativePage = mNativePage;
|
| - mNativePage = null;
|
| - destroyNativePageInternal(previousNativePage);
|
| -
|
| - mContentView = ContentView.newInstance(mContext, nativeWebContents, getWindowAndroid());
|
| -
|
| - mContentViewCore = mContentView.getContentViewCore();
|
| - mWebContentsDelegate = createWebContentsDelegate();
|
| - mWebContentsObserver = new TabBaseWebContentsObserverAndroid(mContentViewCore);
|
| - mVoiceSearchTabHelper = new VoiceSearchTabHelper(mContentViewCore);
|
| -
|
| - if (mContentViewClient != null) mContentViewCore.setContentViewClient(mContentViewClient);
|
| -
|
| - assert mNativeTabAndroid != 0;
|
| - nativeInitWebContents(
|
| - mNativeTabAndroid, mIncognito, mContentViewCore, mWebContentsDelegate,
|
| - new TabBaseContextMenuPopulator(createContextMenuPopulator()));
|
| -
|
| - // In the case where restoring a Tab or showing a prerendered one we already have a
|
| - // valid infobar container, no need to recreate one.
|
| - if (mInfoBarContainer == null) {
|
| - // The InfoBarContainer needs to be created after the ContentView has been natively
|
| - // initialized.
|
| - mInfoBarContainer = new InfoBarContainer(
|
| - (Activity) mContext, createAutoLoginProcessor(), getId(), getContentView(),
|
| - nativeWebContents);
|
| - } else {
|
| - mInfoBarContainer.onParentViewChanged(getId(), getContentView());
|
| - }
|
| -
|
| - if (AppBannerManager.isEnabled() && mAppBannerManager == null) {
|
| - mAppBannerManager = new AppBannerManager(this);
|
| - }
|
| -
|
| - for (TabObserver observer : mObservers) observer.onContentChanged(this);
|
| - }
|
| -
|
| - /**
|
| - * Cleans up all internal state, destroying any {@link NativePage} or {@link ContentView}
|
| - * currently associated with this {@link TabBase}. This also destroys the native counterpart
|
| - * to this class, which means that all subclasses should erase their native pointers after
|
| - * this method is called. Once this call is made this {@link TabBase} should no longer be used.
|
| - */
|
| - public void destroy() {
|
| - for (TabObserver observer : mObservers) observer.onDestroyed(this);
|
| -
|
| - NativePage currentNativePage = mNativePage;
|
| - mNativePage = null;
|
| - destroyNativePageInternal(currentNativePage);
|
| - destroyContentView(true);
|
| -
|
| - // Destroys the native tab after destroying the ContentView but before destroying the
|
| - // InfoBarContainer. The native tab should be destroyed before the infobar container as
|
| - // destroying the native tab cleanups up any remaining infobars. The infobar container
|
| - // expects all infobars to be cleaned up before its own destruction.
|
| - assert mNativeTabAndroid != 0;
|
| - nativeDestroy(mNativeTabAndroid);
|
| - assert mNativeTabAndroid == 0;
|
| -
|
| - if (mInfoBarContainer != null) {
|
| - mInfoBarContainer.destroy();
|
| - mInfoBarContainer = null;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not this Tab has a live native component.
|
| - */
|
| - public boolean isInitialized() {
|
| - return mNativeTabAndroid != 0;
|
| - }
|
| -
|
| - /**
|
| - * @return The url associated with the tab.
|
| - */
|
| - @CalledByNative
|
| - public String getUrl() {
|
| - return mContentView != null ? mContentView.getUrl() : "";
|
| - }
|
| -
|
| - /**
|
| - * @return The tab title.
|
| - */
|
| - @CalledByNative
|
| - public String getTitle() {
|
| - return getPageInfo() != null ? getPageInfo().getTitle() : "";
|
| - }
|
| -
|
| - /**
|
| - * @return The bitmap of the favicon scaled to 16x16dp. null if no favicon
|
| - * is specified or it requires the default favicon.
|
| - * TODO(bauerb): Upstream implementation.
|
| - */
|
| - public Bitmap getFavicon() {
|
| - return null;
|
| - }
|
| -
|
| - /**
|
| - * Restores the tab if it is frozen or crashed.
|
| - * @return true iff tab restore was triggered.
|
| - */
|
| - @CalledByNative
|
| - public boolean restoreIfNeeded() {
|
| - return false;
|
| - }
|
| -
|
| - private void destroyNativePageInternal(NativePage nativePage) {
|
| - if (nativePage == null) return;
|
| - assert getPageInfo() != nativePage : "Attempting to destroy active page.";
|
| -
|
| - nativePage.destroy();
|
| - }
|
| -
|
| - /**
|
| - * Destroys the current {@link ContentView}.
|
| - * @param deleteNativeWebContents Whether or not to delete the native WebContents pointer.
|
| - */
|
| - protected final void destroyContentView(boolean deleteNativeWebContents) {
|
| - if (mContentView == null) return;
|
| -
|
| - destroyContentViewInternal(mContentView);
|
| -
|
| - if (mInfoBarContainer != null && mInfoBarContainer.getParent() != null) {
|
| - mInfoBarContainer.removeFromParentView();
|
| - }
|
| - if (mContentViewCore != null) mContentViewCore.destroy();
|
| -
|
| - mContentView = null;
|
| - mContentViewCore = null;
|
| - mWebContentsDelegate = null;
|
| - mWebContentsObserver = null;
|
| - mVoiceSearchTabHelper = null;
|
| -
|
| - assert mNativeTabAndroid != 0;
|
| - nativeDestroyWebContents(mNativeTabAndroid, deleteNativeWebContents);
|
| - }
|
| -
|
| - /**
|
| - * Gives subclasses the chance to clean up some state associated with this {@link ContentView}.
|
| - * This is because {@link #getContentView()} can return {@code null} if a {@link NativePage}
|
| - * is showing.
|
| - * @param contentView The {@link ContentView} that should have associated state cleaned up.
|
| - */
|
| - protected void destroyContentViewInternal(ContentView contentView) {
|
| - }
|
| -
|
| - /**
|
| - * A helper method to allow subclasses to build their own delegate.
|
| - * @return An instance of a {@link TabBaseChromeWebContentsDelegateAndroid}.
|
| - */
|
| - protected TabBaseChromeWebContentsDelegateAndroid createWebContentsDelegate() {
|
| - return new TabBaseChromeWebContentsDelegateAndroid();
|
| - }
|
| -
|
| - /**
|
| - * A helper method to allow subclasses to build their own menu populator.
|
| - * @return An instance of a {@link ContextMenuPopulator}.
|
| - */
|
| - protected ContextMenuPopulator createContextMenuPopulator() {
|
| - return new ChromeContextMenuPopulator(new TabBaseChromeContextMenuItemDelegate());
|
| - }
|
| -
|
| - /**
|
| - * @return The {@link WindowAndroid} associated with this {@link TabBase}.
|
| - */
|
| - public WindowAndroid getWindowAndroid() {
|
| - return mWindowAndroid;
|
| - }
|
| -
|
| - /**
|
| - * @return The current {@link TabBaseChromeWebContentsDelegateAndroid} instance.
|
| - */
|
| - protected TabBaseChromeWebContentsDelegateAndroid getChromeWebContentsDelegateAndroid() {
|
| - return mWebContentsDelegate;
|
| - }
|
| -
|
| - /**
|
| - * Called when the favicon of the content this tab represents changes.
|
| - */
|
| - @CalledByNative
|
| - protected void onFaviconUpdated() {
|
| - for (TabObserver observer : mObservers) observer.onFaviconUpdated(this);
|
| - }
|
| -
|
| - /**
|
| - * Called when the navigation entry containing the historyitem changed,
|
| - * for example because of a scroll offset or form field change.
|
| - */
|
| - @CalledByNative
|
| - protected void onNavEntryChanged() {
|
| - }
|
| -
|
| - /**
|
| - * @return The native pointer representing the native side of this {@link TabBase} object.
|
| - */
|
| - @CalledByNative
|
| - protected long getNativePtr() {
|
| - return mNativeTabAndroid;
|
| - }
|
| -
|
| - /** This is currently called when committing a pre-rendered page. */
|
| - @CalledByNative
|
| - private void swapWebContents(
|
| - final long newWebContents, boolean didStartLoad, boolean didFinishLoad) {
|
| - int originalWidth = 0;
|
| - int originalHeight = 0;
|
| - if (mContentViewCore != null) {
|
| - originalWidth = mContentViewCore.getViewportWidthPix();
|
| - originalHeight = mContentViewCore.getViewportHeightPix();
|
| - mContentViewCore.onHide();
|
| - }
|
| - destroyContentView(false);
|
| - NativePage previousNativePage = mNativePage;
|
| - mNativePage = null;
|
| - initContentView(newWebContents);
|
| - // Size of the new ContentViewCore is zero at this point. If we don't call onSizeChanged(),
|
| - // next onShow() call would send a resize message with the current ContentViewCore size
|
| - // (zero) to the renderer process, although the new size will be set soon.
|
| - // However, this size fluttering may confuse Blink and rendered result can be broken
|
| - // (see http://crbug.com/340987).
|
| - mContentViewCore.onSizeChanged(originalWidth, originalHeight, 0, 0);
|
| - mContentViewCore.onShow();
|
| - mContentViewCore.attachImeAdapter();
|
| - for (TabObserver observer : mObservers) observer.onContentChanged(this);
|
| - destroyNativePageInternal(previousNativePage);
|
| - for (TabObserver observer : mObservers) {
|
| - observer.onWebContentsSwapped(this, didStartLoad, didFinishLoad);
|
| - }
|
| - }
|
| -
|
| - @CalledByNative
|
| - private void clearNativePtr() {
|
| - assert mNativeTabAndroid != 0;
|
| - mNativeTabAndroid = 0;
|
| - }
|
| -
|
| - @CalledByNative
|
| - private void setNativePtr(long nativePtr) {
|
| - assert mNativeTabAndroid == 0;
|
| - mNativeTabAndroid = nativePtr;
|
| - }
|
| -
|
| - @CalledByNative
|
| - private long getNativeInfoBarContainer() {
|
| - return getInfoBarContainer().getNative();
|
| - }
|
| -
|
| - /**
|
| - * Validates {@code id} and increments the internal counter to make sure future ids don't
|
| - * collide.
|
| - * @param id The current id. Maybe {@link #INVALID_TAB_ID}.
|
| - * @return A new id if {@code id} was {@link #INVALID_TAB_ID}, or {@code id}.
|
| - */
|
| - private static int generateValidId(int id) {
|
| - if (id == INVALID_TAB_ID) id = generateNextId();
|
| - incrementIdCounterTo(id + 1);
|
| -
|
| - return id;
|
| - }
|
| -
|
| - /**
|
| - * @return An unused id.
|
| - */
|
| - private static int generateNextId() {
|
| - return sIdCounter.getAndIncrement();
|
| - }
|
| -
|
| - private void pushNativePageStateToNavigationEntry() {
|
| - assert mNativeTabAndroid != 0 && getNativePage() != null;
|
| - nativeSetActiveNavigationEntryTitleForUrl(mNativeTabAndroid, getNativePage().getUrl(),
|
| - getNativePage().getTitle());
|
| - }
|
| -
|
| - /**
|
| - * Ensures the counter is at least as high as the specified value. The counter should always
|
| - * point to an unused ID (which will be handed out next time a request comes in). Exposed so
|
| - * that anything externally loading tabs and ids can set enforce new tabs start at the correct
|
| - * id.
|
| - * TODO(aurimas): Investigate reducing the visiblity of this method.
|
| - * @param id The minimum id we should hand out to the next new tab.
|
| - */
|
| - public static void incrementIdCounterTo(int id) {
|
| - int diff = id - sIdCounter.get();
|
| - if (diff <= 0) return;
|
| - // It's possible idCounter has been incremented between the get above and the add below
|
| - // but that's OK, because in the worst case we'll overly increment idCounter.
|
| - sIdCounter.addAndGet(diff);
|
| - }
|
| -
|
| - private native void nativeInit();
|
| - private native void nativeDestroy(long nativeTabAndroid);
|
| - private native void nativeInitWebContents(long nativeTabAndroid, boolean incognito,
|
| - ContentViewCore contentViewCore, ChromeWebContentsDelegateAndroid delegate,
|
| - ContextMenuPopulator contextMenuPopulator);
|
| - private native void nativeDestroyWebContents(long nativeTabAndroid, boolean deleteNative);
|
| - private native WebContents nativeGetWebContents(long nativeTabAndroid);
|
| - private native Profile nativeGetProfileAndroid(long nativeTabAndroid);
|
| - private native int nativeGetSecurityLevel(long nativeTabAndroid);
|
| - private native void nativeSetActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url,
|
| - String title);
|
| - private native boolean nativePrint(long nativeTabAndroid);
|
| -}
|
|
|