Index: chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
index 9a19635f6b5200dd89e1445b187604bcef6eba5f..ef448c77fbdfa4bcd96f479bb547e81be8d401ff 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java |
@@ -39,6 +39,7 @@ import org.chromium.base.VisibleForTesting; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.metrics.RecordHistogram; |
import org.chromium.base.metrics.RecordUserAction; |
+import org.chromium.blimp_public.contents.BlimpContents; |
import org.chromium.chrome.R; |
import org.chromium.chrome.browser.ChromeActivity; |
import org.chromium.chrome.browser.ChromeApplication; |
@@ -54,6 +55,7 @@ import org.chromium.chrome.browser.TabState.WebContentsState; |
import org.chromium.chrome.browser.UrlConstants; |
import org.chromium.chrome.browser.WebContentsFactory; |
import org.chromium.chrome.browser.banners.AppBannerManager; |
+import org.chromium.chrome.browser.blimp.BlimpClientContextFactory; |
import org.chromium.chrome.browser.bookmarks.BookmarkUtils; |
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; |
import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator; |
@@ -167,6 +169,9 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
/** Whether or not this tab is an incognito tab. */ |
private final boolean mIncognito; |
+ /** Whether or not this tab is running in blimp mode. */ |
+ private final boolean mBlimp; |
+ |
/** |
* An Application {@link Context}. Unlike {@link #mActivity}, this is the only one that is |
* publicly exposed to help prevent leaking the {@link Activity}. |
@@ -213,6 +218,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
private ContentViewClient mContentViewClient; |
private TabWebContentsObserver mWebContentsObserver; |
private TabWebContentsDelegateAndroid mWebContentsDelegate; |
+ private BlimpContents mBlimpContents; |
/** |
* If this tab was opened from another tab, store the id of the tab that |
@@ -648,6 +654,11 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
mThemeColor = mDefaultThemeColor; |
} |
+ mBlimp = BlimpClientContextFactory |
David Trainor- moved to gerrit
2016/08/18 17:06:30
We should pass this into tab. Some tabs will not
shaktisahu
2016/08/18 19:36:06
Yes, the creator should pass this to tab. But that
|
+ .getBlimpClientContextForProfile( |
+ Profile.getLastUsedProfile().getOriginalProfile()) |
+ .isBlimpEnabled(); |
David Trainor- moved to gerrit
2016/08/18 18:28:19
&& !mIsIncognito
shaktisahu
2016/08/18 19:36:06
Done.
|
+ |
// Restore data from the TabState, if it existed. |
if (frozenState != null) { |
assert type == TabLaunchType.FROM_RESTORE; |
@@ -734,29 +745,50 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
* @return Whether or not this tab has a previous navigation entry. |
*/ |
public boolean canGoBack() { |
- return getWebContents() != null && getWebContents().getNavigationController().canGoBack(); |
+ if (isBlimpTab()) { |
+ return getBlimpContents() != null |
+ && getBlimpContents().getNavigationController().canGoBack(); |
+ } else { |
+ return getWebContents() != null |
+ && getWebContents().getNavigationController().canGoBack(); |
+ } |
} |
/** |
* @return Whether or not this tab has a navigation entry after the current one. |
*/ |
public boolean canGoForward() { |
- return getWebContents() != null && getWebContents().getNavigationController() |
- .canGoForward(); |
+ if (isBlimpTab()) { |
+ return getBlimpContents() != null |
+ && getBlimpContents().getNavigationController().canGoForward(); |
+ } else { |
+ return getWebContents() != null |
+ && getWebContents().getNavigationController().canGoForward(); |
+ } |
} |
/** |
* Goes to the navigation entry before the current one. |
*/ |
public void goBack() { |
- if (getWebContents() != null) getWebContents().getNavigationController().goBack(); |
+ if (isBlimpTab()) { |
+ if (getBlimpContents() != null) getBlimpContents().getNavigationController().goBack(); |
+ } else { |
+ if (getWebContents() != null) getWebContents().getNavigationController().goBack(); |
+ } |
} |
/** |
* Goes to the navigation entry after the current one. |
*/ |
public void goForward() { |
- if (getWebContents() != null) getWebContents().getNavigationController().goForward(); |
+ if (isBlimpTab()) { |
+ if (getBlimpContents() != null) { |
+ getBlimpContents().getNavigationController().goForward(); |
+ } |
+ } else { |
+ if (getWebContents() != null) getWebContents().getNavigationController().goForward(); |
+ } |
} |
/** |
@@ -991,7 +1023,13 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
*/ |
public void reload() { |
// TODO(dtrainor): Should we try to rebuild the ContentView if it's frozen? |
- if (getWebContents() != null) getWebContents().getNavigationController().reload(true); |
+ if (isBlimpTab()) { |
+ if (getBlimpContents() != null) { |
+ getBlimpContents().getNavigationController().reload(); |
+ } |
+ } else { |
+ if (getWebContents() != null) getWebContents().getNavigationController().reload(true); |
+ } |
} |
/** |
@@ -1132,6 +1170,20 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
} |
/** |
+ * @return The {@link BlimpContents} associated with this tab, if in blimp mode. |
+ */ |
+ public BlimpContents getBlimpContents() { |
+ return mBlimpContents; |
+ } |
+ |
+ /** |
+ * @return Whether or not this tab is running in blimp mode. |
+ */ |
+ public boolean isBlimpTab() { |
+ return mBlimp; |
+ } |
+ |
+ /** |
* @return The profile associated with this tab. |
*/ |
public Profile getProfile() { |
@@ -1152,6 +1204,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
/** |
* @return Whether or not this tab is incognito. |
*/ |
+ @CalledByNative |
public boolean isIncognito() { |
return mIncognito; |
} |
@@ -1188,8 +1241,8 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
*/ |
public void setUseDesktopUserAgent(boolean useDesktop, boolean reloadOnChange) { |
if (getWebContents() != null) { |
- getWebContents().getNavigationController() |
- .setUseDesktopUserAgent(useDesktop, reloadOnChange); |
+ getWebContents().getNavigationController().setUseDesktopUserAgent( |
+ useDesktop, reloadOnChange); |
} |
} |
@@ -1197,8 +1250,8 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
* @return Whether or not the {@link ContentViewCore} is using a desktop user agent. |
*/ |
public boolean getUseDesktopUserAgent() { |
- return getWebContents() != null && getWebContents().getNavigationController() |
- .getUseDesktopUserAgent(); |
+ return getWebContents() != null |
+ && getWebContents().getNavigationController().getUseDesktopUserAgent(); |
} |
/** |
@@ -1450,6 +1503,12 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
return; |
} |
+ if (isBlimpTab() && getBlimpContents() == null) { |
+ nativeInitBlimpContents(mNativeTabAndroid); |
David Trainor- moved to gerrit
2016/08/18 17:06:30
Can we just return the BlimpContents from this?
shaktisahu
2016/08/18 19:36:06
Done. Removing the nativeGetBlimpContents method.
|
+ mBlimpContents = nativeGetBlimpContents(mNativeTabAndroid); |
+ getBlimpContents().addObserver(new TabBlimpContentsObserver(this)); |
+ } |
+ |
boolean creatingWebContents = webContents == null; |
if (creatingWebContents) { |
webContents = WebContentsFactory.createWebContents(isIncognito(), initiallyHidden); |
@@ -2016,6 +2075,8 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
destroyNativePageInternal(currentNativePage); |
destroyContentViewCore(true); |
+ mBlimpContents = null; |
David Trainor- moved to gerrit
2016/08/18 17:06:30
Who destroys this? When do we drop the native poi
shaktisahu
2016/08/18 19:36:06
The native pointer is a unique_ptr owned by TabAnd
David Trainor- moved to gerrit
2016/08/22 21:30:00
Can you add a comment to that effect? Thanks!
|
+ |
// 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 |
@@ -2050,6 +2111,10 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
public String getUrl() { |
String url = getWebContents() != null ? getWebContents().getUrl() : ""; |
+ if (isBlimpTab() && getBlimpContents() != null) { |
+ url = getBlimpContents().getNavigationController().getUrl(); |
+ } |
+ |
// If we have a ContentView, or a NativePage, or the url is not empty, we have a WebContents |
// so cache the WebContent's url. If not use the cached version. |
if (getContentViewCore() != null || getNativePage() != null || !TextUtils.isEmpty(url)) { |
@@ -2076,6 +2141,8 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
String title = ""; |
if (mNativePage != null) { |
title = mNativePage.getTitle(); |
+ } else if (getBlimpContents() != null) { |
+ title = getBlimpContents().getNavigationController().getTitle(); |
} else if (getWebContents() != null) { |
title = getWebContents().getTitle(); |
} |
@@ -3251,6 +3318,8 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, |
private native void nativeInitWebContents(long nativeTabAndroid, boolean incognito, |
WebContents webContents, TabWebContentsDelegateAndroid delegate, |
ContextMenuPopulator contextMenuPopulator); |
+ private native void nativeInitBlimpContents(long nativeTabAndroid); |
David Trainor- moved to gerrit
2016/08/18 18:28:19
Make this take a profile?
Profile profile = Profi
|
+ private native BlimpContents nativeGetBlimpContents(long nativeTabAndroid); |
private native void nativeUpdateDelegates(long nativeTabAndroid, |
TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator); |
private native void nativeDestroyWebContents(long nativeTabAndroid, boolean deleteNative); |