зеркало из https://github.com/mozilla/pjs.git
Merge backout of revisions 33bcd05554f3, d8b5c9736831, 59c84742872f, f5a456d99df9, d580181e5434, 61e1aa1afa09, a1b563094e5a to fix Moth orange
This commit is contained in:
Коммит
b0c300fcac
|
@ -40,18 +40,15 @@ let TabView = {
|
|||
_deck: null,
|
||||
_iframe: null,
|
||||
_window: null,
|
||||
_initialized: false,
|
||||
_browserKeyHandlerInitialized: false,
|
||||
_isFrameLoading: false,
|
||||
_initFrameCallbacks: [],
|
||||
_lastSessionGroupName: null,
|
||||
PREF_BRANCH: "browser.panorama.",
|
||||
PREF_FIRST_RUN: "browser.panorama.experienced_first_run",
|
||||
PREF_STARTUP_PAGE: "browser.startup.page",
|
||||
PREF_RESTORE_ENABLED_ONCE: "browser.panorama.session_restore_enabled_once",
|
||||
GROUPS_IDENTIFIER: "tabview-groups",
|
||||
VISIBILITY_IDENTIFIER: "tabview-visibility",
|
||||
LAST_SESSION_GROUP_NAME_IDENTIFIER: "tabview-last-session-group-name",
|
||||
GROUPS_IDENTIFIER: "tabview-groups",
|
||||
|
||||
// ----------
|
||||
get windowTitle() {
|
||||
|
@ -92,9 +89,6 @@ let TabView = {
|
|||
|
||||
// ----------
|
||||
init: function TabView_init() {
|
||||
if (this._initialized)
|
||||
return;
|
||||
|
||||
if (this.firstUseExperienced) {
|
||||
if ((gBrowser.tabs.length - gBrowser.visibleTabs.length) > 0)
|
||||
this._setBrowserKeyHandlers();
|
||||
|
@ -126,16 +120,10 @@ let TabView = {
|
|||
};
|
||||
gBrowser.tabContainer.addEventListener(
|
||||
"TabShow", this._tabShowEventListener, true);
|
||||
|
||||
// grab the last used group title
|
||||
this._lastSessionGroupName = sessionstore.getWindowValue(window,
|
||||
this.LAST_SESSION_GROUP_NAME_IDENTIFIER);
|
||||
}
|
||||
}
|
||||
|
||||
Services.prefs.addObserver(this.PREF_BRANCH, this, false);
|
||||
|
||||
this._initialized = true;
|
||||
},
|
||||
|
||||
// ----------
|
||||
|
@ -150,17 +138,12 @@ let TabView = {
|
|||
// ----------
|
||||
// Uninitializes TabView.
|
||||
uninit: function TabView_uninit() {
|
||||
if (!this._initialized)
|
||||
return;
|
||||
|
||||
Services.prefs.removeObserver(this.PREF_BRANCH, this);
|
||||
|
||||
if (this._tabShowEventListener) {
|
||||
gBrowser.tabContainer.removeEventListener(
|
||||
"TabShow", this._tabShowEventListener, true);
|
||||
}
|
||||
|
||||
this._initialized = false;
|
||||
},
|
||||
|
||||
// ----------
|
||||
|
@ -253,28 +236,18 @@ let TabView = {
|
|||
},
|
||||
|
||||
getActiveGroupName: function TabView_getActiveGroupName() {
|
||||
if (!this._window)
|
||||
return this._lastSessionGroupName;
|
||||
|
||||
// We get the active group this way, instead of querying
|
||||
// GroupItems.getActiveGroupItem() because the tabSelect event
|
||||
// will not have happened by the time the browser tries to
|
||||
// update the title.
|
||||
let groupItem = null;
|
||||
let activeTab = window.gBrowser.selectedTab;
|
||||
let activeTabItem = activeTab._tabViewTabItem;
|
||||
|
||||
if (activeTab.pinned) {
|
||||
// It's an app tab, so it won't have a .tabItem. However, its .parent
|
||||
// will already be set as the active group.
|
||||
groupItem = this._window.GroupItems.getActiveGroupItem();
|
||||
} else if (activeTabItem) {
|
||||
groupItem = activeTabItem.parent;
|
||||
if (activeTab._tabViewTabItem && activeTab._tabViewTabItem.parent){
|
||||
let groupName = activeTab._tabViewTabItem.parent.getTitle();
|
||||
if (groupName)
|
||||
return groupName;
|
||||
}
|
||||
|
||||
// groupItem may still be null, if the active tab is an orphan.
|
||||
return groupItem ? groupItem.getTitle() : "";
|
||||
},
|
||||
return null;
|
||||
},
|
||||
|
||||
// ----------
|
||||
updateContextMenu: function(tab, popup) {
|
||||
|
|
|
@ -85,6 +85,19 @@ function Drag(item, event, isFauxDrag) {
|
|||
this.safeWindowBounds = Items.getSafeWindowBounds();
|
||||
|
||||
Trenches.activateOthersTrenches(this.el);
|
||||
|
||||
if (!isFauxDrag) {
|
||||
// When a tab drag starts, make it the focused tab.
|
||||
if (this.item.isAGroupItem) {
|
||||
var tab = UI.getActiveTab();
|
||||
if (!tab || tab.parent != this.item) {
|
||||
if (this.item._children.length)
|
||||
UI.setActive(this.item._children[0]);
|
||||
}
|
||||
} else if (this.item.isATabItem) {
|
||||
UI.setActive(this.item);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Drag.prototype = {
|
||||
|
|
|
@ -64,7 +64,6 @@
|
|||
// bounds - a <Rect>; otherwise based on the locations of the provided elements
|
||||
// container - a DOM element to use as the container for this groupItem; otherwise will create
|
||||
// title - the title for the groupItem; otherwise blank
|
||||
// focusTitle - focus the title's input field after creation
|
||||
// dontPush - true if this groupItem shouldn't push away or snap on creation; default is false
|
||||
// immediately - true if we want all placement immediately, not with animation
|
||||
function GroupItem(listOfEls, options) {
|
||||
|
@ -219,13 +218,12 @@ function GroupItem(listOfEls, options) {
|
|||
if (!same)
|
||||
return;
|
||||
|
||||
if (!self.isDragging)
|
||||
self.focusTitle();
|
||||
if (!self.isDragging) {
|
||||
self.$titleShield.hide();
|
||||
(self.$title)[0].focus();
|
||||
}
|
||||
});
|
||||
|
||||
if (options.focusTitle)
|
||||
this.focusTitle();
|
||||
|
||||
// ___ Stack Expander
|
||||
this.$expander = iQ("<div/>")
|
||||
.addClass("stackExpander")
|
||||
|
@ -406,14 +404,6 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
|
|||
this.$titleShield.css(css);
|
||||
},
|
||||
|
||||
// ----------
|
||||
// Function: focusTitle
|
||||
// Hide the title's shield and focus the underlying input field.
|
||||
focusTitle: function GroupItem_focusTitle() {
|
||||
this.$titleShield.hide();
|
||||
this.$title[0].focus();
|
||||
},
|
||||
|
||||
// ----------
|
||||
// Function: adjustAppTabTray
|
||||
// Used to adjust the appTabTray size, to split the appTabIcons across
|
||||
|
@ -786,7 +776,7 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
|
|||
return (groupItem != self && !groupItem.getChildren().length);
|
||||
});
|
||||
let group = (emptyGroups.length ? emptyGroups[0] : GroupItems.newGroup());
|
||||
group.newTab(null, { closedLastTab: true });
|
||||
group.newTab();
|
||||
}
|
||||
|
||||
this.destroy();
|
||||
|
@ -1024,7 +1014,8 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
|
|||
if (typeof item.setResizable == 'function')
|
||||
item.setResizable(false, options.immediately);
|
||||
|
||||
if (item == UI.getActiveTab() || !this._activeTab)
|
||||
// if it is visually active, set it as the active tab.
|
||||
if (iQ(item.container).hasClass("focus"))
|
||||
this.setActiveTab(item);
|
||||
|
||||
// if it matches the selected tab or no active tab and the browser
|
||||
|
@ -1791,16 +1782,14 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
|
|||
// ----------
|
||||
// Function: newTab
|
||||
// Creates a new tab within this groupItem.
|
||||
// Parameters:
|
||||
// url - the new tab should open this url as well
|
||||
// options - the options object
|
||||
// closedLastTab - boolean indicates the last tab has just been closed
|
||||
newTab: function GroupItem_newTab(url, options) {
|
||||
if (options && options.closedLastTab)
|
||||
UI.closedLastTabInTabView = true;
|
||||
|
||||
newTab: function GroupItem_newTab(url) {
|
||||
UI.setActive(this, { dontSetActiveTabInGroup: true });
|
||||
gBrowser.loadOneTab(url || "about:blank", { inBackground: false });
|
||||
let newTab = gBrowser.loadOneTab(url || "about:blank", {inBackground: true});
|
||||
|
||||
// TabItems will have handled the new tab and added the tabItem property.
|
||||
// We don't have to check if it's an app tab (and therefore wouldn't have a
|
||||
// TabItem), since we've just created it.
|
||||
newTab._tabViewTabItem.zoomIn(!url);
|
||||
},
|
||||
|
||||
// ----------
|
||||
|
|
|
@ -151,9 +151,10 @@ Item.prototype = {
|
|||
this.dragOptions = {
|
||||
cancelClass: 'close stackExpander',
|
||||
start: function(e, ui) {
|
||||
UI.setActive(this);
|
||||
if (this.isAGroupItem)
|
||||
if (this.isAGroupItem) {
|
||||
UI.setActive(this);
|
||||
this._unfreezeItemSize();
|
||||
}
|
||||
// if we start dragging a tab within a group, start with dropSpace on.
|
||||
else if (this.parent != null)
|
||||
this.parent._dropSpaceActive = true;
|
||||
|
@ -200,7 +201,8 @@ Item.prototype = {
|
|||
minWidth: 90,
|
||||
minHeight: 90,
|
||||
start: function(e,ui) {
|
||||
UI.setActive(this);
|
||||
if (this.isAGroupItem)
|
||||
UI.setActive(this);
|
||||
resize.info = new Drag(this, e);
|
||||
},
|
||||
resize: function(e,ui) {
|
||||
|
|
|
@ -220,15 +220,6 @@ let Storage = {
|
|||
win, win.TabView.VISIBILITY_IDENTIFIER, data);
|
||||
},
|
||||
|
||||
// ----------
|
||||
// Function: saveActiveGroupName
|
||||
// Saves the active group's name for the given window.
|
||||
saveActiveGroupName: function Storage_saveActiveGroupName(win) {
|
||||
let groupName = win.TabView.getActiveGroupName();
|
||||
this._sessionStore.setWindowValue(
|
||||
win, win.TabView.LAST_SESSION_GROUP_NAME_IDENTIFIER, groupName);
|
||||
},
|
||||
|
||||
// ----------
|
||||
// Function: saveData
|
||||
// Generic routine for saving data to a window.
|
||||
|
|
|
@ -379,7 +379,7 @@ TabItem.prototype = Utils.extend(new Item(), new Subscribable(), {
|
|||
}
|
||||
} else {
|
||||
// create tab by double click is handled in UI_init().
|
||||
if (!UI.creatingNewOrphanTab)
|
||||
if (!TabItems.creatingNewOrphanTab)
|
||||
GroupItems.newTab(self, {immediately: true});
|
||||
}
|
||||
|
||||
|
@ -563,7 +563,7 @@ TabItem.prototype = Utils.extend(new Item(), new Subscribable(), {
|
|||
});
|
||||
group = (emptyGroups.length ? emptyGroups[0] : GroupItems.newGroup());
|
||||
}
|
||||
group.newTab(null, { closedLastTab: true });
|
||||
group.newTab();
|
||||
}
|
||||
// when "TabClose" event is fired, the browser tab is about to close and our
|
||||
// item "close" is fired before the browser tab actually get closed.
|
||||
|
@ -665,8 +665,6 @@ TabItem.prototype = Utils.extend(new Item(), new Subscribable(), {
|
|||
}
|
||||
if (self.parent && self.parent.expanded)
|
||||
self.parent.collapse();
|
||||
|
||||
self._sendToSubscribers("zoomedIn");
|
||||
}
|
||||
|
||||
let animateZoom = gPrefBranch.getBoolPref("animate_zoom");
|
||||
|
@ -805,6 +803,7 @@ let TabItems = {
|
|||
_lastUpdateTime: Date.now(),
|
||||
_eventListeners: [],
|
||||
_pauseUpdateForTest: false,
|
||||
creatingNewOrphanTab: false,
|
||||
tempCanvas: null,
|
||||
_reconnectingPaused: false,
|
||||
tabItemPadding: {},
|
||||
|
|
|
@ -128,7 +128,8 @@ let UI = {
|
|||
_storageBusyCount: 0,
|
||||
|
||||
// Variable: isDOMWindowClosing
|
||||
// Tells wether the parent window is about to close
|
||||
// Tells wether we already received the "domwindowclosed" event and the parent
|
||||
// windows is about to close.
|
||||
isDOMWindowClosing: false,
|
||||
|
||||
// Variable: _browserKeys
|
||||
|
@ -139,14 +140,6 @@ let UI = {
|
|||
// Used to prevent keypress being handled after quitting search mode.
|
||||
ignoreKeypressForSearch: false,
|
||||
|
||||
// Variable: creatingNewOrphanTab
|
||||
// Used to keep track of whether we are creating a new oprhan tab or not.
|
||||
creatingNewOrphanTab: false,
|
||||
|
||||
// Variable: _lastOpenedTab
|
||||
// Used to keep track of the last opened tab.
|
||||
_lastOpenedTab: null,
|
||||
|
||||
// ----------
|
||||
// Function: toString
|
||||
// Prints [UI] for debug use
|
||||
|
@ -204,21 +197,20 @@ let UI = {
|
|||
(self._lastClickPositions.y - self.DBLCLICK_OFFSET) <= e.clientY &&
|
||||
(self._lastClickPositions.y + self.DBLCLICK_OFFSET) >= e.clientY) {
|
||||
self.setActive(null);
|
||||
self.creatingNewOrphanTab = true;
|
||||
TabItems.creatingNewOrphanTab = true;
|
||||
|
||||
let newTab =
|
||||
gBrowser.loadOneTab("about:blank", { inBackground: true });
|
||||
|
||||
let box =
|
||||
new Rect(e.clientX - Math.floor(TabItems.tabWidth/2),
|
||||
e.clientY - Math.floor(TabItems.tabHeight/2),
|
||||
TabItems.tabWidth, TabItems.tabHeight);
|
||||
let newTab =
|
||||
gBrowser.loadOneTab("about:blank", { inBackground: false });
|
||||
|
||||
newTab._tabViewTabItem.setBounds(box, true);
|
||||
newTab._tabViewTabItem.pushAway(true);
|
||||
self.setActive(newTab._tabViewTabItem);
|
||||
|
||||
self.creatingNewOrphanTab = false;
|
||||
// the bounds of tab item is set and we can zoom in now.
|
||||
TabItems.creatingNewOrphanTab = false;
|
||||
newTab._tabViewTabItem.zoomIn(true);
|
||||
|
||||
self._lastClick = 0;
|
||||
|
@ -265,19 +257,21 @@ let UI = {
|
|||
self._resize();
|
||||
});
|
||||
|
||||
// ___ setup event listener to save canvas images
|
||||
gWindow.addEventListener("SSWindowClosing", function onWindowClosing() {
|
||||
gWindow.removeEventListener("SSWindowClosing", onWindowClosing, false);
|
||||
|
||||
self.isDOMWindowClosing = true;
|
||||
|
||||
if (self.isTabViewVisible())
|
||||
GroupItems.removeHiddenGroups();
|
||||
|
||||
Storage.saveActiveGroupName(gWindow);
|
||||
TabItems.saveAll(true);
|
||||
self._save();
|
||||
}, false);
|
||||
// ___ setup observer to save canvas images
|
||||
function domWinClosedObserver(subject, topic, data) {
|
||||
if (topic == "domwindowclosed" && subject == gWindow) {
|
||||
self.isDOMWindowClosing = true;
|
||||
if (self.isTabViewVisible())
|
||||
GroupItems.removeHiddenGroups();
|
||||
TabItems.saveAll(true);
|
||||
self._save();
|
||||
}
|
||||
}
|
||||
Services.obs.addObserver(
|
||||
domWinClosedObserver, "domwindowclosed", false);
|
||||
this._cleanupFunctions.push(function() {
|
||||
Services.obs.removeObserver(domWinClosedObserver, "domwindowclosed");
|
||||
});
|
||||
|
||||
// ___ Done
|
||||
this._frameInitialized = true;
|
||||
|
@ -736,8 +730,6 @@ let UI = {
|
|||
// if it's an app tab, add it to all the group items
|
||||
if (tab.pinned)
|
||||
GroupItems.addAppTab(tab);
|
||||
else if (self.isTabViewVisible())
|
||||
self._lastOpenedTab = tab;
|
||||
};
|
||||
|
||||
// TabClose
|
||||
|
@ -872,40 +864,30 @@ let UI = {
|
|||
// Function: onTabSelect
|
||||
// Called when the user switches from one tab to another outside of the TabView UI.
|
||||
onTabSelect: function UI_onTabSelect(tab) {
|
||||
let currentTab = this._currentTab;
|
||||
this._currentTab = tab;
|
||||
|
||||
if (this.isTabViewVisible()) {
|
||||
if (!this.restoredClosedTab && this._lastOpenedTab == tab &&
|
||||
tab._tabViewTabItem) {
|
||||
if (!this.creatingNewOrphanTab)
|
||||
tab._tabViewTabItem.zoomIn(true);
|
||||
this._lastOpenedTab = null;
|
||||
return;
|
||||
}
|
||||
if (this._closedLastVisibleTab ||
|
||||
(this._closedSelectedTabInTabView && !this.closedLastTabInTabView) ||
|
||||
this.restoredClosedTab) {
|
||||
if (this.restoredClosedTab) {
|
||||
// when the tab view UI is being displayed, update the thumb for the
|
||||
// restored closed tab after the page load
|
||||
tab.linkedBrowser.addEventListener("load", function (event) {
|
||||
tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
|
||||
TabItems._update(tab);
|
||||
}, true);
|
||||
}
|
||||
this._closedLastVisibleTab = false;
|
||||
this._closedSelectedTabInTabView = false;
|
||||
this.closedLastTabInTabView = false;
|
||||
this.restoredClosedTab = false;
|
||||
return;
|
||||
// if the last visible tab has just been closed, don't show the chrome UI.
|
||||
if (this.isTabViewVisible() &&
|
||||
(this._closedLastVisibleTab || this._closedSelectedTabInTabView ||
|
||||
this.restoredClosedTab)) {
|
||||
if (this.restoredClosedTab) {
|
||||
// when the tab view UI is being displayed, update the thumb for the
|
||||
// restored closed tab after the page load
|
||||
tab.linkedBrowser.addEventListener("load", function (event) {
|
||||
tab.linkedBrowser.removeEventListener("load", arguments.callee, true);
|
||||
TabItems._update(tab);
|
||||
}, true);
|
||||
}
|
||||
this._closedLastVisibleTab = false;
|
||||
this._closedSelectedTabInTabView = false;
|
||||
this.restoredClosedTab = false;
|
||||
return;
|
||||
}
|
||||
// reset these vars, just in case.
|
||||
this._closedLastVisibleTab = false;
|
||||
this._closedSelectedTabInTabView = false;
|
||||
this.closedLastTabInTabView = false;
|
||||
this.restoredClosedTab = false;
|
||||
this._lastOpenedTab = null;
|
||||
|
||||
// if TabView is visible but we didn't just close the last tab or
|
||||
// selected tab, show chrome.
|
||||
|
@ -917,7 +899,12 @@ let UI = {
|
|||
if (this._currentTab != tab)
|
||||
return;
|
||||
|
||||
let oldItem = null;
|
||||
let newItem = null;
|
||||
|
||||
if (currentTab && currentTab._tabViewTabItem)
|
||||
oldItem = currentTab._tabViewTabItem;
|
||||
|
||||
// update the tab bar for the new tab's group
|
||||
if (tab && tab._tabViewTabItem) {
|
||||
if (!TabItems.reconnectingPaused()) {
|
||||
|
@ -1337,8 +1324,7 @@ let UI = {
|
|||
insideTabs.push(tab);
|
||||
}
|
||||
|
||||
let opts = {bounds: bounds, focusTitle: true};
|
||||
let groupItem = new GroupItem(insideTabs, opts);
|
||||
var groupItem = new GroupItem(insideTabs,{bounds:bounds});
|
||||
self.setActive(groupItem);
|
||||
phantom.remove();
|
||||
dragOutInfo = null;
|
||||
|
@ -1515,14 +1501,14 @@ let UI = {
|
|||
return (!groupItem.hidden && groupItem.getChildren().length > 0);
|
||||
});
|
||||
// no pinned tabs, no visible groups and no orphaned tabs: open a new
|
||||
// group, a blank tab and return
|
||||
// group. open a blank tab and return
|
||||
if (!unhiddenGroups.length && !GroupItems.getOrphanedTabs().length) {
|
||||
let emptyGroups = GroupItems.groupItems.filter(function (groupItem) {
|
||||
return (!groupItem.hidden && !groupItem.getChildren().length);
|
||||
});
|
||||
let group = (emptyGroups.length ? emptyGroups[0] : GroupItems.newGroup());
|
||||
if (!gBrowser._numPinnedTabs) {
|
||||
group.newTab(null, { closedLastTab: true });
|
||||
group.newTab();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,6 @@ _BROWSER_FILES = \
|
|||
browser_tabview_bug590606.js \
|
||||
browser_tabview_bug591706.js \
|
||||
browser_tabview_bug594958.js \
|
||||
browser_tabview_bug595020.js \
|
||||
browser_tabview_bug595191.js \
|
||||
browser_tabview_bug595436.js \
|
||||
browser_tabview_bug595518.js \
|
||||
|
@ -85,7 +84,6 @@ _BROWSER_FILES = \
|
|||
browser_tabview_bug604699.js \
|
||||
browser_tabview_bug606657.js \
|
||||
browser_tabview_bug606905.js \
|
||||
browser_tabview_bug607108.js \
|
||||
browser_tabview_bug608037.js \
|
||||
browser_tabview_bug608184.js \
|
||||
browser_tabview_bug608158.js \
|
||||
|
@ -142,11 +140,9 @@ _BROWSER_FILES = \
|
|||
browser_tabview_bug648882.js \
|
||||
browser_tabview_bug649006.js \
|
||||
browser_tabview_bug649307.js \
|
||||
browser_tabview_bug649319.js \
|
||||
browser_tabview_bug650573.js \
|
||||
browser_tabview_bug651311.js \
|
||||
browser_tabview_bug654941.js \
|
||||
browser_tabview_bug655269.js \
|
||||
browser_tabview_bug656778.js \
|
||||
browser_tabview_bug656913.js \
|
||||
browser_tabview_dragdrop.js \
|
||||
|
|
|
@ -36,23 +36,20 @@ function test3() {
|
|||
ok(!contentWindow.isSearchEnabled(), "The search is disabled")
|
||||
|
||||
is(gBrowser.tabs.length, 1, "There is one tab before cmd/ctrl + t is pressed");
|
||||
|
||||
whenTabViewIsHidden(function() {
|
||||
is(gBrowser.tabs.length, 2, "There are two tabs after cmd/ctrl + t is pressed");
|
||||
|
||||
gBrowser.tabs[0].linkedBrowser.loadURI("about:robots");
|
||||
gBrowser.tabs[1].linkedBrowser.loadURI("http://example.com/");
|
||||
|
||||
afterAllTabsLoaded(function () {
|
||||
showTabView(test4);
|
||||
});
|
||||
});
|
||||
EventUtils.synthesizeKey("t", { accelKey: true }, contentWindow);
|
||||
is(gBrowser.tabs.length, 2, "There are two tabs after cmd/ctrl + t is pressed");
|
||||
|
||||
gBrowser.tabs[0].linkedBrowser.loadURI("about:robots");
|
||||
gBrowser.tabs[1].linkedBrowser.loadURI("http://example.com/");
|
||||
|
||||
afterAllTabsLoaded(function () {
|
||||
showTabView(test4);
|
||||
});
|
||||
}
|
||||
|
||||
function test4() {
|
||||
is(gBrowser.tabs.length, 2, "There are two tabs");
|
||||
|
||||
|
||||
let onTabClose = function() {
|
||||
gBrowser.tabContainer.removeEventListener("TabClose", onTabClose, true);
|
||||
executeSoon(function() {
|
||||
|
@ -62,7 +59,7 @@ function test4() {
|
|||
is(gBrowser.tabs.length, 2, "There are two tabs after restoring one");
|
||||
|
||||
gBrowser.tabs[0].linkedBrowser.loadURI("about:blank");
|
||||
gBrowser.selectedTab = gBrowser.tabs[0];
|
||||
gBrowser.removeTab(gBrowser.tabs[1]);
|
||||
test8();
|
||||
});
|
||||
};
|
||||
|
@ -72,14 +69,14 @@ function test4() {
|
|||
|
||||
// below key combination shouldn't trigger actions in tabview UI
|
||||
function test8() {
|
||||
showTabView(function() {
|
||||
is(gBrowser.tabs.length, 2, "There are two tabs before cmd/ctrl + w is pressed");
|
||||
EventUtils.synthesizeKey("w", { accelKey: true }, contentWindow);
|
||||
is(gBrowser.tabs.length, 2, "There are two tabs after cmd/ctrl + w is pressed");
|
||||
let newTab = gBrowser.loadOneTab("about:blank", { inBackground: true });
|
||||
|
||||
gBrowser.removeTab(gBrowser.tabs[1]);
|
||||
test9();
|
||||
});
|
||||
is(gBrowser.tabs.length, 2, "There are two tabs before cmd/ctrl + w is pressed");
|
||||
EventUtils.synthesizeKey("w", { accelKey: true }, contentWindow);
|
||||
is(gBrowser.tabs.length, 2, "There are two tabs after cmd/ctrl + w is pressed");
|
||||
|
||||
gBrowser.removeTab(newTab);
|
||||
test9();
|
||||
}
|
||||
|
||||
function test9() {
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
|
||||
|
||||
let stateStartup = {windows:[
|
||||
{tabs:[{entries:[{url:"about:home"}]}], extData:{"tabview-last-session-group-name":"title"}}
|
||||
]};
|
||||
|
||||
function test() {
|
||||
let assertWindowTitle = function (win, title) {
|
||||
let browser = win.gBrowser.tabs[0].linkedBrowser;
|
||||
let winTitle = win.gBrowser.getWindowTitleForBrowser(browser);
|
||||
is(winTitle.indexOf(title), 0, "title starts with '" + title + "'");
|
||||
};
|
||||
|
||||
let testGroupNameChange = function (win) {
|
||||
showTabView(function () {
|
||||
let cw = win.TabView.getContentWindow();
|
||||
let groupItem = cw.GroupItems.groupItems[0];
|
||||
groupItem.setTitle("new-title");
|
||||
|
||||
hideTabView(function () {
|
||||
assertWindowTitle(win, "new-title");
|
||||
waitForFocus(finish);
|
||||
}, win);
|
||||
}, win);
|
||||
};
|
||||
|
||||
waitForExplicitFinish();
|
||||
|
||||
newWindowWithState(stateStartup, function (win) {
|
||||
registerCleanupFunction(function () win.close());
|
||||
assertWindowTitle(win, "title");
|
||||
testGroupNameChange(win);
|
||||
});
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
newWindowWithTabView(function (win) {
|
||||
registerCleanupFunction(function () win.close());
|
||||
|
||||
let cw = win.TabView.getContentWindow();
|
||||
let content = cw.document.getElementById("content");
|
||||
|
||||
let groupItems = cw.GroupItems.groupItems;
|
||||
is(groupItems.length, 1, "there is one groupItem");
|
||||
groupItems[0].setSize(150, 150, true);
|
||||
|
||||
waitForFocus(function () {
|
||||
// drag to create a new group
|
||||
EventUtils.synthesizeMouse(content, 200, 50, {type: "mousedown"}, cw);
|
||||
EventUtils.synthesizeMouse(content, 400, 250, {type: "mousemove"}, cw);
|
||||
EventUtils.synthesizeMouse(content, 200, 50, {type: "mouseup"}, cw);
|
||||
|
||||
// enter a title for the new group
|
||||
EventUtils.synthesizeKey("t", {}, cw);
|
||||
EventUtils.synthesizeKey("VK_RETURN", {}, cw);
|
||||
|
||||
is(groupItems.length, 2, "there are two groupItems");
|
||||
is(groupItems[1].getTitle(), "t", "new groupItem's title is correct");
|
||||
|
||||
waitForFocus(finish);
|
||||
}, cw);
|
||||
});
|
||||
}
|
|
@ -64,8 +64,11 @@ function part1(win) {
|
|||
|
||||
ok(!contentWindow.UI.getActiveOrphanTab(), "There is no active orphan tab.");
|
||||
ok(win.TabView.isVisible(), "Tab View is visible.");
|
||||
|
||||
whenTabViewIsHidden(part4, win);
|
||||
|
||||
win.gBrowser.tabContainer.addEventListener("TabSelect", function() {
|
||||
win.gBrowser.tabContainer.removeEventListener("TabSelect", arguments.callee, false);
|
||||
executeSoon(part4);
|
||||
}, false);
|
||||
win.document.getElementById("cmd_newNavigatorTab").doCommand();
|
||||
}
|
||||
|
||||
|
|
|
@ -2,51 +2,63 @@
|
|||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
function test() {
|
||||
let win, contentWindow, originalTab, newTab1, newTab2;
|
||||
waitForExplicitFinish();
|
||||
|
||||
let originalTab = gBrowser.visibleTabs[0];
|
||||
let newTab1 = gBrowser.addTab("about:blank", { skipAnimation: true });
|
||||
let newTab2 = gBrowser.addTab("about:blank", { skipAnimation: true });
|
||||
|
||||
gBrowser.pinTab(newTab1);
|
||||
|
||||
let contentWindow;
|
||||
|
||||
let partOne = function() {
|
||||
window.removeEventListener("tabviewshown", partOne, false);
|
||||
|
||||
contentWindow = document.getElementById("tab-view").contentWindow;
|
||||
is(contentWindow.GroupItems.groupItems.length, 1, "There is only one group item");
|
||||
|
||||
let partOne = function () {
|
||||
let groupItem = contentWindow.GroupItems.groupItems[0];
|
||||
let tabItems = groupItem.getChildren();
|
||||
is(tabItems.length, 2, "There are two tab items in that group item");
|
||||
is(tabItems[0].tab, originalTab, "The first tab item is linked to the first tab");
|
||||
is(tabItems[1].tab, newTab2, "The second tab item is linked to the second tab");
|
||||
|
||||
hideTabView(partTwo, win);
|
||||
window.addEventListener("tabviewhidden", partTwo, false);
|
||||
TabView.toggle();
|
||||
};
|
||||
|
||||
let partTwo = function () {
|
||||
win.gBrowser.unpinTab(newTab1);
|
||||
showTabView(partThree, win);
|
||||
let partTwo = function() {
|
||||
window.removeEventListener("tabviewhidden", partTwo, false);
|
||||
|
||||
gBrowser.unpinTab(newTab1);
|
||||
|
||||
window.addEventListener("tabviewshown", partThree, false);
|
||||
TabView.toggle();
|
||||
};
|
||||
|
||||
let partThree = function () {
|
||||
let partThree = function() {
|
||||
window.removeEventListener("tabviewshown", partThree, false);
|
||||
|
||||
let tabItems = contentWindow.GroupItems.groupItems[0].getChildren();
|
||||
is(tabItems.length, 3, "There are three tab items in that group item");
|
||||
is(tabItems[0].tab, win.gBrowser.tabs[0], "The first tab item is linked to the first tab");
|
||||
is(tabItems[1].tab, win.gBrowser.tabs[1], "The second tab item is linked to the second tab");
|
||||
is(tabItems[2].tab, win.gBrowser.tabs[2], "The third tab item is linked to the third tab");
|
||||
is(tabItems[0].tab, gBrowser.visibleTabs[0], "The first tab item is linked to the first tab");
|
||||
is(tabItems[1].tab, gBrowser.visibleTabs[1], "The second tab item is linked to the second tab");
|
||||
is(tabItems[2].tab, gBrowser.visibleTabs[2], "The third tab item is linked to the third tab");
|
||||
|
||||
window.addEventListener("tabviewhidden", endGame, false);
|
||||
TabView.toggle();
|
||||
};
|
||||
|
||||
let endGame = function() {
|
||||
window.removeEventListener("tabviewhidden", endGame, false);
|
||||
|
||||
gBrowser.removeTab(newTab1);
|
||||
gBrowser.removeTab(newTab2);
|
||||
|
||||
finish();
|
||||
};
|
||||
|
||||
let onLoad = function (tvwin) {
|
||||
win = tvwin;
|
||||
registerCleanupFunction(function () win.close());
|
||||
|
||||
for (let i = 0; i < 2; i++)
|
||||
win.gBrowser.loadOneTab("about:blank", {inBackground: true});
|
||||
|
||||
[originalTab, newTab1, newTab2] = win.gBrowser.tabs;
|
||||
win.gBrowser.pinTab(newTab1);
|
||||
};
|
||||
|
||||
let onShow = function () {
|
||||
contentWindow = win.TabView.getContentWindow();
|
||||
is(contentWindow.GroupItems.groupItems.length, 1, "There is only one group item");
|
||||
|
||||
partOne();
|
||||
};
|
||||
|
||||
waitForExplicitFinish();
|
||||
newWindowWithTabView(onShow, onLoad);
|
||||
window.addEventListener("tabviewshown", partOne, false);
|
||||
TabView.toggle();
|
||||
}
|
||||
|
|
|
@ -1,86 +0,0 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
let origTab = gBrowser.visibleTabs[0];
|
||||
let contentWindow;
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
test1();
|
||||
}
|
||||
|
||||
// Open a new tab when the active tab item belongs to a group item.
|
||||
function test1() {
|
||||
registerCleanupFunction(function () TabView.hide());
|
||||
|
||||
showTabView(function() {
|
||||
ok(origTab._tabViewTabItem.parent, "The original tab belongs to a group");
|
||||
|
||||
contentWindow = TabView.getContentWindow();
|
||||
contentWindow.UI.setActive(origTab._tabViewTabItem);
|
||||
|
||||
testCreateTabAndThen(test2);
|
||||
});
|
||||
}
|
||||
|
||||
// Open a new tab when the active tab item is nothing.
|
||||
function test2() {
|
||||
showTabView(function() {
|
||||
contentWindow.UI.setActive(null, { onlyRemoveActiveTab: true });
|
||||
|
||||
testCreateTabAndThen(test3);
|
||||
});
|
||||
}
|
||||
|
||||
// Open a new tab when the active tab item is an orphan tab.
|
||||
function test3() {
|
||||
showTabView(function() {
|
||||
let groupItem = origTab._tabViewTabItem.parent;
|
||||
let tabItems = groupItem.getChildren();
|
||||
is(tabItems.length, 3, "There are 3 tab items in the group");
|
||||
|
||||
let lastTabItem = tabItems[tabItems.length - 1];
|
||||
groupItem.remove(lastTabItem);
|
||||
|
||||
let orphanedTabs = contentWindow.GroupItems.getOrphanedTabs();
|
||||
is(orphanedTabs.length, 1, "There should be 1 orphan tab");
|
||||
is(orphanedTabs[0], lastTabItem, "The tab item is the same as the orphan tab");
|
||||
|
||||
contentWindow.UI.setActive(lastTabItem);
|
||||
|
||||
testCreateTabAndThen(function() {
|
||||
hideTabView(finish);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function testCreateTabAndThen(callback) {
|
||||
ok(TabView.isVisible(), "Tab View is visible");
|
||||
|
||||
// detect tab open and zoomed in event.
|
||||
let onTabOpen = function(event) {
|
||||
gBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen, false);
|
||||
|
||||
// ensure that the default tabview listener is called before so the
|
||||
// tab._tabViewTabItem exists
|
||||
executeSoon(function() {
|
||||
let tab = event.target;
|
||||
tabItem = tab._tabViewTabItem;
|
||||
ok(tabItem, "Tab item is available after tab open");
|
||||
|
||||
registerCleanupFunction(function () gBrowser.removeTab(tab))
|
||||
|
||||
tabItem.addSubscriber(tabItem, "zoomedIn", function() {
|
||||
tabItem.removeSubscriber(tabItem, "zoomedIn");
|
||||
|
||||
is(gBrowser.selectedTab, tab,
|
||||
"The selected tab is the same as the newly opened tab");
|
||||
executeSoon(callback);
|
||||
});
|
||||
});
|
||||
}
|
||||
gBrowser.tabContainer.addEventListener("TabOpen", onTabOpen, false);
|
||||
// use the menu item (the same as pressing cmd/ctrl + t)
|
||||
document.getElementById("menu_newNavigatorTab").doCommand();
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
newWindowWithTabView(function (win) {
|
||||
registerCleanupFunction(function () win.close());
|
||||
waitForFocus(function () testScenarios(win));
|
||||
});
|
||||
}
|
||||
|
||||
function testScenarios(win) {
|
||||
let simulateDragDrop = function (target) {
|
||||
EventUtils.synthesizeMouseAtCenter(target, {type: "mousedown"}, cw);
|
||||
EventUtils.synthesizeMouse(target, 40, 20, {type: "mousemove"}, cw);
|
||||
EventUtils.synthesizeMouse(target, 80, 20, {type: "mouseup"}, cw);
|
||||
}
|
||||
|
||||
let dragOutOfGroup = function (target) {
|
||||
EventUtils.synthesizeMouseAtCenter(target, {type: "mousedown"}, cw);
|
||||
EventUtils.synthesizeMouse(target, 600, 5, {type: "mousemove"}, cw);
|
||||
EventUtils.synthesizeMouse(target, 600, 5, {type: "mouseup"}, cw);
|
||||
}
|
||||
|
||||
let dragIntoGroup = function (target) {
|
||||
EventUtils.synthesizeMouseAtCenter(target, {type: "mousedown"}, cw);
|
||||
EventUtils.synthesizeMouse(target, -200, 5, {type: "mousemove"}, cw);
|
||||
EventUtils.synthesizeMouse(target, -200, 5, {type: "mouseup"}, cw);
|
||||
}
|
||||
|
||||
let assertActiveOrphan = function (tabItem) {
|
||||
ok(!cw.GroupItems.getActiveGroupItem(), "no groupItem is active");
|
||||
is(cw.UI.getActiveTab(), tabItem, "orphan tab is active");
|
||||
is(cw.UI.getActiveOrphanTab(), tabItem, "orphan tab is active");
|
||||
}
|
||||
|
||||
let cw = win.TabView.getContentWindow();
|
||||
let groupItem = cw.GroupItems.groupItems[0];
|
||||
let groupItem2 = createGroupItemWithBlankTabs(win, 400, 300, 20, 4);
|
||||
|
||||
// move group
|
||||
cw.UI.setActive(groupItem);
|
||||
simulateDragDrop(groupItem2.container);
|
||||
is(cw.GroupItems.getActiveGroupItem(), groupItem2, "second groupItem is active");
|
||||
is(cw.UI.getActiveTab(), groupItem2.getChild(0), "second groupItem's first tab is active");
|
||||
|
||||
// resize group
|
||||
cw.UI.setActive(groupItem);
|
||||
let tabItem = groupItem2.getChild(2);
|
||||
groupItem2.setActiveTab(tabItem);
|
||||
simulateDragDrop(groupItem2.$resizer[0]);
|
||||
is(cw.GroupItems.getActiveGroupItem(), groupItem2, "second groupItem is active");
|
||||
is(cw.UI.getActiveTab(), tabItem, "second groupItem's third tab is active");
|
||||
|
||||
// create orphan
|
||||
tabItem = groupItem2.getChild(0);
|
||||
dragOutOfGroup(tabItem.container);
|
||||
|
||||
// move orphan
|
||||
cw.UI.setActive(groupItem2);
|
||||
simulateDragDrop(tabItem.container);
|
||||
assertActiveOrphan(tabItem);
|
||||
|
||||
// resize orphan
|
||||
cw.UI.setActive(groupItem2);
|
||||
let $resizer = cw.iQ('.iq-resizable-handle', tabItem.container);
|
||||
simulateDragDrop($resizer[0]);
|
||||
assertActiveOrphan(tabItem);
|
||||
|
||||
// drag back into group
|
||||
dragIntoGroup(tabItem.container);
|
||||
cw.UI.setActive(groupItem);
|
||||
cw.UI.setActive(groupItem2);
|
||||
is(cw.UI.getActiveTab(), tabItem, "the dropped tab is active");
|
||||
|
||||
// hide + unhide groupItem
|
||||
hideGroupItem(groupItem2, function () {
|
||||
is(cw.GroupItems.getActiveGroupItem(), groupItem, "first groupItem is active");
|
||||
|
||||
unhideGroupItem(groupItem2, function () {
|
||||
is(cw.GroupItems.getActiveGroupItem(), groupItem2, "second groupItem is active");
|
||||
is(cw.UI.getActiveTab(), tabItem, "the dropped tab is active");
|
||||
|
||||
finish();
|
||||
});
|
||||
});
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
newWindowWithTabView(function (win) {
|
||||
let cw = win.TabView.getContentWindow();
|
||||
let tabItem = win.gBrowser.tabs[0]._tabViewTabItem;
|
||||
|
||||
tabItem.addSubscriber(tabItem, "savedCachedImageData", function () {
|
||||
tabItem.removeSubscriber(tabItem, "savedCachedImageData");
|
||||
|
||||
ok(cw.UI.isDOMWindowClosing, "dom window is closing");
|
||||
waitForFocus(finish);
|
||||
});
|
||||
|
||||
win.close();
|
||||
});
|
||||
}
|
|
@ -869,14 +869,7 @@ SessionStoreService.prototype = {
|
|||
if (!aWindow.__SSi || !this._windows[aWindow.__SSi]) {
|
||||
return;
|
||||
}
|
||||
|
||||
// notify that the session store will stop tracking this window so that
|
||||
// extensions can store any data about this window in session store before
|
||||
// that's not possible anymore
|
||||
let event = aWindow.document.createEvent("Events");
|
||||
event.initEvent("SSWindowClosing", true, false);
|
||||
aWindow.dispatchEvent(event);
|
||||
|
||||
|
||||
if (this.windowToFocus && this.windowToFocus == aWindow) {
|
||||
delete this.windowToFocus;
|
||||
}
|
||||
|
|
|
@ -147,7 +147,6 @@ _BROWSER_TEST_FILES = \
|
|||
browser_628270.js \
|
||||
browser_635418.js \
|
||||
browser_636279.js \
|
||||
browser_659591.js \
|
||||
$(NULL)
|
||||
|
||||
ifneq ($(OS_ARCH),Darwin)
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
let eventReceived = false;
|
||||
|
||||
registerCleanupFunction(function () {
|
||||
ok(eventReceived, "SSWindowClosing event received");
|
||||
});
|
||||
|
||||
newWindow(function (win) {
|
||||
win.addEventListener("SSWindowClosing", function onWindowClosing() {
|
||||
win.removeEventListener("SSWindowClosing", onWindowClosing, false);
|
||||
eventReceived = true;
|
||||
waitForFocus(finish);
|
||||
}, false);
|
||||
|
||||
win.close();
|
||||
});
|
||||
}
|
||||
|
||||
function newWindow(callback) {
|
||||
let opts = "chrome,all,dialog=no,height=800,width=800";
|
||||
let win = window.openDialog(getBrowserURL(), "_blank", opts);
|
||||
|
||||
win.addEventListener("load", function onLoad() {
|
||||
win.removeEventListener("load", onLoad, false);
|
||||
executeSoon(function () callback(win));
|
||||
}, false);
|
||||
}
|
Загрузка…
Ссылка в новой задаче