Bug 1346004 - Part 5 - Replace Gecko customtab tab attribute by a generic type attribute. r?sebastian
This'll allow customising context menu/session store/... behaviour in Gecko depending on the tab type, since in the future we might not only have special behaviour for custom tabs, but for web app tabs etc. as well.
MozReview-Commit-ID: LS6oGfO4KpR
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
@@ -967,17 +967,17 @@ public class Tabs implements BundleEvent
data.putString("url", url);
data.putString("engine", searchEngine);
data.putInt("parentId", parentId);
data.putBoolean("userEntered", userEntered);
data.putBoolean("isPrivate", isPrivate);
data.putBoolean("pinned", (flags & LOADURL_PINNED) != 0);
data.putBoolean("desktopMode", desktopMode);
- data.putBoolean("customTab", customTab);
+ data.putString("tabType", type.name());
final boolean needsNewTab;
final String applicationId = (intent == null) ? null :
intent.getStringExtra(Browser.EXTRA_APPLICATION_ID);
if (applicationId == null) {
needsNewTab = (flags & LOADURL_NEW_TAB) != 0;
} else {
// If you modify this code, be careful that intent != null.
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -1858,17 +1858,17 @@ var BrowserApp = {
selected: ("selected" in data) ? data.selected : !delayLoad,
parentId: ("parentId" in data) ? data.parentId : -1,
flags: flags,
tabID: data.tabID,
isPrivate: (data.isPrivate === true),
pinned: (data.pinned === true),
delayLoad: (delayLoad === true),
desktopMode: (data.desktopMode === true),
- customTab: ("customTab" in data) ? data.customTab : false
+ tabType: ("tabType" in data) ? data.tabType : "BROWSING"
};
params.userRequested = url;
if (data.engine) {
let engine = Services.search.getEngineByName(data.engine);
if (engine) {
let submission = engine.getSubmission(url);
@@ -3381,18 +3381,18 @@ nsBrowserAccess.prototype = {
// along with other OPEN_ values that create a new tab.
let newTab = (aWhere == Ci.nsIBrowserDOMWindow.OPEN_NEWWINDOW ||
aWhere == Ci.nsIBrowserDOMWindow.OPEN_NEWTAB ||
aWhere == Ci.nsIBrowserDOMWindow.OPEN_SWITCHTAB);
let isPrivate = false;
if (aOpener != null) {
let parent = BrowserApp.getTabForWindow(aOpener.top);
- if ((parent != null) && ("isCustomTab" in parent)) {
- newTab = newTab && !parent.isCustomTab;
+ if (parent != null) {
+ newTab = newTab && parent.tabType != "CUSTOMTAB";
}
}
if (newTab) {
let parentId = -1;
if (!isExternal && aOpener) {
let parent = BrowserApp.getTabForWindow(aOpener.top);
if (parent) {
@@ -3551,16 +3551,19 @@ Tab.prototype = {
// When the tab is stubbed from Java, there's a window between the stub
// creation and the tab creation in Gecko where the stub could be removed
// or the selected tab can change (which is easiest to hit during startup).
// To prevent these races, we need to differentiate between tab stubs from
// Java and new tabs from Gecko.
let stub = false;
+ // The authoritative list of possible tab types is the TabType enum in Tab.java.
+ this.type = "tabType" in aParams ? aParams.tabType : "BROWSING";
+
if (!aParams.zombifying) {
if ("tabID" in aParams) {
this.id = aParams.tabID;
stub = true;
} else {
let jenv = JNI.GetForThread();
let jTabs = JNI.LoadClass(jenv, "org.mozilla.gecko.Tabs", {
static_methods: [
@@ -3573,17 +3576,17 @@ Tab.prototype = {
this.desktopMode = ("desktopMode" in aParams) ? aParams.desktopMode : false;
this._parentId = ("parentId" in aParams && typeof aParams.parentId == "number")
? aParams.parentId : -1;
let message = {
type: "Tab:Added",
tabID: this.id,
- tabType: "BROWSING",
+ tabType: this.type,
uri: truncate(uri, MAX_URI_LENGTH),
parentId: this.parentId,
tabIndex: ("tabIndex" in aParams) ? aParams.tabIndex : -1,
external: ("external" in aParams) ? aParams.external : false,
selected: ("selected" in aParams || aParams.cancelEditMode === true)
? aParams.selected !== false || aParams.cancelEditMode === true : true,
cancelEditMode: aParams.cancelEditMode === true,
title: truncate(title, MAX_TITLE_LENGTH),
@@ -3653,17 +3656,16 @@ Tab.prototype = {
let flags = "flags" in aParams ? aParams.flags : Ci.nsIWebNavigation.LOAD_FLAGS_NONE;
let postData = ("postData" in aParams && aParams.postData) ? aParams.postData.value : null;
let referrerURI = "referrerURI" in aParams ? aParams.referrerURI : null;
let charset = "charset" in aParams ? aParams.charset : null;
// The search term the user entered to load the current URL
this.userRequested = "userRequested" in aParams ? aParams.userRequested : "";
this.isSearch = "isSearch" in aParams ? aParams.isSearch : false;
- this.isCustomTab = "customTab" in aParams ? aParams.customTab : false;
try {
this.browser.loadURIWithFlags(aURL, flags, referrerURI, charset, postData);
} catch(e) {
let message = {
type: "Content:LoadError",
tabID: this.id
};
--- a/mobile/android/components/SessionStore.js
+++ b/mobile/android/components/SessionStore.js
@@ -1111,16 +1111,17 @@ SessionStore.prototype = {
let tab = aWindow.BrowserApp.getTabForBrowser(aBrowser);
tabData.entries = aHistory.entries;
tabData.index = aHistory.index;
tabData.attributes = { image: aBrowser.mIconURL };
tabData.desktopMode = tab.desktopMode;
tabData.isPrivate = aBrowser.docShell.QueryInterface(Ci.nsILoadContext).usePrivateBrowsing;
tabData.tabId = tab.id;
tabData.parentId = tab.parentId;
+ tabData.type = tab.type;
aBrowser.__SS_data = tabData;
},
_collectWindowData: function ss__collectWindowData(aWindow) {
// Ignore windows not tracked by SessionStore
if (!aWindow.__SSID || !this._windows[aWindow.__SSID]) {
return;