2007-08-21 21:58:49 -07:00
|
|
|
|
<?xml version="1.0"?>
|
|
|
|
|
|
2007-08-21 21:59:53 -07:00
|
|
|
|
<!-- ***** BEGIN LICENSE BLOCK *****
|
|
|
|
|
- Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
2007-08-21 21:58:49 -07:00
|
|
|
|
-
|
2007-08-21 21:59:53 -07:00
|
|
|
|
- The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
|
- 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
|
- the License. You may obtain a copy of the License at
|
|
|
|
|
- http://www.mozilla.org/MPL/
|
2007-08-21 21:58:49 -07:00
|
|
|
|
-
|
2007-08-21 21:59:53 -07:00
|
|
|
|
- Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
|
- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
|
- for the specific language governing rights and limitations under the
|
|
|
|
|
- License.
|
2007-08-21 21:58:49 -07:00
|
|
|
|
-
|
2007-08-21 21:59:53 -07:00
|
|
|
|
- The Original Code is this file as it was released on March 28, 2001.
|
|
|
|
|
-
|
|
|
|
|
- The Initial Developer of the Original Code is
|
|
|
|
|
- David Hyatt.
|
|
|
|
|
- Portions created by the Initial Developer are Copyright (C) 2001
|
|
|
|
|
- the Initial Developer. All Rights Reserved.
|
2007-08-21 21:58:49 -07:00
|
|
|
|
-
|
|
|
|
|
- Contributor(s):
|
|
|
|
|
- David Hyatt <hyatt@netscape.com> (Original Author of <tabbrowser>)
|
2007-08-21 22:00:10 -07:00
|
|
|
|
- Mike Connor <mconnor@steelgryphon.com>
|
2007-08-21 22:00:20 -07:00
|
|
|
|
- Peter Parente <parente@cs.unc.edu>
|
2007-08-21 22:00:21 -07:00
|
|
|
|
- Giorgio Maone <g.maone@informaction.com>
|
2007-08-21 22:01:33 -07:00
|
|
|
|
- Asaf Romano <mozilla.mano@sent.com>
|
2007-08-21 22:01:34 -07:00
|
|
|
|
- Seth Spitzer <sspitzer@mozilla.org>
|
2007-08-21 22:01:48 -07:00
|
|
|
|
- Simon Bünzli <zeniko@gmail.com>
|
2007-08-21 22:02:20 -07:00
|
|
|
|
- Michael Ventnor <ventnor.bugzilla@yahoo.com.au>
|
2007-08-21 22:02:29 -07:00
|
|
|
|
- Mark Pilgrim <pilgrim@gmail.com>
|
2009-03-24 04:47:06 -07:00
|
|
|
|
- Dão Gottwald <dao@mozilla.com>
|
2009-05-14 09:46:50 -07:00
|
|
|
|
- Paul O’Shannessy <paul@oshannessy.com>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
-
|
2007-08-21 21:59:53 -07:00
|
|
|
|
- Alternatively, the contents of this file may be used under the terms of
|
|
|
|
|
- either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
|
- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
|
- in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
|
- of those above. If you wish to allow use of your version of this file only
|
|
|
|
|
- under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
|
- use your version of this file under the terms of the MPL, indicate your
|
|
|
|
|
- decision by deleting the provisions above and replace them with the notice
|
|
|
|
|
- and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
|
- the provisions above, a recipient may use your version of this file under
|
|
|
|
|
- the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
|
-
|
|
|
|
|
- ***** END LICENSE BLOCK ***** -->
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
|
|
|
|
<!DOCTYPE bindings [
|
2007-08-22 14:02:02 -07:00
|
|
|
|
<!ENTITY % tabBrowserDTD SYSTEM "chrome://browser/locale/tabbrowser.dtd" >
|
2007-08-21 21:58:49 -07:00
|
|
|
|
%tabBrowserDTD;
|
|
|
|
|
]>
|
|
|
|
|
|
|
|
|
|
<bindings id="tabBrowserBindings"
|
|
|
|
|
xmlns="http://www.mozilla.org/xbl"
|
|
|
|
|
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
|
|
|
|
xmlns:xbl="http://www.mozilla.org/xbl">
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<binding id="tabbrowser">
|
|
|
|
|
<resources>
|
2008-01-14 19:04:37 -08:00
|
|
|
|
<stylesheet src="chrome://browser/content/tabbrowser.css"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</resources>
|
|
|
|
|
|
|
|
|
|
<content>
|
2007-08-22 14:02:02 -07:00
|
|
|
|
<xul:stringbundle anonid="tbstringbundle" src="chrome://browser/locale/tabbrowser.properties"/>
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<xul:tabbox anonid="tabbox" flex="1" eventnode="document" xbl:inherits="handleCtrlPageUpDown"
|
2007-08-21 22:01:03 -07:00
|
|
|
|
onselect="if (!('updateCurrentBrowser' in this.parentNode) || event.target.localName != 'tabpanels') return; this.parentNode.updateCurrentBrowser();">
|
2009-07-29 11:33:53 -07:00
|
|
|
|
<xul:hbox class="tab-drop-indicator-bar" collapsed="true"
|
2008-11-18 12:09:50 -08:00
|
|
|
|
ondragover="this.parentNode.parentNode._onDragOver(event);"
|
|
|
|
|
ondragleave="this.parentNode.parentNode._onDragLeave(event);"
|
|
|
|
|
ondrop="this.parentNode.parentNode._onDrop(event);">
|
2007-08-21 22:01:21 -07:00
|
|
|
|
<xul:hbox class="tab-drop-indicator" mousethrough="always"/>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
</xul:hbox>
|
2007-08-21 22:00:19 -07:00
|
|
|
|
<xul:hbox class="tabbrowser-strip" collapsed="true" tooltip="_child" context="_child"
|
2007-08-21 22:01:04 -07:00
|
|
|
|
anonid="strip"
|
2008-11-18 12:09:50 -08:00
|
|
|
|
ondragstart="this.parentNode.parentNode._onDragStart(event);"
|
|
|
|
|
ondragover="this.parentNode.parentNode._onDragOver(event);"
|
|
|
|
|
ondrop="this.parentNode.parentNode._onDrop(event);"
|
|
|
|
|
ondragend="this.parentNode.parentNode._onDragEnd(event);"
|
|
|
|
|
ondragleave="this.parentNode.parentNode._onDragLeave(event);">
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<xul:tooltip onpopupshowing="return this.parentNode.parentNode.parentNode.createTooltip(event);"/>
|
2007-08-21 22:00:31 -07:00
|
|
|
|
<xul:menupopup anonid="tabContextMenu" onpopupshowing="this.parentNode.parentNode.parentNode.updatePopupMenu(this);">
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_newTab" label="&newTab.label;" accesskey="&newTab.accesskey;"
|
2007-08-21 21:58:49 -07:00
|
|
|
|
xbl:inherits="oncommand=onnewtab"/>
|
|
|
|
|
<xul:menuseparator/>
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_reloadTab" label="&reloadTab.label;" accesskey="&reloadTab.accesskey;"
|
2007-08-21 21:58:49 -07:00
|
|
|
|
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
|
|
|
|
|
tabbrowser.reloadTab(tabbrowser.mContextTab);"/>
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_reloadAllTabs" label="&reloadAllTabs.label;" accesskey="&reloadAllTabs.accesskey;"
|
2007-08-21 21:58:49 -07:00
|
|
|
|
tbattr="tabbrowser-multiple"
|
|
|
|
|
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
|
|
|
|
|
tabbrowser.reloadAllTabs(tabbrowser.mContextTab);"/>
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_closeOtherTabs" label="&closeOtherTabs.label;" accesskey="&closeOtherTabs.accesskey;"
|
2007-08-21 21:59:11 -07:00
|
|
|
|
tbattr="tabbrowser-multiple"
|
|
|
|
|
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
|
|
|
|
|
tabbrowser.removeAllTabsBut(tabbrowser.mContextTab);"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<xul:menuseparator/>
|
2009-03-11 03:02:55 -07:00
|
|
|
|
<xul:menuitem id="context_openTabInWindow" label="&openTabInNewWindow.label;"
|
|
|
|
|
accesskey="&openTabInNewWindow.accesskey;"
|
2008-11-15 11:47:53 -08:00
|
|
|
|
tbattr="tabbrowser-multiple"
|
|
|
|
|
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
|
2009-01-22 19:00:54 -08:00
|
|
|
|
tabbrowser.replaceTabWithWindow(tabbrowser.mContextTab);"/>
|
2008-11-15 11:47:53 -08:00
|
|
|
|
<xul:menuseparator/>
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_bookmarkTab"
|
|
|
|
|
label="&bookmarkThisTab.label;"
|
2008-01-21 18:17:46 -08:00
|
|
|
|
accesskey="&bookmarkThisTab.accesskey;"
|
2007-10-02 12:18:44 -07:00
|
|
|
|
oncommand="BookmarkThisTab();"/>
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_bookmarkAllTabs"
|
|
|
|
|
label="&bookmarkAllTabs.label;"
|
2007-10-02 12:18:44 -07:00
|
|
|
|
accesskey="&bookmarkAllTabs.accesskey;"
|
|
|
|
|
command="Browser:BookmarkAllTabs"/>
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_undoCloseTab"
|
|
|
|
|
label="&undoCloseTab.label;"
|
2007-10-02 12:18:44 -07:00
|
|
|
|
accesskey="&undoCloseTab.accesskey;"
|
|
|
|
|
command="History:UndoCloseTab"
|
|
|
|
|
anonid="undoCloseTabMenuItem"/>
|
|
|
|
|
<xul:menuseparator/>
|
2008-02-25 00:47:24 -08:00
|
|
|
|
<xul:menuitem id="context_closeTab" label="&closeTab.label;" accesskey="&closeTab.accesskey;"
|
2009-03-01 02:51:18 -08:00
|
|
|
|
tbattr="tabbrowser-multiple"
|
2007-08-21 21:58:49 -07:00
|
|
|
|
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
|
2009-01-16 19:59:36 -08:00
|
|
|
|
tabbrowser.removeTab(tabbrowser.mContextTab);"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</xul:menupopup>
|
|
|
|
|
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<xul:tabs class="tabbrowser-tabs" flex="1"
|
|
|
|
|
anonid="tabcontainer"
|
|
|
|
|
setfocus="false"
|
2007-08-21 21:58:49 -07:00
|
|
|
|
onclick="this.parentNode.parentNode.parentNode.onTabClick(event);"
|
|
|
|
|
xbl:inherits="onnewtab"
|
2007-08-21 21:59:34 -07:00
|
|
|
|
ondblclick="this.parentNode.parentNode.parentNode.onTabBarDblClick(event);"
|
2007-08-21 21:58:49 -07:00
|
|
|
|
onclosetab="var node = this.parentNode;
|
|
|
|
|
while (node.localName != 'tabbrowser')
|
|
|
|
|
node = node.parentNode;
|
|
|
|
|
node.removeCurrentTab();">
|
2007-08-21 21:59:49 -07:00
|
|
|
|
<xul:tab selected="true" validate="never"
|
2007-10-09 22:03:52 -07:00
|
|
|
|
onerror="this.removeAttribute('image');"
|
2007-08-21 22:01:45 -07:00
|
|
|
|
maxwidth="250" width="0" minwidth="100" flex="100"
|
2007-08-21 21:58:49 -07:00
|
|
|
|
class="tabbrowser-tab" label="&untitledTab;" crop="end"/>
|
|
|
|
|
</xul:tabs>
|
|
|
|
|
</xul:hbox>
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<xul:tabpanels flex="1" class="plain" selectedIndex="0" anonid="panelcontainer">
|
2007-08-21 22:01:12 -07:00
|
|
|
|
<xul:notificationbox flex="1">
|
|
|
|
|
<xul:browser flex="1" type="content-primary" message="true" disablehistory="true"
|
|
|
|
|
xbl:inherits="tooltip=contenttooltip,contextmenu=contentcontextmenu,autocompletepopup"/>
|
|
|
|
|
</xul:notificationbox>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</xul:tabpanels>
|
|
|
|
|
</xul:tabbox>
|
|
|
|
|
<children/>
|
|
|
|
|
</content>
|
|
|
|
|
<implementation>
|
|
|
|
|
<field name="mPrefs" readonly="true">
|
|
|
|
|
Components.classes['@mozilla.org/preferences-service;1']
|
|
|
|
|
.getService(Components.interfaces.nsIPrefService)
|
|
|
|
|
.getBranch(null);
|
|
|
|
|
</field>
|
2007-08-21 21:59:55 -07:00
|
|
|
|
<field name="mURIFixup" readonly="true">
|
|
|
|
|
Components.classes["@mozilla.org/docshell/urifixup;1"]
|
|
|
|
|
.getService(Components.interfaces.nsIURIFixup);
|
|
|
|
|
</field>
|
2007-10-09 22:03:52 -07:00
|
|
|
|
<field name="mFaviconService" readonly="true">
|
|
|
|
|
Components.classes["@mozilla.org/browser/favicon-service;1"]
|
|
|
|
|
.getService(Components.interfaces.nsIFaviconService);
|
|
|
|
|
</field>
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<field name="mTabBox" readonly="true">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "tabbox");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
2007-08-21 22:00:40 -07:00
|
|
|
|
<field name="mTabDropIndicatorBar">
|
|
|
|
|
this.mTabBox.childNodes[0]
|
|
|
|
|
</field>
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<field name="mStrip" readonly="true">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "strip");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<field name="mTabContainer" readonly="true">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "tabcontainer");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<field name="mPanelContainer" readonly="true">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "panelcontainer");
|
2007-08-21 22:00:10 -07:00
|
|
|
|
</field>
|
2007-08-21 22:01:04 -07:00
|
|
|
|
<field name="mTabs" readonly="true">
|
2007-08-21 22:00:10 -07:00
|
|
|
|
this.mTabContainer.childNodes
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
|
|
|
|
<field name="mStringBundle">
|
2007-08-21 22:01:04 -07:00
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "tbstringbundle");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
2007-10-02 12:18:44 -07:00
|
|
|
|
<field name="mUndoCloseTabMenuItem">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "undoCloseTabMenuItem");
|
|
|
|
|
</field>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<field name="mCurrentTab">
|
|
|
|
|
null
|
|
|
|
|
</field>
|
|
|
|
|
<field name="mCurrentBrowser">
|
|
|
|
|
null
|
|
|
|
|
</field>
|
|
|
|
|
<field name="mProgressListeners">
|
2007-08-21 22:01:04 -07:00
|
|
|
|
[]
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
2008-11-18 02:53:25 -08:00
|
|
|
|
<field name="mTabsProgressListeners">
|
|
|
|
|
[]
|
|
|
|
|
</field>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<field name="mTabListeners">
|
2008-11-20 15:56:00 -08:00
|
|
|
|
new Array()
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
|
|
|
|
<field name="mTabFilters">
|
2008-11-20 15:56:00 -08:00
|
|
|
|
new Array()
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
|
|
|
|
<field name="mTabbedMode">
|
2008-11-20 15:56:00 -08:00
|
|
|
|
false
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</field>
|
|
|
|
|
<field name="mIsBusy">
|
|
|
|
|
false
|
|
|
|
|
</field>
|
|
|
|
|
<field name="mContextTab">
|
|
|
|
|
null
|
|
|
|
|
</field>
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<field name="arrowKeysShouldWrap" readonly="true">
|
|
|
|
|
#ifdef XP_MACOSX
|
|
|
|
|
true
|
|
|
|
|
#else
|
|
|
|
|
false
|
|
|
|
|
#endif
|
2007-08-21 22:00:55 -07:00
|
|
|
|
</field>
|
2007-08-21 22:00:37 -07:00
|
|
|
|
<field name="mAddProgressListenerWasCalled">
|
|
|
|
|
false
|
|
|
|
|
</field>
|
2007-08-21 22:01:17 -07:00
|
|
|
|
<field name="_browsers">
|
|
|
|
|
null
|
|
|
|
|
</field>
|
2007-08-21 22:00:10 -07:00
|
|
|
|
|
2007-08-21 22:01:33 -07:00
|
|
|
|
<field name="_blockDblClick">
|
|
|
|
|
false
|
|
|
|
|
</field>
|
2007-08-21 22:02:41 -07:00
|
|
|
|
<field name="_autoScrollPopup">
|
|
|
|
|
null
|
|
|
|
|
</field>
|
2007-08-21 22:01:33 -07:00
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
<method name="getBrowserAtIndex">
|
|
|
|
|
<parameter name="aIndex"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-11-19 23:58:58 -08:00
|
|
|
|
return this.browsers[aIndex];
|
2007-08-21 21:59:41 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="getBrowserIndexForDocument">
|
|
|
|
|
<parameter name="aDocument"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-06-15 03:00:58 -07:00
|
|
|
|
var browsers = this.browsers;
|
2007-11-19 23:58:58 -08:00
|
|
|
|
for (var i = 0; i < browsers.length; i++)
|
|
|
|
|
if (browsers[i].contentDocument == aDocument)
|
2007-08-21 21:59:41 -07:00
|
|
|
|
return i;
|
|
|
|
|
return -1;
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:01:15 -07:00
|
|
|
|
<method name="getBrowserForDocument">
|
|
|
|
|
<parameter name="aDocument"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var index = this.getBrowserIndexForDocument(aDocument);
|
|
|
|
|
if (index < 0)
|
|
|
|
|
return null;
|
|
|
|
|
return this.getBrowserAtIndex(index);
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 22:01:12 -07:00
|
|
|
|
<method name="getNotificationBox">
|
2007-08-21 21:59:41 -07:00
|
|
|
|
<parameter name="aBrowser"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:01:12 -07:00
|
|
|
|
if (aBrowser)
|
|
|
|
|
return aBrowser.parentNode;
|
|
|
|
|
else if (this.mCurrentBrowser)
|
|
|
|
|
return this.mCurrentBrowser.parentNode;
|
|
|
|
|
return null;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
<!-- A web progress listener object definition for a given tab. -->
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="mTabProgressListener">
|
|
|
|
|
<parameter name="aTab"/>
|
2007-08-21 21:59:22 -07:00
|
|
|
|
<parameter name="aBrowser"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<parameter name="aStartsBlank"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return ({
|
2007-08-21 21:59:22 -07:00
|
|
|
|
mTabBrowser: this,
|
2007-08-21 21:58:49 -07:00
|
|
|
|
mTab: aTab,
|
2007-08-21 21:59:22 -07:00
|
|
|
|
mBrowser: aBrowser,
|
2007-08-21 21:58:49 -07:00
|
|
|
|
mBlank: aStartsBlank,
|
|
|
|
|
|
2007-08-21 22:01:05 -07:00
|
|
|
|
// cache flags for correct status bar update after tab switching
|
|
|
|
|
mStateFlags: 0,
|
|
|
|
|
mStatus: 0,
|
|
|
|
|
mMessage: "",
|
|
|
|
|
mTotalProgress: 0,
|
|
|
|
|
|
2007-08-21 22:01:09 -07:00
|
|
|
|
// count of open requests (should always be 0 or 1)
|
|
|
|
|
mRequestCount: 0,
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
onProgressChange : function (aWebProgress, aRequest,
|
|
|
|
|
aCurSelfProgress, aMaxSelfProgress,
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
aCurTotalProgress, aMaxTotalProgress)
|
|
|
|
|
{
|
2008-11-18 02:53:25 -08:00
|
|
|
|
this.mTotalProgress = aMaxTotalProgress ? aCurTotalProgress / aMaxTotalProgress : 0;
|
|
|
|
|
|
|
|
|
|
if (this.mBlank)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mProgressListeners[i];
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onProgressChange(aWebProgress, aRequest,
|
|
|
|
|
aCurSelfProgress, aMaxSelfProgress,
|
|
|
|
|
aCurTotalProgress, aMaxTotalProgress);
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 22:01:05 -07:00
|
|
|
|
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mTabsProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onProgressChange(this.mBrowser, aWebProgress, aRequest,
|
|
|
|
|
aCurSelfProgress, aMaxSelfProgress,
|
|
|
|
|
aCurTotalProgress, aMaxTotalProgress);
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-11-18 02:53:25 -08:00
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
},
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 22:02:29 -07:00
|
|
|
|
onProgressChange64 : function (aWebProgress, aRequest,
|
|
|
|
|
aCurSelfProgress, aMaxSelfProgress,
|
|
|
|
|
aCurTotalProgress, aMaxTotalProgress)
|
|
|
|
|
{
|
|
|
|
|
return this.onProgressChange(aWebProgress, aRequest,
|
|
|
|
|
aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress,
|
|
|
|
|
aMaxTotalProgress);
|
|
|
|
|
},
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
onStateChange : function(aWebProgress, aRequest, aStateFlags, aStatus)
|
|
|
|
|
{
|
|
|
|
|
if (!aRequest)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var oldBlank = this.mBlank;
|
|
|
|
|
|
|
|
|
|
const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
|
|
|
|
|
const nsIChannel = Components.interfaces.nsIChannel;
|
|
|
|
|
|
2007-08-21 22:01:09 -07:00
|
|
|
|
if (aStateFlags & nsIWebProgressListener.STATE_START) {
|
|
|
|
|
this.mRequestCount++;
|
|
|
|
|
}
|
|
|
|
|
else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
|
|
|
|
|
const NS_ERROR_UNKNOWN_HOST = 2152398878;
|
|
|
|
|
if (--this.mRequestCount > 0 && aStatus == NS_ERROR_UNKNOWN_HOST) {
|
|
|
|
|
// to prevent bug 235825: wait for the request handled
|
|
|
|
|
// by the automatic keyword resolver
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// since we (try to) only handle STATE_STOP of the last request,
|
|
|
|
|
// the count of open requests should now be 0
|
|
|
|
|
this.mRequestCount = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 21:59:43 -07:00
|
|
|
|
if (aStateFlags & nsIWebProgressListener.STATE_START &&
|
2007-08-21 21:59:22 -07:00
|
|
|
|
aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
|
2007-08-21 21:59:31 -07:00
|
|
|
|
// It's okay to clear what the user typed when we start
|
2007-08-21 22:00:35 -07:00
|
|
|
|
// loading a document. If the user types, this counter gets
|
|
|
|
|
// set to zero, if the document load ends without an
|
|
|
|
|
// onLocationChange, this counter gets decremented
|
|
|
|
|
// (so we keep it while switching tabs after failed loads)
|
2008-01-08 20:07:42 -08:00
|
|
|
|
// We need to add 2 because loadURIWithFlags may have
|
|
|
|
|
// cancelled a pending load which would have cleared
|
|
|
|
|
// its anchor scroll detection temporary increment.
|
2007-08-21 21:59:22 -07:00
|
|
|
|
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow)
|
2008-01-08 20:07:42 -08:00
|
|
|
|
this.mBrowser.userTypedClear += 2;
|
2007-08-21 21:59:22 -07:00
|
|
|
|
|
|
|
|
|
if (!this.mBlank) {
|
|
|
|
|
this.mTab.setAttribute("busy", "true");
|
2007-08-21 22:00:14 -07:00
|
|
|
|
this.mTabBrowser.updateIcon(this.mTab);
|
2007-08-21 22:00:36 -07:00
|
|
|
|
this.mTabBrowser.setTabTitleLoading(this.mTab);
|
2007-08-21 21:59:22 -07:00
|
|
|
|
|
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab)
|
|
|
|
|
this.mTabBrowser.mIsBusy = true;
|
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
else if (aStateFlags & nsIWebProgressListener.STATE_STOP &&
|
|
|
|
|
aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
|
2007-08-21 22:00:14 -07:00
|
|
|
|
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow) {
|
2007-08-21 22:00:35 -07:00
|
|
|
|
// The document is done loading, we no longer want the
|
|
|
|
|
// value cleared.
|
2008-01-08 20:07:42 -08:00
|
|
|
|
if (this.mBrowser.userTypedClear > 1)
|
|
|
|
|
this.mBrowser.userTypedClear -= 2;
|
|
|
|
|
else if (this.mBrowser.userTypedClear > 0)
|
2007-08-21 22:00:35 -07:00
|
|
|
|
this.mBrowser.userTypedClear--;
|
2007-08-21 21:59:31 -07:00
|
|
|
|
|
2007-08-21 22:00:14 -07:00
|
|
|
|
if (!this.mBrowser.mIconURL)
|
|
|
|
|
this.mTabBrowser.useDefaultIcon(this.mTab);
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (this.mBlank)
|
|
|
|
|
this.mBlank = false;
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
this.mTab.removeAttribute("busy");
|
2007-08-21 22:00:14 -07:00
|
|
|
|
this.mTabBrowser.updateIcon(this.mTab);
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
var location = aRequest.QueryInterface(nsIChannel).URI;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
|
|
|
|
|
// For keyword URIs clear the user typed value since they will be changed into real URIs
|
|
|
|
|
if (location.scheme == "keyword")
|
|
|
|
|
this.mBrowser.userTypedValue = null;
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (this.mTab.label == this.mTabBrowser.mStringBundle.getString("tabs.loading"))
|
|
|
|
|
this.mTabBrowser.setTabTitle(this.mTab);
|
|
|
|
|
|
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab)
|
|
|
|
|
this.mTabBrowser.mIsBusy = false;
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:01:19 -07:00
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mProgressListeners[i];
|
2008-03-05 14:34:54 -08:00
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
if (!oldBlank)
|
|
|
|
|
p.onStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
|
|
|
|
|
// make sure that the visible status of new blank tabs is correctly set
|
|
|
|
|
else if ("onUpdateCurrentBrowser" in p)
|
|
|
|
|
p.onUpdateCurrentBrowser(aStateFlags, aStatus, "", 0);
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 22:01:05 -07:00
|
|
|
|
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mTabsProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onStateChange(this.mBrowser, aWebProgress, aRequest, aStateFlags, aStatus);
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-11-18 02:53:25 -08:00
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:01:05 -07:00
|
|
|
|
if (aStateFlags & (nsIWebProgressListener.STATE_START |
|
|
|
|
|
nsIWebProgressListener.STATE_STOP)) {
|
|
|
|
|
// reset cached temporary values at beginning and end
|
|
|
|
|
this.mMessage = "";
|
|
|
|
|
this.mTotalProgress = 0;
|
|
|
|
|
}
|
|
|
|
|
this.mStateFlags = aStateFlags;
|
|
|
|
|
this.mStatus = aStatus;
|
2007-08-21 21:59:43 -07:00
|
|
|
|
},
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2007-08-21 21:59:43 -07:00
|
|
|
|
onLocationChange : function(aWebProgress, aRequest, aLocation)
|
|
|
|
|
{
|
2007-08-21 21:59:31 -07:00
|
|
|
|
// The document loaded correctly, clear the value if we should
|
2008-01-08 20:07:42 -08:00
|
|
|
|
if (this.mBrowser.userTypedClear > 0)
|
2007-08-21 21:59:31 -07:00
|
|
|
|
this.mBrowser.userTypedValue = null;
|
|
|
|
|
|
2007-08-21 22:00:39 -07:00
|
|
|
|
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow &&
|
|
|
|
|
aWebProgress.isLoadingDocument)
|
2007-08-21 22:00:14 -07:00
|
|
|
|
this.mTabBrowser.setIcon(this.mTab, null);
|
|
|
|
|
|
2007-08-21 22:01:14 -07:00
|
|
|
|
// changing location, clear out the missing plugins list
|
2007-12-19 03:26:36 -08:00
|
|
|
|
this.mBrowser.missingPlugins = null;
|
2007-08-21 22:01:14 -07:00
|
|
|
|
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (this.mBlank)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mProgressListeners[i];
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onLocationChange(aWebProgress, aRequest, aLocation);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2008-11-18 02:53:25 -08:00
|
|
|
|
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mTabsProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onLocationChange(this.mBrowser, aWebProgress, aRequest, aLocation);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners
|
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
},
|
|
|
|
|
|
2007-08-21 21:59:43 -07:00
|
|
|
|
onStatusChange : function(aWebProgress, aRequest, aStatus, aMessage)
|
|
|
|
|
{
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
if (this.mBlank)
|
2007-08-21 21:58:49 -07:00
|
|
|
|
return;
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mProgressListeners[i];
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onStatusChange(aWebProgress, aRequest, aStatus, aMessage);
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 22:01:05 -07:00
|
|
|
|
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mTabsProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onStatusChange(this.mBrowser, aWebProgress, aRequest, aStatus, aMessage);
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-11-18 02:53:25 -08:00
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:01:05 -07:00
|
|
|
|
this.mMessage = aMessage;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
},
|
|
|
|
|
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
onSecurityChange : function(aWebProgress, aRequest, aState)
|
|
|
|
|
{
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mProgressListeners[i];
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onSecurityChange(aWebProgress, aRequest, aState);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2008-11-18 02:53:25 -08:00
|
|
|
|
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mTabsProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onSecurityChange(this.mBrowser, aWebProgress, aRequest, aState);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners
|
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onRefreshAttempted : function(aWebProgress, aURI, aDelay, aSameURI)
|
|
|
|
|
{
|
|
|
|
|
var allowRefresh = true;
|
|
|
|
|
if (this.mTabBrowser.mCurrentTab == this.mTab) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (p && "onRefreshAttempted" in p) {
|
|
|
|
|
try {
|
|
|
|
|
if (!p.onRefreshAttempted(aWebProgress, aURI, aDelay, aSameURI))
|
|
|
|
|
allowRefresh = false;
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-11-18 02:53:25 -08:00
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabBrowser.mTabsProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (p && "onRefreshAttempted" in p) {
|
|
|
|
|
try {
|
|
|
|
|
if (!p.onRefreshAttempted(this.mBrowser, aWebProgress, aURI, aDelay, aSameURI))
|
|
|
|
|
allowRefresh = false;
|
|
|
|
|
} catch (e) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
// don't inhibit other listeners
|
2008-11-18 02:53:25 -08:00
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return allowRefresh;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
QueryInterface : function(aIID)
|
|
|
|
|
{
|
|
|
|
|
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
|
2007-08-21 22:02:29 -07:00
|
|
|
|
aIID.equals(Components.interfaces.nsIWebProgressListener2) ||
|
2007-08-21 21:58:49 -07:00
|
|
|
|
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
|
|
|
|
|
aIID.equals(Components.interfaces.nsISupports))
|
|
|
|
|
return this;
|
|
|
|
|
throw Components.results.NS_NOINTERFACE;
|
|
|
|
|
}
|
2007-08-21 21:59:43 -07:00
|
|
|
|
});
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:00:14 -07:00
|
|
|
|
<method name="setIcon">
|
|
|
|
|
<parameter name="aTab"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<parameter name="aURI"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:14 -07:00
|
|
|
|
var browser = this.getBrowserForTab(aTab);
|
2009-07-28 22:55:18 -07:00
|
|
|
|
browser.mIconURL = aURI instanceof Ci.nsIURI ? aURI.spec : aURI;
|
2007-08-21 22:00:14 -07:00
|
|
|
|
|
2009-07-28 22:55:18 -07:00
|
|
|
|
if (aURI && this.mFaviconService) {
|
|
|
|
|
if (!(aURI instanceof Ci.nsIURI))
|
|
|
|
|
aURI = makeURI(aURI);
|
|
|
|
|
this.mFaviconService.setAndLoadFaviconForPage(browser.currentURI,
|
|
|
|
|
aURI, false);
|
2007-10-09 22:03:52 -07:00
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:00:14 -07:00
|
|
|
|
this.updateIcon(aTab);
|
|
|
|
|
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if (browser == this.mCurrentBrowser) {
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mProgressListeners[i];
|
2008-11-18 02:53:25 -08:00
|
|
|
|
if ('onLinkIconAvailable' in p)
|
|
|
|
|
try {
|
|
|
|
|
p.onLinkIconAvailable(browser);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners
|
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-06-15 03:00:58 -07:00
|
|
|
|
for (let i = 0; i < this.mTabsProgressListeners.length; i++) {
|
|
|
|
|
let p = this.mTabsProgressListeners[i];
|
2007-08-21 22:00:14 -07:00
|
|
|
|
if ('onLinkIconAvailable' in p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onLinkIconAvailable(browser);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 22:00:14 -07:00
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="updateIcon">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var browser = this.getBrowserForTab(aTab);
|
|
|
|
|
if (!aTab.hasAttribute("busy") && browser.mIconURL)
|
|
|
|
|
aTab.setAttribute("image", browser.mIconURL);
|
|
|
|
|
else
|
|
|
|
|
aTab.removeAttribute("image");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="shouldLoadFavIcon">
|
|
|
|
|
<parameter name="aURI"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return (aURI && this.mPrefs.getBoolPref("browser.chrome.site_icons") &&
|
2007-08-21 21:59:43 -07:00
|
|
|
|
this.mPrefs.getBoolPref("browser.chrome.favicons") &&
|
2007-08-21 21:58:49 -07:00
|
|
|
|
("schemeIs" in aURI) && (aURI.schemeIs("http") || aURI.schemeIs("https")));
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 22:00:14 -07:00
|
|
|
|
<method name="useDefaultIcon">
|
|
|
|
|
<parameter name="aTab"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:14 -07:00
|
|
|
|
var browser = this.getBrowserForTab(aTab);
|
|
|
|
|
if (browser.contentDocument instanceof ImageDocument) {
|
2007-08-21 22:00:32 -07:00
|
|
|
|
if (this.mPrefs.getBoolPref("browser.chrome.site_icons")) {
|
|
|
|
|
try {
|
|
|
|
|
var sz = this.mPrefs.getIntPref("browser.chrome.image_icons.max_size");
|
|
|
|
|
if (!sz)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var req = browser.contentDocument.imageRequest;
|
|
|
|
|
if (!req || !req.image ||
|
|
|
|
|
req.image.width > sz ||
|
|
|
|
|
req.image.height > sz)
|
|
|
|
|
return;
|
|
|
|
|
|
2009-07-28 22:55:18 -07:00
|
|
|
|
this.setIcon(aTab, browser.currentURI);
|
2007-08-21 22:00:32 -07:00
|
|
|
|
} catch (e) { }
|
|
|
|
|
}
|
2007-08-21 22:00:14 -07:00
|
|
|
|
}
|
2008-10-21 13:02:26 -07:00
|
|
|
|
// Use documentURIObject in the check for shouldLoadFavIcon so that we
|
|
|
|
|
// do the right thing with about:-style error pages. Bug 453442
|
|
|
|
|
else if (this.shouldLoadFavIcon(browser.contentDocument.documentURIObject)) {
|
2007-08-21 22:00:14 -07:00
|
|
|
|
var url = browser.currentURI.prePath + "/favicon.ico";
|
2007-10-09 22:03:52 -07:00
|
|
|
|
if (!this.isFailedIcon(url))
|
2007-08-21 22:00:14 -07:00
|
|
|
|
this.setIcon(aTab, url);
|
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-10-09 22:03:52 -07:00
|
|
|
|
<method name="isFailedIcon">
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<parameter name="aURI"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-07-28 22:55:18 -07:00
|
|
|
|
if (this.mFaviconService) {
|
|
|
|
|
if (!(aURI instanceof Ci.nsIURI))
|
|
|
|
|
aURI = makeURI(aURI);
|
2008-12-30 04:44:55 -08:00
|
|
|
|
return this.mFaviconService.isFailedFavicon(aURI);
|
2009-07-28 22:55:18 -07:00
|
|
|
|
}
|
2008-12-30 04:44:55 -08:00
|
|
|
|
return null;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="updateTitlebar">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var newTitle = "";
|
|
|
|
|
var docTitle;
|
2007-08-21 22:00:43 -07:00
|
|
|
|
var docElement = this.ownerDocument.documentElement;
|
|
|
|
|
var sep = docElement.getAttribute("titlemenuseparator");
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (this.docShell.contentViewer)
|
2007-08-21 21:59:35 -07:00
|
|
|
|
docTitle = this.contentTitle;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:45 -07:00
|
|
|
|
if (!docTitle)
|
2007-08-21 22:00:43 -07:00
|
|
|
|
docTitle = docElement.getAttribute("titledefault");
|
2007-08-21 21:59:37 -07:00
|
|
|
|
|
2007-08-21 22:00:43 -07:00
|
|
|
|
var modifier = docElement.getAttribute("titlemodifier");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (docTitle) {
|
2007-08-21 22:00:43 -07:00
|
|
|
|
newTitle += docElement.getAttribute("titlepreface");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
newTitle += docTitle;
|
2007-08-21 21:59:37 -07:00
|
|
|
|
if (modifier)
|
|
|
|
|
newTitle += sep;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
2007-08-21 21:59:16 -07:00
|
|
|
|
newTitle += modifier;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:00:43 -07:00
|
|
|
|
// If location bar is hidden and the URL type supports a host,
|
|
|
|
|
// add the scheme and host to the title to prevent spoofing.
|
|
|
|
|
// XXX https://bugzilla.mozilla.org/show_bug.cgi?id=22183#c239
|
|
|
|
|
try {
|
|
|
|
|
if (docElement.getAttribute("chromehidden").indexOf("location") != -1) {
|
2007-08-21 22:00:46 -07:00
|
|
|
|
var uri = this.mURIFixup.createExposableURI(
|
|
|
|
|
this.mCurrentBrowser.currentURI);
|
2007-08-21 22:02:33 -07:00
|
|
|
|
if (uri.scheme == "about")
|
|
|
|
|
newTitle = uri.spec + sep + newTitle;
|
|
|
|
|
else
|
2007-08-21 22:00:46 -07:00
|
|
|
|
newTitle = uri.prePath + sep + newTitle;
|
2007-08-21 22:00:43 -07:00
|
|
|
|
}
|
|
|
|
|
} catch (e) {}
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:42 -07:00
|
|
|
|
this.ownerDocument.title = newTitle;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="updatePopupMenu">
|
|
|
|
|
<parameter name="aPopupMenu"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2008-10-21 12:57:26 -07:00
|
|
|
|
this.mContextTab = document.popupNode.localName == "tab" ?
|
|
|
|
|
document.popupNode : this.selectedTab;
|
|
|
|
|
var disabled = this.mTabs.length == 1;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
var menuItems = aPopupMenu.getElementsByAttribute("tbattr", "tabbrowser-multiple");
|
|
|
|
|
for (var i = 0; i < menuItems.length; i++)
|
2007-08-21 22:00:04 -07:00
|
|
|
|
menuItems[i].disabled = disabled;
|
2007-10-02 12:18:44 -07:00
|
|
|
|
|
|
|
|
|
// Session store
|
2008-08-19 22:48:08 -07:00
|
|
|
|
// XXXzeniko should't we just disable this item as we disable
|
|
|
|
|
// the tabbrowser-multiple items above - for consistency?
|
|
|
|
|
this.mUndoCloseTabMenuItem.hidden =
|
|
|
|
|
Cc["@mozilla.org/browser/sessionstore;1"].
|
|
|
|
|
getService(Ci.nsISessionStore).
|
|
|
|
|
getClosedTabCount(window) == 0;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="updateCurrentBrowser">
|
2008-11-15 11:47:53 -08:00
|
|
|
|
<parameter name="aForceUpdate"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:10 -07:00
|
|
|
|
var newBrowser = this.getBrowserAtIndex(this.mTabContainer.selectedIndex);
|
2008-11-15 11:47:53 -08:00
|
|
|
|
if (this.mCurrentBrowser == newBrowser && !aForceUpdate)
|
2007-08-21 21:58:59 -07:00
|
|
|
|
return;
|
|
|
|
|
|
2009-04-24 01:18:53 -07:00
|
|
|
|
if (this.mCurrentTab != this.selectedTab)
|
|
|
|
|
this.mCurrentTab.owner = null;
|
|
|
|
|
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
|
var fm = Components.classes["@mozilla.org/focus-manager;1"].
|
|
|
|
|
getService(Components.interfaces.nsIFocusManager);
|
|
|
|
|
var focusedChromeElement = fm.getFocusedElementForWindow(window, false, {});
|
2007-08-21 22:00:00 -07:00
|
|
|
|
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
|
var oldBrowser = this.mCurrentBrowser;
|
|
|
|
|
if (oldBrowser)
|
|
|
|
|
oldBrowser.setAttribute("type", "content-targetable");
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:00 -07:00
|
|
|
|
var updatePageReport = false;
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
|
if (!oldBrowser ||
|
|
|
|
|
(oldBrowser.pageReport && !newBrowser.pageReport) ||
|
|
|
|
|
(!oldBrowser.pageReport && newBrowser.pageReport))
|
2007-08-21 21:59:00 -07:00
|
|
|
|
updatePageReport = true;
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
newBrowser.setAttribute("type", "content-primary");
|
|
|
|
|
this.mCurrentBrowser = newBrowser;
|
|
|
|
|
this.mCurrentTab = this.selectedTab;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:00 -07:00
|
|
|
|
if (updatePageReport)
|
|
|
|
|
this.mCurrentBrowser.updatePageReport();
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
// Update the URL bar.
|
|
|
|
|
var loc = this.mCurrentBrowser.currentURI;
|
2007-08-21 21:59:00 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
var webProgress = this.mCurrentBrowser.webProgress;
|
|
|
|
|
var securityUI = this.mCurrentBrowser.securityUI;
|
2007-08-21 22:00:50 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
var i, p;
|
|
|
|
|
for (i = 0; i < this.mProgressListeners.length; i++) {
|
|
|
|
|
p = this.mProgressListeners[i];
|
2008-03-05 14:34:54 -08:00
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onLocationChange(webProgress, null, loc);
|
|
|
|
|
if (securityUI)
|
|
|
|
|
p.onSecurityChange(webProgress, null, securityUI.state);
|
|
|
|
|
|
|
|
|
|
// make sure that all status indicators are properly updated
|
|
|
|
|
if ("onUpdateCurrentBrowser" in p) {
|
|
|
|
|
var listener = this.mTabListeners[this.mTabContainer.selectedIndex] || null;
|
|
|
|
|
if (listener && listener.mStateFlags)
|
|
|
|
|
p.onUpdateCurrentBrowser(listener.mStateFlags, listener.mStatus,
|
|
|
|
|
listener.mMessage, listener.mTotalProgress);
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2007-08-21 22:01:05 -07:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
2007-08-21 22:00:50 -07:00
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
this._fastFind.setDocShell(this.mCurrentBrowser.docShell);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
|
|
|
|
// Update the window title.
|
|
|
|
|
this.updateTitlebar();
|
2007-08-21 21:59:43 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
// If the new tab is busy, and our current state is not busy, then
|
|
|
|
|
// we need to fire a start to all progress listeners.
|
|
|
|
|
const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
|
|
|
|
|
if (this.mCurrentTab.hasAttribute("busy") && !this.mIsBusy) {
|
|
|
|
|
this.mIsBusy = true;
|
|
|
|
|
webProgress = this.mCurrentBrowser.webProgress;
|
|
|
|
|
for (i = 0; i < this.mProgressListeners.length; i++) {
|
|
|
|
|
p = this.mProgressListeners[i];
|
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onStateChange(webProgress, null, nsIWebProgressListener.STATE_START | nsIWebProgressListener.STATE_IS_NETWORK, 0);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the new tab is not busy, and our current state is busy, then
|
|
|
|
|
// we need to fire a stop to all progress listeners.
|
|
|
|
|
if (!this.mCurrentTab.hasAttribute("busy") && this.mIsBusy) {
|
|
|
|
|
this.mIsBusy = false;
|
|
|
|
|
webProgress = this.mCurrentBrowser.webProgress;
|
|
|
|
|
for (i = 0; i < this.mProgressListeners.length; i++) {
|
|
|
|
|
p = this.mProgressListeners[i];
|
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onStateChange(webProgress, null, nsIWebProgressListener.STATE_STOP | nsIWebProgressListener.STATE_IS_NETWORK, 0);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
2008-03-06 14:39:41 -08:00
|
|
|
|
Components.utils.reportError(e);
|
2008-03-05 14:34:54 -08:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:02:05 -07:00
|
|
|
|
// We've selected the new tab, so go ahead and notify listeners.
|
|
|
|
|
var event = document.createEvent("Events");
|
|
|
|
|
event.initEvent("TabSelect", true, false);
|
|
|
|
|
this.mCurrentTab.dispatchEvent(event);
|
|
|
|
|
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
|
// change focus to the new tab if nothing is focused, the old tab
|
|
|
|
|
// is focused or there is something in the new tab to focus. One
|
|
|
|
|
// specific case where focus is not changed is when the new tab
|
|
|
|
|
// has no focused element and a chrome element is focused.
|
|
|
|
|
if (!focusedChromeElement || focusedChromeElement == oldBrowser ||
|
|
|
|
|
fm.getFocusedElementForWindow(window.content, true, {}))
|
|
|
|
|
fm.setFocus(newBrowser, fm.FLAG_NOSCROLL);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="onTabClick">
|
|
|
|
|
<parameter name="event"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:51 -07:00
|
|
|
|
if (event.button != 1 || event.target.localName != 'tab')
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
return;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2009-03-01 02:51:18 -08:00
|
|
|
|
if (this.mTabs.length > 1 ||
|
|
|
|
|
!this.mPrefs.getBoolPref("browser.tabs.closeWindowWithLastTab"))
|
|
|
|
|
this.removeTab(event.target);
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
event.stopPropagation();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="onTitleChanged">
|
|
|
|
|
<parameter name="evt"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
if (evt.target != this.contentDocument)
|
|
|
|
|
return;
|
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
var tabBrowser = this.parentNode.parentNode.parentNode.parentNode;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
var tab = document.getAnonymousElementByAttribute(tabBrowser, "linkedpanel", this.parentNode.id);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
tabBrowser.setTabTitle(tab);
|
|
|
|
|
|
|
|
|
|
if (tab == tabBrowser.mCurrentTab)
|
|
|
|
|
tabBrowser.updateTitlebar();
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
]]>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 22:00:36 -07:00
|
|
|
|
<method name="setTabTitleLoading">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
aTab.label = this.mStringBundle.getString("tabs.loading");
|
|
|
|
|
aTab.setAttribute("crop", "end");
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="setTabTitle">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var browser = this.getBrowserForTab(aTab);
|
|
|
|
|
var crop = "end";
|
2007-08-21 22:02:16 -07:00
|
|
|
|
var title = browser.contentTitle;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:55 -07:00
|
|
|
|
if (!title) {
|
|
|
|
|
if (browser.currentURI.spec) {
|
|
|
|
|
try {
|
|
|
|
|
title = this.mURIFixup.createExposableURI(browser.currentURI).spec;
|
|
|
|
|
} catch(ex) {
|
|
|
|
|
title = browser.currentURI.spec;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (title && title != "about:blank") {
|
|
|
|
|
// At this point, we now have a URI.
|
|
|
|
|
// Let's try to unescape it using a character set
|
|
|
|
|
// in case the URI is not ASCII.
|
|
|
|
|
try {
|
2007-08-21 22:00:24 -07:00
|
|
|
|
var characterSet = browser.contentDocument.characterSet;
|
2007-08-21 21:59:55 -07:00
|
|
|
|
const textToSubURI = Components.classes["@mozilla.org/intl/texttosuburi;1"]
|
|
|
|
|
.getService(Components.interfaces.nsITextToSubURI);
|
|
|
|
|
title = textToSubURI.unEscapeNonAsciiURI(characterSet, title);
|
|
|
|
|
} catch(ex) { /* Do nothing. */ }
|
|
|
|
|
|
|
|
|
|
crop = "center";
|
|
|
|
|
|
|
|
|
|
} else // Still no title? Fall back to our untitled string.
|
|
|
|
|
title = this.mStringBundle.getString("tabs.untitled");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
aTab.label = title;
|
|
|
|
|
aTab.setAttribute("crop", crop);
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="setStripVisibilityTo">
|
|
|
|
|
<parameter name="aShow"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
this.mStrip.collapsed = !aShow;
|
|
|
|
|
if (aShow) {
|
|
|
|
|
// XXXdwh temporary unclean dependency on specific menu items in navigator.xul
|
|
|
|
|
document.getElementById("menu_closeWindow").hidden = false;
|
|
|
|
|
document.getElementById("menu_close").setAttribute("label", this.mStringBundle.getString("tabs.closeTab"));
|
2008-11-20 15:56:00 -08:00
|
|
|
|
if (!this.mTabbedMode)
|
|
|
|
|
this.enterTabbedMode();
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// XXXdwh temporary unclean dependency on specific menu items in navigator.xul
|
|
|
|
|
document.getElementById("menu_closeWindow").hidden = true;
|
|
|
|
|
document.getElementById("menu_close").setAttribute("label", this.mStringBundle.getString("tabs.close"));
|
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="getStripVisibility">
|
|
|
|
|
<body>
|
|
|
|
|
return !this.mStrip.collapsed;
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="enterTabbedMode">
|
|
|
|
|
<body>
|
2008-11-20 15:56:00 -08:00
|
|
|
|
<![CDATA[
|
|
|
|
|
this.mTabbedMode = true; // Welcome to multi-tabbed mode.
|
|
|
|
|
|
|
|
|
|
// Get the first tab all hooked up with a title listener and popup blocking listener.
|
|
|
|
|
this.mCurrentBrowser.addEventListener("DOMTitleChanged", this.onTitleChanged, true);
|
|
|
|
|
|
|
|
|
|
if (XULBrowserWindow.isBusy) {
|
|
|
|
|
this.mCurrentTab.setAttribute("busy", "true");
|
|
|
|
|
this.mIsBusy = true;
|
|
|
|
|
this.setTabTitleLoading(this.mCurrentTab);
|
|
|
|
|
this.updateIcon(this.mCurrentTab);
|
|
|
|
|
} else {
|
|
|
|
|
this.setTabTitle(this.mCurrentTab);
|
|
|
|
|
this.setIcon(this.mCurrentTab, this.mCurrentBrowser.mIconURL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var filter;
|
|
|
|
|
if (this.mTabFilters.length > 0) {
|
|
|
|
|
// Use the filter hooked up in our addProgressListener
|
|
|
|
|
filter = this.mTabFilters[0];
|
|
|
|
|
} else {
|
|
|
|
|
// create a filter and hook it up to our first browser
|
|
|
|
|
filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
|
|
|
|
|
.createInstance(Components.interfaces.nsIWebProgress);
|
|
|
|
|
this.mTabFilters[0] = filter;
|
|
|
|
|
this.mCurrentBrowser.webProgress.addProgressListener(filter, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remove all our progress listeners from the active browser's filter.
|
|
|
|
|
for (var i = 0; i < this.mProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mProgressListeners[i];
|
|
|
|
|
if (p)
|
|
|
|
|
filter.removeProgressListener(p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Wire up a progress listener to our filter.
|
|
|
|
|
const listener = this.mTabProgressListener(this.mCurrentTab,
|
|
|
|
|
this.mCurrentBrowser,
|
|
|
|
|
false);
|
|
|
|
|
filter.addProgressListener(listener, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
|
|
|
|
this.mTabListeners[0] = listener;
|
|
|
|
|
]]>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:00:28 -07:00
|
|
|
|
<method name="loadOneTab">
|
|
|
|
|
<parameter name="aURI"/>
|
|
|
|
|
<parameter name="aReferrerURI"/>
|
|
|
|
|
<parameter name="aCharset"/>
|
|
|
|
|
<parameter name="aPostData"/>
|
|
|
|
|
<parameter name="aLoadInBackground"/>
|
2007-08-21 22:01:08 -07:00
|
|
|
|
<parameter name="aAllowThirdPartyFixup"/>
|
2007-08-21 22:00:28 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:01:13 -07:00
|
|
|
|
var bgLoad = (aLoadInBackground != null) ? aLoadInBackground :
|
2007-08-21 22:00:28 -07:00
|
|
|
|
this.mPrefs.getBoolPref("browser.tabs.loadInBackground");
|
2007-08-21 22:01:43 -07:00
|
|
|
|
var owner = bgLoad ? null : this.selectedTab;
|
|
|
|
|
var tab = this.addTab(aURI, aReferrerURI, aCharset, aPostData, owner,
|
|
|
|
|
aAllowThirdPartyFixup);
|
2007-08-21 22:00:54 -07:00
|
|
|
|
if (!bgLoad)
|
|
|
|
|
this.selectedTab = tab;
|
2008-02-13 02:21:54 -08:00
|
|
|
|
|
2007-08-21 22:00:28 -07:00
|
|
|
|
return tab;
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<method name="loadTabs">
|
|
|
|
|
<parameter name="aURIs"/>
|
|
|
|
|
<parameter name="aLoadInBackground"/>
|
|
|
|
|
<parameter name="aReplace"/>
|
|
|
|
|
<body><![CDATA[
|
2009-01-18 02:36:01 -08:00
|
|
|
|
if (!aURIs.length)
|
|
|
|
|
return;
|
|
|
|
|
|
2007-08-21 22:00:55 -07:00
|
|
|
|
// The tab selected after this new tab is closed (i.e. the new tab's
|
2007-08-21 22:00:54 -07:00
|
|
|
|
// "owner") is the next adjacent tab (i.e. not the previously viewed tab)
|
|
|
|
|
// when several urls are opened here (i.e. closing the first should select
|
|
|
|
|
// the next of many URLs opened) or if the pref to have UI links opened in
|
|
|
|
|
// the background is set (i.e. the link is not being opened modally)
|
|
|
|
|
//
|
|
|
|
|
// i.e.
|
|
|
|
|
// Number of URLs Load UI Links in BG Focus Last Viewed?
|
|
|
|
|
// == 1 false YES
|
|
|
|
|
// == 1 true NO
|
|
|
|
|
// > 1 false/true NO
|
2008-07-10 01:21:01 -07:00
|
|
|
|
var owner = (aURIs.length > 1) || aLoadInBackground ? null : this.selectedTab;
|
2007-08-21 22:00:54 -07:00
|
|
|
|
var firstTabAdded = null;
|
2009-01-23 03:52:14 -08:00
|
|
|
|
|
|
|
|
|
if (aReplace) {
|
|
|
|
|
try {
|
|
|
|
|
this.loadURI(aURIs[0], null, null);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// Ignore failure in case a URI is wrong, so we can continue
|
|
|
|
|
// opening the next ones.
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 22:00:54 -07:00
|
|
|
|
else
|
2008-07-10 01:21:01 -07:00
|
|
|
|
firstTabAdded = this.addTab(aURIs[0], null, null, null, owner, false);
|
2007-08-21 22:00:54 -07:00
|
|
|
|
|
2007-08-21 22:01:41 -07:00
|
|
|
|
var tabNum = this.mTabContainer.selectedIndex;
|
2008-07-10 01:21:01 -07:00
|
|
|
|
for (let i = 1; i < aURIs.length; ++i) {
|
|
|
|
|
let tab = this.addTab(aURIs[i]);
|
2007-08-21 22:01:41 -07:00
|
|
|
|
if (aReplace)
|
|
|
|
|
this.moveTabTo(tab, ++tabNum);
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:00:54 -07:00
|
|
|
|
if (!aLoadInBackground) {
|
|
|
|
|
if (firstTabAdded) {
|
|
|
|
|
// .selectedTab setter focuses the content area
|
|
|
|
|
this.selectedTab = firstTabAdded;
|
|
|
|
|
}
|
2007-08-21 22:00:55 -07:00
|
|
|
|
else
|
2007-08-21 22:00:54 -07:00
|
|
|
|
window.content.focus();
|
|
|
|
|
}
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:28 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="addTab">
|
|
|
|
|
<parameter name="aURI"/>
|
|
|
|
|
<parameter name="aReferrerURI"/>
|
2007-08-21 21:59:09 -07:00
|
|
|
|
<parameter name="aCharset"/>
|
2007-08-21 21:59:25 -07:00
|
|
|
|
<parameter name="aPostData"/>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<parameter name="aOwner"/>
|
2007-08-21 22:01:08 -07:00
|
|
|
|
<parameter name="aAllowThirdPartyFixup"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:01:17 -07:00
|
|
|
|
this._browsers = null; // invalidate cache
|
|
|
|
|
|
2008-11-20 15:56:00 -08:00
|
|
|
|
if (!this.mTabbedMode)
|
|
|
|
|
this.enterTabbedMode();
|
|
|
|
|
|
2007-08-21 22:01:25 -07:00
|
|
|
|
// if we're adding tabs, we're past interrupt mode, ditch the owner
|
|
|
|
|
if (this.mCurrentTab.owner)
|
|
|
|
|
this.mCurrentTab.owner = null;
|
|
|
|
|
|
2007-08-21 22:01:34 -07:00
|
|
|
|
var t = document.createElementNS(
|
|
|
|
|
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
|
2007-08-21 21:58:49 -07:00
|
|
|
|
"tab");
|
|
|
|
|
|
2007-08-21 21:59:43 -07:00
|
|
|
|
var blank = (aURI == "about:blank");
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (blank)
|
|
|
|
|
t.setAttribute("label", this.mStringBundle.getString("tabs.untitled"));
|
|
|
|
|
else
|
|
|
|
|
t.setAttribute("label", aURI);
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
t.setAttribute("crop", "end");
|
2007-08-21 22:02:37 -07:00
|
|
|
|
t.maxWidth = this.mTabContainer.mTabMaxWidth;
|
2007-08-21 22:01:27 -07:00
|
|
|
|
t.minWidth = this.mTabContainer.mTabMinWidth;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
t.width = 0;
|
|
|
|
|
t.setAttribute("flex", "100");
|
|
|
|
|
t.setAttribute("validate", "never");
|
2007-10-09 22:03:52 -07:00
|
|
|
|
t.setAttribute("onerror", "this.removeAttribute('image');");
|
2007-08-21 22:00:54 -07:00
|
|
|
|
t.className = "tabbrowser-tab";
|
2007-08-21 22:01:46 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
this.mTabContainer.appendChild(t);
|
2007-08-21 22:01:46 -07:00
|
|
|
|
|
2009-07-10 00:02:12 -07:00
|
|
|
|
if (this.tabContainer.mTabstrip._isRTLScrollbox) {
|
2007-08-21 22:01:46 -07:00
|
|
|
|
/* In RTL UI, the tab is visually added to the left side of the
|
|
|
|
|
* tabstrip. This means the tabstip has to be scrolled back in
|
|
|
|
|
* order to make sure the same set of tabs is visible before and
|
|
|
|
|
* after the new tab is added */
|
|
|
|
|
|
2009-07-10 00:02:12 -07:00
|
|
|
|
this.tabContainer.mTabstrip.scrollByPixels(this.mTabs[0].clientWidth);
|
2007-08-21 22:01:46 -07:00
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:01:25 -07:00
|
|
|
|
// invalidate cache, because mTabContainer is about to change
|
|
|
|
|
this._browsers = null;
|
|
|
|
|
|
2007-08-21 22:00:54 -07:00
|
|
|
|
// If this new tab is owned by another, assert that relationship
|
2009-04-24 01:18:53 -07:00
|
|
|
|
if (aOwner)
|
2007-08-21 22:00:54 -07:00
|
|
|
|
t.owner = aOwner;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:01:34 -07:00
|
|
|
|
var b = document.createElementNS(
|
|
|
|
|
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
|
2007-08-21 21:59:43 -07:00
|
|
|
|
"browser");
|
2007-08-21 22:01:01 -07:00
|
|
|
|
b.setAttribute("type", "content-targetable");
|
2007-08-21 21:59:41 -07:00
|
|
|
|
b.setAttribute("message", "true");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
b.setAttribute("contextmenu", this.getAttribute("contentcontextmenu"));
|
|
|
|
|
b.setAttribute("tooltip", this.getAttribute("contenttooltip"));
|
2007-08-21 22:00:48 -07:00
|
|
|
|
if (this.hasAttribute("autocompletepopup"))
|
|
|
|
|
b.setAttribute("autocompletepopup", this.getAttribute("autocompletepopup"));
|
2007-08-21 22:02:41 -07:00
|
|
|
|
b.setAttribute("autoscrollpopup", this._autoScrollPopup.id);
|
2007-08-21 21:59:49 -07:00
|
|
|
|
|
2007-08-21 22:00:55 -07:00
|
|
|
|
// Add the Message and the Browser to the box
|
2007-08-21 22:01:12 -07:00
|
|
|
|
var notificationbox = document.createElementNS(
|
|
|
|
|
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
|
|
|
|
|
"notificationbox");
|
|
|
|
|
notificationbox.setAttribute("flex", "1");
|
|
|
|
|
notificationbox.appendChild(b);
|
2007-08-21 21:59:41 -07:00
|
|
|
|
b.setAttribute("flex", "1");
|
2007-08-21 22:01:12 -07:00
|
|
|
|
this.mPanelContainer.appendChild(notificationbox);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2007-08-21 22:01:16 -07:00
|
|
|
|
b.addEventListener("DOMTitleChanged", this.onTitleChanged, true);
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
if (this.mStrip.collapsed)
|
|
|
|
|
this.setStripVisibilityTo(true);
|
|
|
|
|
|
|
|
|
|
// wire up a progress listener for the new browser object.
|
|
|
|
|
var position = this.mTabContainer.childNodes.length-1;
|
2007-08-21 21:59:22 -07:00
|
|
|
|
var tabListener = this.mTabProgressListener(t, b, blank);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
const filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
|
|
|
|
|
.createInstance(Components.interfaces.nsIWebProgress);
|
|
|
|
|
filter.addProgressListener(tabListener, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
|
|
|
|
b.webProgress.addProgressListener(filter, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
|
|
|
|
this.mTabListeners[position] = tabListener;
|
|
|
|
|
this.mTabFilters[position] = filter;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
b._fastFind = this.fastFind;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
var uniqueId = "panel" + Date.now() + position;
|
|
|
|
|
this.mPanelContainer.lastChild.id = uniqueId;
|
|
|
|
|
t.linkedPanel = uniqueId;
|
|
|
|
|
t.linkedBrowser = b;
|
|
|
|
|
t._tPos = position;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
if (t.previousSibling.selected)
|
2007-08-21 22:00:10 -07:00
|
|
|
|
t.setAttribute("afterselected", true);
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:25 -07:00
|
|
|
|
if (!blank) {
|
2007-08-21 22:02:21 -07:00
|
|
|
|
// Stop the existing about:blank load. Otherwise, if aURI
|
|
|
|
|
// doesn't stop in-progress loads on its own, we'll get into
|
|
|
|
|
// trouble with multiple parallel loads running at once.
|
|
|
|
|
b.stop();
|
|
|
|
|
|
2007-08-21 21:59:31 -07:00
|
|
|
|
// pretend the user typed this so it'll be available till
|
|
|
|
|
// the document successfully loads
|
|
|
|
|
b.userTypedValue = aURI;
|
|
|
|
|
|
2007-08-21 21:59:25 -07:00
|
|
|
|
if (aPostData === undefined)
|
|
|
|
|
aPostData = null;
|
2007-08-21 22:01:08 -07:00
|
|
|
|
const nsIWebNavigation = Components.interfaces.nsIWebNavigation;
|
|
|
|
|
var flags = nsIWebNavigation.LOAD_FLAGS_NONE;
|
|
|
|
|
if (aAllowThirdPartyFixup) {
|
|
|
|
|
flags = nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP;
|
|
|
|
|
}
|
2007-09-17 15:21:34 -07:00
|
|
|
|
try {
|
|
|
|
|
b.loadURIWithFlags(aURI, flags, aReferrerURI, aCharset, aPostData);
|
|
|
|
|
}
|
|
|
|
|
catch (ex) {
|
|
|
|
|
}
|
2007-08-21 21:59:25 -07:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2009-07-10 05:19:07 -07:00
|
|
|
|
this.tabContainer.adjustTabstrip();
|
2007-08-21 22:01:37 -07:00
|
|
|
|
|
2009-07-10 05:19:07 -07:00
|
|
|
|
// Do this asynchronically, as we don't know yet if the tab
|
|
|
|
|
// will be selected.
|
|
|
|
|
setTimeout(function (aTabContainer) {
|
2007-08-21 22:01:48 -07:00
|
|
|
|
if (aTabContainer.selectedItem != t)
|
|
|
|
|
aTabContainer._notifyBackgroundTab(t);
|
2009-07-10 05:19:07 -07:00
|
|
|
|
}, 0, this.tabContainer);
|
2007-08-21 22:01:48 -07:00
|
|
|
|
|
2009-07-10 05:19:07 -07:00
|
|
|
|
// XXXmano: this is a temporary workaround for bug 345399
|
|
|
|
|
// We need to manually update the scroll buttons disabled state
|
|
|
|
|
// if a tab was inserted to the overflow area or removed from it
|
|
|
|
|
// without any scrolling and when the tabbar has already
|
|
|
|
|
// overflowed.
|
|
|
|
|
this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();
|
2007-08-21 22:01:34 -07:00
|
|
|
|
|
2007-08-21 22:01:25 -07:00
|
|
|
|
// Dispatch a new tab notification. We do this once we're
|
|
|
|
|
// entirely done, so that things are in a consistent state
|
|
|
|
|
// even if the event listener opens or closes tabs.
|
|
|
|
|
var evt = document.createEvent("Events");
|
|
|
|
|
evt.initEvent("TabOpen", true, false);
|
|
|
|
|
t.dispatchEvent(evt);
|
2007-08-21 22:01:48 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
return t;
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
<method name="warnAboutClosingTabs">
|
|
|
|
|
<parameter name="aAll"/>
|
|
|
|
|
<body>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
<![CDATA[
|
2007-08-21 21:59:41 -07:00
|
|
|
|
var numTabs = this.mTabContainer.childNodes.length;
|
|
|
|
|
var reallyClose = true;
|
|
|
|
|
if (numTabs <= 1)
|
|
|
|
|
return reallyClose;
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
const pref = "browser.tabs.warnOnClose";
|
|
|
|
|
var shouldPrompt = this.mPrefs.getBoolPref(pref);
|
|
|
|
|
|
|
|
|
|
if (shouldPrompt) {
|
|
|
|
|
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
|
|
|
.getService(Components.interfaces.nsIPromptService);
|
|
|
|
|
|
|
|
|
|
//default to true: if it were false, we wouldn't get this far
|
|
|
|
|
var warnOnClose = { value:true };
|
|
|
|
|
var bundle = this.mStringBundle;
|
|
|
|
|
var tabsToClose = numTabs; //number of tabs to be removed
|
|
|
|
|
if (!aAll)
|
2007-08-21 22:00:55 -07:00
|
|
|
|
--tabsToClose;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
|
2007-08-21 22:02:13 -07:00
|
|
|
|
var messageKey = (tabsToClose == 1) ? "tabs.closeWarningOneTab" : "tabs.closeWarningMultipleTabs";
|
2007-08-21 21:59:41 -07:00
|
|
|
|
var closeKey = (tabsToClose == 1) ? "tabs.closeButtonOne" : "tabs.closeButtonMultiple";
|
2007-08-21 22:02:07 -07:00
|
|
|
|
// focus the window before prompting.
|
|
|
|
|
// this will raise any minimized window, which will
|
|
|
|
|
// make it obvious which window the prompt is for and will
|
|
|
|
|
// solve the problem of windows "obscuring" the prompt.
|
|
|
|
|
// see bug #350299 for more details
|
|
|
|
|
window.focus();
|
2007-08-21 21:59:41 -07:00
|
|
|
|
var buttonPressed = promptService.confirmEx(window,
|
|
|
|
|
bundle.getString('tabs.closeWarningTitle'),
|
|
|
|
|
bundle.getFormattedString(messageKey, [tabsToClose]),
|
|
|
|
|
(promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0)
|
|
|
|
|
+ (promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1),
|
|
|
|
|
bundle.getString(closeKey),
|
|
|
|
|
null, null,
|
|
|
|
|
bundle.getString('tabs.closeWarningPromptMe'),
|
|
|
|
|
warnOnClose);
|
|
|
|
|
reallyClose = (buttonPressed == 0);
|
|
|
|
|
// don't set the pref unless they press OK and it's false
|
|
|
|
|
if (reallyClose && !warnOnClose.value)
|
|
|
|
|
this.mPrefs.setBoolPref(pref, false);
|
|
|
|
|
}
|
|
|
|
|
return reallyClose;
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:10 -07:00
|
|
|
|
<method name="removeAllTabsBut">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:02:03 -07:00
|
|
|
|
if (this.warnAboutClosingTabs(false)) {
|
2008-10-21 12:57:26 -07:00
|
|
|
|
this.selectedTab = aTab;
|
2007-08-21 21:59:10 -07:00
|
|
|
|
|
2008-10-21 12:57:26 -07:00
|
|
|
|
for (let i = this.mTabs.length - 1; i >= 0; --i) {
|
|
|
|
|
if (this.mTabs[i] != aTab)
|
|
|
|
|
this.removeTab(this.mTabs[i]);
|
2007-08-21 21:59:41 -07:00
|
|
|
|
}
|
2007-08-21 21:59:24 -07:00
|
|
|
|
}
|
2007-08-21 21:59:10 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="removeCurrentTab">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-03-24 04:47:06 -07:00
|
|
|
|
this.removeTab(this.mCurrentTab);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
<field name="_removingTabs">
|
|
|
|
|
[]
|
|
|
|
|
</field>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="removeTab">
|
|
|
|
|
<parameter name="aTab"/>
|
2008-08-11 01:38:43 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-05-14 09:46:50 -07:00
|
|
|
|
this._endRemoveTab(this._beginRemoveTab(aTab, false, null, true));
|
2008-08-11 01:38:43 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
<!-- Tab close requests are ignored if the window is closing anyway,
|
|
|
|
|
e.g. when holding Ctrl+W. -->
|
|
|
|
|
<field name="_windowIsClosing">
|
|
|
|
|
false
|
|
|
|
|
</field>
|
|
|
|
|
|
2008-10-21 11:05:51 -07:00
|
|
|
|
<!-- Returns everything that _endRemoveTab needs in an array. -->
|
2008-08-11 01:38:43 -07:00
|
|
|
|
<method name="_beginRemoveTab">
|
|
|
|
|
<parameter name="aTab"/>
|
2009-05-14 09:46:50 -07:00
|
|
|
|
<parameter name="aTabWillBeMoved"/>
|
2008-10-21 11:05:51 -07:00
|
|
|
|
<parameter name="aCloseWindowWithLastTab"/>
|
2009-04-05 01:10:24 -07:00
|
|
|
|
<parameter name="aCloseWindowFastpath"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-03-24 04:47:06 -07:00
|
|
|
|
if (this._removingTabs.indexOf(aTab) > -1 || this._windowIsClosing)
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
var browser = this.getBrowserForTab(aTab);
|
|
|
|
|
|
2009-05-14 09:46:50 -07:00
|
|
|
|
if (!aTabWillBeMoved) {
|
2009-03-24 04:47:06 -07:00
|
|
|
|
let ds = browser.docShell;
|
2008-08-11 01:38:43 -07:00
|
|
|
|
if (ds.contentViewer && !ds.contentViewer.permitUnload())
|
2008-09-17 08:07:26 -07:00
|
|
|
|
return null;
|
2008-09-17 08:06:54 -07:00
|
|
|
|
}
|
|
|
|
|
|
2008-10-21 11:05:51 -07:00
|
|
|
|
var closeWindow = false;
|
2009-03-24 04:47:06 -07:00
|
|
|
|
var l = this.mTabs.length - this._removingTabs.length;
|
2009-04-25 01:09:39 -07:00
|
|
|
|
var newTab = false;
|
2007-08-21 22:01:20 -07:00
|
|
|
|
if (l == 1) {
|
2008-10-21 11:05:51 -07:00
|
|
|
|
closeWindow = aCloseWindowWithLastTab != null ?
|
|
|
|
|
aCloseWindowWithLastTab :
|
|
|
|
|
this.mPrefs.getBoolPref("browser.tabs.closeWindowWithLastTab");
|
|
|
|
|
|
2009-04-05 01:10:24 -07:00
|
|
|
|
// Closing the tab and replacing it with a blank one is notably slower
|
|
|
|
|
// than closing the window right away. If the caller opts in, take
|
|
|
|
|
// the fast path.
|
|
|
|
|
if (closeWindow &&
|
|
|
|
|
aCloseWindowFastpath &&
|
|
|
|
|
this._removingTabs.length == 0 &&
|
|
|
|
|
(this._windowIsClosing = window.closeWindow(true)))
|
|
|
|
|
return null;
|
|
|
|
|
|
2009-04-25 01:09:39 -07:00
|
|
|
|
newTab = true;
|
2008-09-22 06:56:51 -07:00
|
|
|
|
l++;
|
2007-08-21 22:01:20 -07:00
|
|
|
|
}
|
2008-09-17 08:07:26 -07:00
|
|
|
|
if (l == 2) {
|
2009-03-24 04:47:06 -07:00
|
|
|
|
let autohide = this.mPrefs.getBoolPref("browser.tabs.autoHide");
|
|
|
|
|
let tabStripHide = !window.toolbar.visible;
|
2007-08-21 22:00:19 -07:00
|
|
|
|
if (autohide || tabStripHide)
|
2007-08-21 21:58:49 -07:00
|
|
|
|
this.setStripVisibilityTo(false);
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
this._removingTabs.push(aTab);
|
2008-09-17 08:07:26 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// We're committed to closing the tab now.
|
2007-08-21 22:01:44 -07:00
|
|
|
|
// Dispatch a notification.
|
|
|
|
|
// We dispatch it before any teardown so that event listeners can
|
|
|
|
|
// inspect the tab that's about to close.
|
2009-05-14 09:46:50 -07:00
|
|
|
|
var evt = document.createEvent("UIEvent");
|
|
|
|
|
evt.initUIEvent("TabClose", true, false, window, aTabWillBeMoved ? 1 : 0);
|
2007-08-21 22:01:44 -07:00
|
|
|
|
aTab.dispatchEvent(evt);
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
// Remove the tab's filter and progress listener.
|
2009-03-24 04:47:06 -07:00
|
|
|
|
const filter = this.mTabFilters[aTab._tPos];
|
|
|
|
|
browser.webProgress.removeProgressListener(filter);
|
|
|
|
|
filter.removeProgressListener(this.mTabListeners[aTab._tPos]);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2007-08-21 21:59:00 -07:00
|
|
|
|
// Remove our title change and blocking listeners
|
2009-03-24 04:47:06 -07:00
|
|
|
|
browser.removeEventListener("DOMTitleChanged", this.onTitleChanged, true);
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
// We are no longer the primary content area.
|
2009-03-24 04:47:06 -07:00
|
|
|
|
browser.setAttribute("type", "content-targetable");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2008-03-20 02:08:36 -07:00
|
|
|
|
// Remove this tab as the owner of any other tabs, since it's going away.
|
2009-03-24 04:47:06 -07:00
|
|
|
|
Array.forEach(this.mTabs, function (tab) {
|
2008-08-11 01:38:43 -07:00
|
|
|
|
if ("owner" in tab && tab.owner == aTab)
|
2008-03-20 02:08:36 -07:00
|
|
|
|
// |tab| is a child of the tab we're removing, make it an orphan
|
|
|
|
|
tab.owner = null;
|
2009-03-24 04:47:06 -07:00
|
|
|
|
});
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2009-03-25 02:54:33 -07:00
|
|
|
|
return [aTab, closeWindow, newTab];
|
2008-08-11 01:38:43 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="_endRemoveTab">
|
2008-10-21 11:05:51 -07:00
|
|
|
|
<parameter name="args"/>
|
2008-08-11 01:38:43 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2008-10-21 11:05:51 -07:00
|
|
|
|
if (!args)
|
2008-09-22 06:56:51 -07:00
|
|
|
|
return;
|
2009-03-25 02:54:33 -07:00
|
|
|
|
var [aTab, aCloseWindow, aNewTab] = args;
|
2008-09-17 08:07:26 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// update the UI early for responsiveness
|
|
|
|
|
aTab.collapsed = true;
|
2009-04-25 01:09:39 -07:00
|
|
|
|
if (aNewTab)
|
|
|
|
|
this.addTab("about:blank");
|
2009-03-24 04:47:06 -07:00
|
|
|
|
this.tabContainer._fillTrailingGap();
|
|
|
|
|
this._blurTab(aTab);
|
|
|
|
|
|
|
|
|
|
this._removingTabs.splice(this._removingTabs.indexOf(aTab), 1);
|
|
|
|
|
|
|
|
|
|
if (aCloseWindow) {
|
|
|
|
|
this._windowIsClosing = true;
|
|
|
|
|
while (this._removingTabs.length)
|
|
|
|
|
this._endRemoveTab([this._removingTabs[0], false]);
|
|
|
|
|
} else if (!this._windowIsClosing) {
|
2009-04-25 01:09:39 -07:00
|
|
|
|
if (aNewTab && gURLBar)
|
|
|
|
|
gURLBar.focus();
|
2009-07-10 05:19:07 -07:00
|
|
|
|
|
|
|
|
|
this.tabContainer.adjustTabstrip();
|
|
|
|
|
// workaround for bug 345399
|
|
|
|
|
this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();
|
2009-03-24 04:47:06 -07:00
|
|
|
|
}
|
2008-08-11 01:38:43 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// We're going to remove the tab and the browser now.
|
|
|
|
|
// Clean up mTabFilters and mTabListeners now rather than in
|
|
|
|
|
// _beginRemoveTab, so that their size is always in sync with the
|
|
|
|
|
// number of tabs and browsers (the xbl destructor depends on this).
|
|
|
|
|
this.mTabFilters.splice(aTab._tPos, 1);
|
|
|
|
|
this.mTabListeners.splice(aTab._tPos, 1);
|
2008-08-11 01:38:43 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
var browser = this.getBrowserForTab(aTab);
|
2008-08-11 01:38:43 -07:00
|
|
|
|
|
2007-08-21 21:59:56 -07:00
|
|
|
|
// Because of the way XBL works (fields just set JS
|
|
|
|
|
// properties on the element) and the code we have in place
|
|
|
|
|
// to preserve the JS objects for any elements that have
|
|
|
|
|
// JS properties set on them, the browser element won't be
|
|
|
|
|
// destroyed until the document goes away. So we force a
|
|
|
|
|
// cleanup ourselves.
|
2007-08-21 21:59:58 -07:00
|
|
|
|
// This has to happen before we remove the child so that the
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 11:00:39 -07:00
|
|
|
|
// XBL implementation of nsIObserver still works.
|
2008-08-11 01:38:43 -07:00
|
|
|
|
browser.destroy();
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2008-08-11 01:38:43 -07:00
|
|
|
|
if (browser == this.mCurrentBrowser)
|
2007-12-14 16:25:17 -08:00
|
|
|
|
this.mCurrentBrowser = null;
|
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// Invalidate browsers cache, as the tab is removed from the
|
|
|
|
|
// tab container.
|
|
|
|
|
this._browsers = null;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// Remove the tab ...
|
|
|
|
|
this.tabContainer.removeChild(aTab);
|
2008-03-20 02:08:36 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// ... and fix up the _tPos properties immediately.
|
|
|
|
|
for (let i = aTab._tPos; i < this.mTabs.length; i++)
|
2008-10-21 11:05:51 -07:00
|
|
|
|
this.mTabs[i]._tPos = i;
|
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// update first-tab/last-tab/beforeselected/afterselected attributes
|
|
|
|
|
this.selectedTab._selected = true;
|
|
|
|
|
|
|
|
|
|
// This will unload the document. An unload handler could remove
|
|
|
|
|
// dependant tabs, so it's important that the tabbrowser is now in
|
|
|
|
|
// a consistent state (tab removed, tab positions updated, etc.).
|
|
|
|
|
// Also, it's important that another tab has been selected before
|
|
|
|
|
// the panel is removed; otherwise, a random sibling panel can flash.
|
|
|
|
|
this.mPanelContainer.removeChild(browser.parentNode);
|
2008-03-20 02:08:36 -07:00
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// As the panel is removed, the removal of a dependent document can
|
|
|
|
|
// cause the whole window to close. So at this point, it's possible
|
|
|
|
|
// that the binding is destructed.
|
|
|
|
|
if (this.mTabBox)
|
|
|
|
|
this.mTabBox.selectedPanel = this.getBrowserForTab(this.mCurrentTab).parentNode;
|
2007-08-21 21:59:56 -07:00
|
|
|
|
|
2008-10-21 11:05:51 -07:00
|
|
|
|
if (aCloseWindow)
|
2009-03-24 04:47:06 -07:00
|
|
|
|
this._windowIsClosing = closeWindow(true);
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="_blurTab">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
if (this.mCurrentTab != aTab)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (aTab.owner &&
|
|
|
|
|
this._removingTabs.indexOf(aTab.owner) == -1 &&
|
|
|
|
|
this.mPrefs.getBoolPref("browser.tabs.selectOwnerOnClose")) {
|
|
|
|
|
this.selectedTab = aTab.owner;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var tab = aTab;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
tab = tab.nextSibling;
|
|
|
|
|
} while (tab && this._removingTabs.indexOf(tab) != -1);
|
|
|
|
|
|
|
|
|
|
if (!tab) {
|
|
|
|
|
tab = aTab;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
tab = tab.previousSibling;
|
|
|
|
|
} while (tab && this._removingTabs.indexOf(tab) != -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.selectedTab = tab;
|
2008-08-11 01:38:43 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="swapBrowsersAndCloseOther">
|
|
|
|
|
<parameter name="aOurTab"/>
|
|
|
|
|
<parameter name="aOtherTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-04-16 07:44:07 -07:00
|
|
|
|
// That's gBrowser for the other window, not the tab's browser!
|
2008-08-11 01:38:43 -07:00
|
|
|
|
var remoteBrowser =
|
|
|
|
|
aOtherTab.ownerDocument.defaultView.getBrowser();
|
|
|
|
|
|
|
|
|
|
// First, start teardown of the other browser. Make sure to not
|
2008-10-21 11:05:51 -07:00
|
|
|
|
// fire the beforeunload event in the process. Close the other
|
|
|
|
|
// window if this was its last tab.
|
2009-05-14 09:46:50 -07:00
|
|
|
|
var endRemoveArgs = remoteBrowser._beginRemoveTab(aOtherTab, true, true);
|
2008-08-11 01:38:43 -07:00
|
|
|
|
|
|
|
|
|
// Unhook our progress listener
|
|
|
|
|
var ourIndex = aOurTab._tPos;
|
|
|
|
|
const filter = this.mTabFilters[ourIndex];
|
|
|
|
|
var tabListener = this.mTabListeners[ourIndex];
|
|
|
|
|
var ourBrowser = this.getBrowserForTab(aOurTab);
|
|
|
|
|
ourBrowser.webProgress.removeProgressListener(filter);
|
|
|
|
|
filter.removeProgressListener(tabListener);
|
|
|
|
|
var tabListenerBlank = tabListener.mBlank;
|
|
|
|
|
|
2009-04-16 07:44:07 -07:00
|
|
|
|
// Workarounds for bug 458697
|
|
|
|
|
// Icon might have been set on DOMLinkAdded, don't override that.
|
|
|
|
|
if (!ourBrowser.mIconURL && aOtherTab.linkedBrowser.mIconURL)
|
|
|
|
|
this.setIcon(aOurTab, aOtherTab.linkedBrowser.mIconURL);
|
|
|
|
|
var isBusy = aOtherTab.hasAttribute("busy");
|
|
|
|
|
if (isBusy) {
|
|
|
|
|
aOurTab.setAttribute("busy", "true");
|
|
|
|
|
if (aOurTab == this.selectedTab)
|
|
|
|
|
this.mIsBusy = true;
|
|
|
|
|
}
|
|
|
|
|
|
2008-08-11 01:38:43 -07:00
|
|
|
|
// Swap the docshells
|
2009-04-16 07:44:07 -07:00
|
|
|
|
ourBrowser.swapDocShells(aOtherTab.linkedBrowser);
|
2008-08-11 01:38:43 -07:00
|
|
|
|
|
|
|
|
|
// Finish tearing down the tab that's going away.
|
2008-10-21 11:05:51 -07:00
|
|
|
|
remoteBrowser._endRemoveTab(endRemoveArgs);
|
2008-08-11 01:38:43 -07:00
|
|
|
|
|
|
|
|
|
// Restore the progress listener
|
|
|
|
|
tabListener = this.mTabProgressListener(aOurTab, ourBrowser,
|
|
|
|
|
tabListenerBlank);
|
|
|
|
|
this.mTabListeners[ourIndex] = tabListener;
|
|
|
|
|
filter.addProgressListener(tabListener,
|
|
|
|
|
Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
2008-10-21 11:05:51 -07:00
|
|
|
|
|
2008-08-11 01:38:43 -07:00
|
|
|
|
ourBrowser.webProgress.addProgressListener(filter,
|
|
|
|
|
Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
2008-11-15 11:47:53 -08:00
|
|
|
|
|
2009-04-16 07:44:07 -07:00
|
|
|
|
if (isBusy)
|
|
|
|
|
this.setTabTitleLoading(aOurTab);
|
|
|
|
|
else
|
|
|
|
|
this.setTabTitle(aOurTab);
|
2009-02-12 01:17:31 -08:00
|
|
|
|
this.updateIcon(aOurTab);
|
2008-11-15 11:47:53 -08:00
|
|
|
|
|
2009-01-22 19:00:54 -08:00
|
|
|
|
// If the tab was already selected (this happpens in the scenario
|
|
|
|
|
// of replaceTabWithWindow), notify onLocationChange, etc.
|
2008-11-15 11:47:53 -08:00
|
|
|
|
if (aOurTab == this.selectedTab)
|
|
|
|
|
this.updateCurrentBrowser(true);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="reloadAllTabs">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var l = this.mPanelContainer.childNodes.length;
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
for (var i = 0; i < l; i++) {
|
|
|
|
|
try {
|
2007-08-21 21:59:41 -07:00
|
|
|
|
this.getBrowserAtIndex(i).reload();
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
} catch (e) {
|
|
|
|
|
// ignore failure to reload so others will be reloaded
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="reloadTab">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
this.getBrowserForTab(aTab).reload();
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 21:59:34 -07:00
|
|
|
|
<method name="onTabBarDblClick">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:01:33 -07:00
|
|
|
|
// See hack note in the tabbrowser-close-button binding
|
|
|
|
|
if (!this._blockDblClick && aEvent.button == 0 &&
|
2007-08-21 22:01:25 -07:00
|
|
|
|
aEvent.originalTarget.localName == "box") {
|
|
|
|
|
// xxx this needs to check that we're in the empty area of the tabstrip
|
2007-08-21 22:00:16 -07:00
|
|
|
|
var e = document.createEvent("Events");
|
2007-08-21 22:01:03 -07:00
|
|
|
|
e.initEvent("NewTab", true, true);
|
2007-08-21 22:00:16 -07:00
|
|
|
|
this.dispatchEvent(e);
|
|
|
|
|
}
|
2007-08-21 21:59:34 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="addProgressListener">
|
|
|
|
|
<parameter name="aListener"/>
|
|
|
|
|
<parameter name="aMask"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:37 -07:00
|
|
|
|
if (!this.mAddProgressListenerWasCalled) {
|
|
|
|
|
this.mAddProgressListenerWasCalled = true;
|
|
|
|
|
var autoHide = this.mPrefs.getBoolPref("browser.tabs.autoHide");
|
|
|
|
|
var tabStripHide = !window.toolbar.visible;
|
2008-09-17 08:07:26 -07:00
|
|
|
|
if (!autoHide && !tabStripHide)
|
2007-08-21 22:00:37 -07:00
|
|
|
|
this.setStripVisibilityTo(true);
|
|
|
|
|
}
|
|
|
|
|
|
2008-11-20 15:56:00 -08:00
|
|
|
|
if (!this.mTabbedMode && this.mProgressListeners.length == 1) {
|
|
|
|
|
// If we are adding a 2nd progress listener, we need to enter tabbed mode
|
|
|
|
|
// because the browser status filter can only handle one progress listener.
|
|
|
|
|
// In tabbed mode, mTabProgressListener is used which will iterate over all listeners.
|
|
|
|
|
this.enterTabbedMode();
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
this.mProgressListeners.push(aListener);
|
2008-11-20 15:56:00 -08:00
|
|
|
|
|
|
|
|
|
if (!this.mTabbedMode) {
|
|
|
|
|
// If someone does this:
|
|
|
|
|
// addProgressListener, removeProgressListener, addProgressListener
|
|
|
|
|
// don't create a new filter; reuse the existing filter.
|
|
|
|
|
if (this.mTabFilters.length == 0) {
|
|
|
|
|
// hook a filter up to our first browser
|
|
|
|
|
const filter = Components.classes["@mozilla.org/appshell/component/browser-status-filter;1"]
|
|
|
|
|
.createInstance(Components.interfaces.nsIWebProgress);
|
|
|
|
|
this.mTabFilters[0] = filter;
|
|
|
|
|
this.mCurrentBrowser.webProgress.addProgressListener(filter, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Directly hook the listener up to the filter for better performance
|
|
|
|
|
this.mTabFilters[0].addProgressListener(aListener, aMask);
|
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="removeProgressListener">
|
|
|
|
|
<parameter name="aListener"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
for (var i = 0; i < this.mProgressListeners.length; i++) {
|
|
|
|
|
if (this.mProgressListeners[i] == aListener) {
|
2007-08-21 22:00:26 -07:00
|
|
|
|
this.mProgressListeners.splice(i, 1);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2008-11-20 15:56:00 -08:00
|
|
|
|
|
2009-05-19 16:51:22 -07:00
|
|
|
|
if (!this.mTabbedMode)
|
|
|
|
|
// Don't forget to remove it from the filter we hooked it up to
|
2008-11-20 15:56:00 -08:00
|
|
|
|
this.mTabFilters[0].removeProgressListener(aListener);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2008-11-18 02:53:25 -08:00
|
|
|
|
<method name="addTabsProgressListener">
|
|
|
|
|
<parameter name="aListener"/>
|
|
|
|
|
<body>
|
2008-11-20 15:59:28 -08:00
|
|
|
|
if (!this.mTabbedMode)
|
|
|
|
|
this.enterTabbedMode();
|
2008-11-18 02:53:25 -08:00
|
|
|
|
this.mTabsProgressListeners.push(aListener);
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="removeTabsProgressListener">
|
|
|
|
|
<parameter name="aListener"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var pos = this.mTabsProgressListeners.indexOf(aListener);
|
|
|
|
|
if (pos >= 0)
|
|
|
|
|
this.mTabsProgressListeners.splice(pos, 1);
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<method name="getBrowserForTab">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:10 -07:00
|
|
|
|
return aTab.linkedBrowser;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
2008-09-02 01:50:22 -07:00
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="selectTabAtIndex">
|
|
|
|
|
<parameter name="aIndex"/>
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
// count backwards for aIndex < 0
|
|
|
|
|
if (aIndex < 0)
|
|
|
|
|
aIndex += this.mTabs.length;
|
|
|
|
|
|
2008-09-02 06:00:14 -07:00
|
|
|
|
if (aIndex >= 0 &&
|
2008-09-02 01:50:22 -07:00
|
|
|
|
aIndex < this.mTabs.length &&
|
|
|
|
|
aIndex != this.tabContainer.selectedIndex)
|
|
|
|
|
this.selectedTab = this.mTabs[aIndex];
|
|
|
|
|
|
|
|
|
|
if (aEvent) {
|
|
|
|
|
aEvent.preventDefault();
|
|
|
|
|
aEvent.stopPropagation();
|
|
|
|
|
}
|
|
|
|
|
]]>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 22:02:10 -07:00
|
|
|
|
<property name="tabContainer" readonly="true">
|
2007-08-21 21:59:24 -07:00
|
|
|
|
<getter>
|
|
|
|
|
return this.mTabContainer;
|
|
|
|
|
</getter>
|
|
|
|
|
</property>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<property name="selectedTab">
|
|
|
|
|
<getter>
|
|
|
|
|
return this.mTabBox.selectedTab;
|
|
|
|
|
</getter>
|
|
|
|
|
<setter>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:27 -07:00
|
|
|
|
// Update the tab
|
|
|
|
|
this.mTabBox.selectedTab = val;
|
|
|
|
|
return val;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</setter>
|
|
|
|
|
</property>
|
|
|
|
|
|
|
|
|
|
<property name="selectedBrowser"
|
|
|
|
|
onget="return this.mCurrentBrowser;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<property name="browsers" readonly="true">
|
|
|
|
|
<getter>
|
|
|
|
|
<![CDATA[
|
2008-09-02 05:15:06 -07:00
|
|
|
|
return this._browsers ||
|
|
|
|
|
(this._browsers = Array.map(this.mTabs, function (tab) tab.linkedBrowser));
|
2007-08-21 22:00:10 -07:00
|
|
|
|
]]>
|
|
|
|
|
</getter>
|
|
|
|
|
</property>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
<method name="_onDragStart">
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<parameter name="aEvent"/>
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2008-09-30 08:19:00 -07:00
|
|
|
|
var target = aEvent.target;
|
|
|
|
|
if (target.localName == "tab" &&
|
2007-08-21 22:00:54 -07:00
|
|
|
|
aEvent.originalTarget.localName != "toolbarbutton") {
|
2008-09-30 08:19:00 -07:00
|
|
|
|
var dt = aEvent.dataTransfer;
|
2009-02-19 04:00:05 -08:00
|
|
|
|
dt.mozSetDataAt(TAB_DROP_TYPE, target, 0);
|
2009-01-22 19:00:54 -08:00
|
|
|
|
var uri = this.getBrowserForTab(aEvent.target).currentURI;
|
|
|
|
|
var spec = uri ? uri.spec : "about:blank";
|
2009-02-19 04:00:05 -08:00
|
|
|
|
|
2009-03-26 23:50:03 -07:00
|
|
|
|
// We must not set text/x-moz-url or text/plain data here,
|
|
|
|
|
// otherwise trying to deatch the tab by dropping it on the desktop
|
|
|
|
|
// may result in an "internet shortcut"
|
|
|
|
|
dt.mozSetDataAt("text/x-moz-text-internal", spec, 0);
|
2009-03-06 09:54:29 -08:00
|
|
|
|
|
|
|
|
|
// Set the cursor to an arrow during tab drags.
|
|
|
|
|
dt.mozCursor = "default";
|
2008-11-15 11:47:53 -08:00
|
|
|
|
|
|
|
|
|
var canvas = tabPreviews.capture(target, false);
|
|
|
|
|
dt.setDragImage(canvas, 0, 0);
|
2008-11-18 12:09:50 -08:00
|
|
|
|
aEvent.stopPropagation();
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
2009-02-04 13:33:01 -08:00
|
|
|
|
|
|
|
|
|
this._dragLeftWindow = false;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
<field name="mDragTime">0</field>
|
|
|
|
|
<field name="mDragOverDelay">350</field>
|
|
|
|
|
|
|
|
|
|
<field name="_supportedLinkDropTypes"><![CDATA[
|
|
|
|
|
["text/x-moz-url", "text/uri-list", "text/plain", "application/x-moz-file"]
|
|
|
|
|
]]></field>
|
|
|
|
|
|
|
|
|
|
<method name="_setEffectAllowedForDataTransfer">
|
2007-08-21 22:01:38 -07:00
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2008-09-30 08:19:00 -07:00
|
|
|
|
var dt = aEvent.dataTransfer;
|
|
|
|
|
// Disallow dropping multiple items
|
|
|
|
|
if (dt.mozItemCount > 1)
|
2009-01-22 19:00:54 -08:00
|
|
|
|
return dt.effectAllowed = "none";
|
2008-09-30 08:19:00 -07:00
|
|
|
|
|
|
|
|
|
var types = dt.mozTypesAt(0);
|
|
|
|
|
var sourceNode = null;
|
|
|
|
|
// tabs are always added as the first type
|
2009-02-19 04:00:05 -08:00
|
|
|
|
if (types[0] == TAB_DROP_TYPE) {
|
|
|
|
|
var sourceNode = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
|
2008-09-30 08:19:00 -07:00
|
|
|
|
if (sourceNode instanceof XULElement &&
|
|
|
|
|
sourceNode.localName == "tab" &&
|
|
|
|
|
(sourceNode.parentNode == this.mTabContainer ||
|
|
|
|
|
(sourceNode.ownerDocument.defaultView instanceof ChromeWindow &&
|
|
|
|
|
sourceNode.ownerDocument.documentElement.getAttribute("windowtype") == "navigator:browser"))) {
|
|
|
|
|
if (sourceNode.parentNode == this.mTabContainer &&
|
|
|
|
|
(aEvent.screenX >= sourceNode.boxObject.screenX &&
|
|
|
|
|
aEvent.screenX <= (sourceNode.boxObject.screenX +
|
|
|
|
|
sourceNode.boxObject.width))) {
|
2008-11-15 11:47:53 -08:00
|
|
|
|
return dt.effectAllowed = "none";
|
2008-09-30 08:19:00 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return dt.effectAllowed = "copyMove";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i=0; i < this._supportedLinkDropTypes.length; i++) {
|
|
|
|
|
if (types.contains(this._supportedLinkDropTypes[i])) {
|
|
|
|
|
// Here we need to to do this manually
|
|
|
|
|
return dt.effectAllowed = dt.dropEffect = "link";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return dt.effectAllowed = "none";
|
2007-08-21 22:01:38 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
<method name="_onDragOver">
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<![CDATA[
|
2008-09-30 08:19:00 -07:00
|
|
|
|
var effects = this._setEffectAllowedForDataTransfer(aEvent);
|
|
|
|
|
|
|
|
|
|
var ib = this.mTabDropIndicatorBar;
|
2008-11-18 12:09:50 -08:00
|
|
|
|
if (effects == "" || effects == "none") {
|
2008-09-30 08:19:00 -07:00
|
|
|
|
ib.collapsed = "true";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
aEvent.preventDefault();
|
2008-11-18 12:09:50 -08:00
|
|
|
|
aEvent.stopPropagation();
|
2008-09-30 08:19:00 -07:00
|
|
|
|
|
2007-08-21 22:02:40 -07:00
|
|
|
|
var tabStrip = this.mTabContainer.mTabstrip;
|
2007-10-28 20:03:46 -07:00
|
|
|
|
var ltr = (window.getComputedStyle(this.parentNode, null).direction
|
|
|
|
|
== "ltr");
|
2007-08-21 22:01:29 -07:00
|
|
|
|
|
2007-08-21 22:02:40 -07:00
|
|
|
|
// autoscroll the tab strip if we drag over the scroll
|
|
|
|
|
// buttons, even if we aren't dragging a tab, but then
|
|
|
|
|
// return to avoid drawing the drop indicator
|
|
|
|
|
var pixelsToScroll = 0;
|
2007-10-28 20:03:46 -07:00
|
|
|
|
if (this.mTabContainer.getAttribute("overflow") == "true") {
|
|
|
|
|
var targetAnonid = aEvent.originalTarget.getAttribute("anonid");
|
|
|
|
|
switch (targetAnonid) {
|
|
|
|
|
case "scrollbutton-up":
|
|
|
|
|
pixelsToScroll = tabStrip.scrollIncrement * -1;
|
|
|
|
|
break;
|
|
|
|
|
case "scrollbutton-down":
|
|
|
|
|
case "alltabs-button":
|
2008-09-25 00:39:41 -07:00
|
|
|
|
case "newtab-button":
|
2007-10-28 20:03:46 -07:00
|
|
|
|
pixelsToScroll = tabStrip.scrollIncrement;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (pixelsToScroll)
|
|
|
|
|
tabStrip.scrollByPixels((ltr ? 1 : -1) * pixelsToScroll);
|
2007-08-21 22:02:40 -07:00
|
|
|
|
}
|
2007-08-21 22:01:25 -07:00
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
if (effects == "link" && aEvent.target.localName == "tab") {
|
2007-08-21 22:02:40 -07:00
|
|
|
|
if (!this.mDragTime)
|
|
|
|
|
this.mDragTime = Date.now();
|
|
|
|
|
if (Date.now() >= this.mDragTime + this.mDragOverDelay)
|
|
|
|
|
this.mTabContainer.selectedItem = aEvent.target;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var newIndex = this.getNewIndex(aEvent);
|
|
|
|
|
var ib = this.mTabDropIndicatorBar;
|
|
|
|
|
var ind = ib.firstChild;
|
2009-07-10 02:13:10 -07:00
|
|
|
|
var scrollRect = tabStrip.scrollClientRect;
|
|
|
|
|
var rect = this.getBoundingClientRect();
|
|
|
|
|
var minMargin = scrollRect.left - rect.left;
|
2007-09-17 17:59:41 -07:00
|
|
|
|
// make sure we don't place the tab drop indicator past the
|
|
|
|
|
// edge, or the containing box will flex and stretch
|
|
|
|
|
// the tab drop indicator bar, which will flex the url bar.
|
|
|
|
|
// XXX todo
|
|
|
|
|
// just use first value if you can figure out how to get
|
|
|
|
|
// the tab drop indicator to crop instead of flex and stretch
|
|
|
|
|
// the tab drop indicator bar.
|
2009-07-10 02:13:10 -07:00
|
|
|
|
var maxMargin = Math.min(minMargin + scrollRect.width,
|
|
|
|
|
ib.getBoundingClientRect().right -
|
|
|
|
|
ind.clientWidth);
|
2007-10-28 20:03:46 -07:00
|
|
|
|
if (!ltr)
|
2009-07-10 02:13:10 -07:00
|
|
|
|
[minMargin, maxMargin] = [this.clientWidth - maxMargin,
|
|
|
|
|
this.clientWidth - minMargin];
|
|
|
|
|
var newMargin;
|
2007-09-17 17:59:41 -07:00
|
|
|
|
if (pixelsToScroll) {
|
2007-08-21 22:02:40 -07:00
|
|
|
|
// if we are scrolling, put the drop indicator at the edge
|
|
|
|
|
// so that it doesn't jump while scrolling
|
2007-09-17 17:59:41 -07:00
|
|
|
|
newMargin = (pixelsToScroll > 0) ? maxMargin : minMargin;
|
|
|
|
|
}
|
|
|
|
|
else {
|
2007-08-21 22:02:40 -07:00
|
|
|
|
if (newIndex == this.mTabs.length) {
|
2009-07-10 02:13:10 -07:00
|
|
|
|
let tabRect = this.mTabs[newIndex-1].getBoundingClientRect();
|
2007-09-17 17:59:41 -07:00
|
|
|
|
if (ltr)
|
2009-07-10 02:13:10 -07:00
|
|
|
|
newMargin = tabRect.right - rect.left;
|
2007-09-17 17:59:41 -07:00
|
|
|
|
else
|
2009-07-10 02:13:10 -07:00
|
|
|
|
newMargin = rect.right - tabRect.left;
|
2007-08-21 22:02:40 -07:00
|
|
|
|
}
|
|
|
|
|
else {
|
2009-07-10 02:13:10 -07:00
|
|
|
|
let tabRect = this.mTabs[newIndex].getBoundingClientRect();
|
2007-09-17 17:59:41 -07:00
|
|
|
|
if (ltr)
|
2009-07-10 02:13:10 -07:00
|
|
|
|
newMargin = tabRect.left - rect.left;
|
2007-09-17 17:59:41 -07:00
|
|
|
|
else
|
2009-07-10 02:13:10 -07:00
|
|
|
|
newMargin = rect.right - tabRect.right;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
2007-09-17 17:59:41 -07:00
|
|
|
|
// ensure we never place the drop indicator beyond our limits
|
|
|
|
|
if (newMargin < minMargin)
|
|
|
|
|
newMargin = minMargin;
|
|
|
|
|
else if (newMargin > maxMargin)
|
|
|
|
|
newMargin = maxMargin;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
2007-09-17 17:59:41 -07:00
|
|
|
|
|
2007-10-28 20:03:46 -07:00
|
|
|
|
ind.style.MozMarginStart = newMargin + 'px';
|
2007-09-17 17:59:41 -07:00
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
ib.collapsed = false;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
]]>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
<method name="_onDrop">
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2008-09-30 08:19:00 -07:00
|
|
|
|
var dt = aEvent.dataTransfer;
|
|
|
|
|
var dropEffect = dt.dropEffect;
|
2007-12-12 05:19:50 -08:00
|
|
|
|
var draggedTab;
|
2008-09-30 08:19:00 -07:00
|
|
|
|
if (dropEffect != "link") { // copy or move
|
2009-02-19 04:00:05 -08:00
|
|
|
|
draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
|
2008-11-18 12:09:50 -08:00
|
|
|
|
// not our drop then
|
|
|
|
|
if (!draggedTab)
|
|
|
|
|
return;
|
2008-09-30 08:19:00 -07:00
|
|
|
|
}
|
|
|
|
|
|
2008-11-15 11:47:53 -08:00
|
|
|
|
this.mTabDropIndicatorBar.collapsed = true;
|
2008-11-18 12:09:50 -08:00
|
|
|
|
aEvent.stopPropagation();
|
2008-11-15 11:47:53 -08:00
|
|
|
|
|
|
|
|
|
if (draggedTab && (dropEffect == "copy" ||
|
|
|
|
|
draggedTab.parentNode == this.mTabContainer)) {
|
2007-08-21 22:00:10 -07:00
|
|
|
|
var newIndex = this.getNewIndex(aEvent);
|
2008-09-30 08:19:00 -07:00
|
|
|
|
if (dropEffect == "copy") {
|
2007-12-12 05:19:50 -08:00
|
|
|
|
// copy the dropped tab (wherever it's from)
|
|
|
|
|
var newTab = this.duplicateTab(draggedTab);
|
|
|
|
|
this.moveTabTo(newTab, newIndex);
|
|
|
|
|
if (draggedTab.parentNode != this.mTabContainer || aEvent.shiftKey)
|
|
|
|
|
this.selectedTab = newTab;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// move the dropped tab
|
|
|
|
|
if (newIndex > draggedTab._tPos)
|
|
|
|
|
newIndex--;
|
|
|
|
|
if (newIndex != draggedTab._tPos)
|
|
|
|
|
this.moveTabTo(draggedTab, newIndex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (draggedTab) {
|
2008-08-11 01:38:43 -07:00
|
|
|
|
// swap the dropped tab with a new one we create and then close
|
|
|
|
|
// it in the other window (making it seem to have moved between
|
|
|
|
|
// windows)
|
2007-12-12 05:19:50 -08:00
|
|
|
|
newIndex = this.getNewIndex(aEvent);
|
2008-08-11 01:38:43 -07:00
|
|
|
|
newTab = this.addTab("about:blank");
|
|
|
|
|
var newBrowser = this.getBrowserForTab(newTab);
|
|
|
|
|
// Stop the about:blank load
|
|
|
|
|
newBrowser.stop();
|
|
|
|
|
// make sure it has a docshell
|
|
|
|
|
newBrowser.docShell;
|
|
|
|
|
|
2007-12-12 05:19:50 -08:00
|
|
|
|
this.moveTabTo(newTab, newIndex);
|
2008-08-10 09:15:00 -07:00
|
|
|
|
|
2008-08-11 01:38:43 -07:00
|
|
|
|
this.swapBrowsersAndCloseOther(newTab, draggedTab);
|
|
|
|
|
|
|
|
|
|
// We need to set selectedTab after we've done
|
|
|
|
|
// swapBrowsersAndCloseOther, so that the updateCurrentBrowser
|
|
|
|
|
// it triggers will correctly update our URL bar.
|
|
|
|
|
this.selectedTab = newTab;
|
2007-12-12 05:19:50 -08:00
|
|
|
|
}
|
|
|
|
|
else {
|
2008-09-30 08:19:00 -07:00
|
|
|
|
var url;
|
|
|
|
|
for (var i=0; i < this._supportedLinkDropTypes.length; i++) {
|
|
|
|
|
let dataType = this._supportedLinkDropTypes[i];
|
|
|
|
|
// uri-list: for now, support dropping of the first URL
|
|
|
|
|
// only
|
|
|
|
|
var isURLList = dataType == "text/uri-list";
|
|
|
|
|
let urlData = isURLList ?
|
|
|
|
|
dt.mozGetDataAt("URL", 0) : dt.mozGetDataAt(dataType, 0);
|
|
|
|
|
if (urlData) {
|
|
|
|
|
url = transferUtils.retrieveURLFromData(urlData, isURLList ? "text/plain" : dataType);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
NS_ASSERT(url, "In the drop event, at least one mime-type should match our supported types");
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
// valid urls don't contain spaces ' '; if we have a space it isn't a valid url.
|
|
|
|
|
// Also disallow dropping javascript: or data: urls--bail out
|
|
|
|
|
if (!url || !url.length || url.indexOf(" ", 0) != -1 ||
|
|
|
|
|
/^\s*(javascript|data):/.test(url))
|
|
|
|
|
return;
|
bug 213228: new toolkit independence bug, part 7: update and use the new toolkit widgetry. tabbrowser.xml: bug 205341, 112697, 210760 by jag, bug 121234, 133503 by neil, bug 206668 by shliang. not ported: bug 169589, [mac] ctrl-tab no longer moves btwn frames bug 203960, go back group bug 104778, remember what user typed when switching tabs. bug 103720, prefill URI when opening new tab.
2007-08-21 21:59:18 -07:00
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
// XXXmano: temporary fix until dragDropSecurityCheck make the
|
|
|
|
|
// drag-session an optional paramter
|
|
|
|
|
var dragService = Cc["@mozilla.org/widget/dragservice;1"].
|
|
|
|
|
getService(Ci.nsIDragService);
|
|
|
|
|
var dragSession = dragService.getCurrentSession();
|
|
|
|
|
nsDragAndDrop.dragDropSecurityCheck(aEvent, dragSession, url);
|
2007-08-21 22:00:02 -07:00
|
|
|
|
|
2007-08-21 22:00:45 -07:00
|
|
|
|
var bgLoad = true;
|
|
|
|
|
try {
|
|
|
|
|
bgLoad = this.mPrefs.getBoolPref("browser.tabs.loadInBackground");
|
|
|
|
|
}
|
|
|
|
|
catch (e) { }
|
|
|
|
|
|
|
|
|
|
if (aEvent.shiftKey)
|
|
|
|
|
bgLoad = !bgLoad;
|
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
if (document.getBindingParent(aEvent.originalTarget).localName != "tab" || dropEffect == "copy") {
|
2007-08-21 22:00:10 -07:00
|
|
|
|
// We're adding a new tab.
|
2007-12-12 05:19:50 -08:00
|
|
|
|
newIndex = this.getNewIndex(aEvent);
|
|
|
|
|
newTab = this.loadOneTab(getShortcutOrURI(url), null, null, null, bgLoad, false);
|
|
|
|
|
this.moveTabTo(newTab, newIndex);
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// Load in an existing tab.
|
2007-08-21 22:00:54 -07:00
|
|
|
|
var tab = aEvent.target;
|
2007-08-21 22:01:23 -07:00
|
|
|
|
try {
|
|
|
|
|
this.getBrowserForTab(tab).loadURI(getShortcutOrURI(url));
|
|
|
|
|
if (this.mCurrentTab != tab && !bgLoad)
|
|
|
|
|
this.selectedTab = tab;
|
|
|
|
|
} catch(ex) {
|
|
|
|
|
// Just ignore invalid urls
|
|
|
|
|
}
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
2007-08-21 22:00:10 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2008-11-15 11:47:53 -08:00
|
|
|
|
<method name="_onDragEnd">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-02-26 10:18:47 -08:00
|
|
|
|
// Note: while this case is correctly handled here, this event
|
2009-04-15 17:33:15 -07:00
|
|
|
|
// isn't dispatched when the tab is moved within the tabstrip,
|
2009-02-26 10:18:47 -08:00
|
|
|
|
// see bug 460801.
|
|
|
|
|
|
|
|
|
|
// * mozUserCancelled = the user pressed ESC to cancel the drag
|
2009-02-26 17:03:36 -08:00
|
|
|
|
var dt = aEvent.dataTransfer;
|
2009-04-15 17:33:15 -07:00
|
|
|
|
if (dt.mozUserCancelled || dt.dropEffect != "none")
|
2008-11-15 11:47:53 -08:00
|
|
|
|
return;
|
|
|
|
|
|
2009-05-19 17:11:18 -07:00
|
|
|
|
// Disable detach within the browser toolbox
|
|
|
|
|
var eX = aEvent.screenX;
|
|
|
|
|
var wX = window.screenX;
|
|
|
|
|
// check if the drop point is horizontally within the window
|
|
|
|
|
if (eX > wX && eX < (wX + window.outerWidth)) {
|
|
|
|
|
var bo = this.mTabContainer.mTabstrip.boxObject;
|
2009-05-20 18:53:53 -07:00
|
|
|
|
// also avoid detaching if the the tab was dropped too close to
|
|
|
|
|
// the tabbar (half a tab)
|
|
|
|
|
var endScreenY = bo.screenY + 1.5 * bo.height;
|
2009-05-19 17:11:18 -07:00
|
|
|
|
var eY = aEvent.screenY;
|
2009-05-20 18:53:53 -07:00
|
|
|
|
if (eY < endScreenY && eY > window.screenY)
|
2009-05-19 17:11:18 -07:00
|
|
|
|
return;
|
2008-11-15 11:47:53 -08:00
|
|
|
|
}
|
2009-05-19 17:11:18 -07:00
|
|
|
|
|
|
|
|
|
var draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
|
|
|
|
|
this.replaceTabWithWindow(draggedTab);
|
2008-11-18 12:09:50 -08:00
|
|
|
|
aEvent.stopPropagation();
|
2008-11-15 11:47:53 -08:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2009-03-07 08:03:32 -08:00
|
|
|
|
<!-- Moves a tab to a new browser window, unless it's already the only tab
|
|
|
|
|
in the current window, in which case this will do nothing. -->
|
2009-01-22 19:00:54 -08:00
|
|
|
|
<method name="replaceTabWithWindow">
|
2008-11-15 11:47:53 -08:00
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2009-03-07 08:03:32 -08:00
|
|
|
|
if (this.mTabs.length == 1)
|
2009-05-15 06:44:05 -07:00
|
|
|
|
return null;
|
2009-03-07 08:03:32 -08:00
|
|
|
|
|
2008-11-15 11:47:53 -08:00
|
|
|
|
// tell a new window to take the "dropped" tab
|
|
|
|
|
var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
|
|
|
|
|
getService(Ci.nsIWindowWatcher);
|
2009-04-16 07:44:07 -07:00
|
|
|
|
return ww.openWindow(window,
|
|
|
|
|
getBrowserURL(),
|
|
|
|
|
null,
|
|
|
|
|
"chrome,dialog=no,all",
|
|
|
|
|
aTab);
|
2008-11-15 11:47:53 -08:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2008-09-30 08:19:00 -07:00
|
|
|
|
<method name="_onDragLeave">
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:02:18 -07:00
|
|
|
|
this.mDragTime = 0;
|
|
|
|
|
|
2008-11-15 11:47:53 -08:00
|
|
|
|
// This does not work at all (see bug 458613)
|
|
|
|
|
var target = aEvent.relatedTarget;
|
2009-01-22 19:00:54 -08:00
|
|
|
|
while (target && target != this)
|
2008-11-15 11:47:53 -08:00
|
|
|
|
target = target.parentNode;
|
|
|
|
|
if (target)
|
|
|
|
|
return;
|
|
|
|
|
|
2007-09-17 17:59:41 -07:00
|
|
|
|
this.mTabDropIndicatorBar.collapsed = true;
|
2008-11-18 12:09:50 -08:00
|
|
|
|
aEvent.stopPropagation();
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<method name="moveTabTo">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<parameter name="aIndex"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:01:17 -07:00
|
|
|
|
this._browsers = null; // invalidate cache
|
2007-08-21 22:00:10 -07:00
|
|
|
|
this.mTabFilters.splice(aIndex, 0, this.mTabFilters.splice(aTab._tPos, 1)[0]);
|
|
|
|
|
this.mTabListeners.splice(aIndex, 0, this.mTabListeners.splice(aTab._tPos, 1)[0]);
|
|
|
|
|
|
2007-08-21 22:01:25 -07:00
|
|
|
|
var oldPosition = aTab._tPos;
|
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
aIndex = aIndex < aTab._tPos ? aIndex: aIndex+1;
|
2007-08-21 22:02:31 -07:00
|
|
|
|
this.mCurrentTab._selected = false;
|
2007-08-21 22:02:19 -07:00
|
|
|
|
// use .item() instead of [] because dragging to the end of the strip goes out of
|
|
|
|
|
// bounds: .item() returns null (so it acts like appendChild), but [] throws
|
|
|
|
|
this.mTabContainer.insertBefore(aTab, this.mTabContainer.childNodes.item(aIndex));
|
2007-08-21 22:01:25 -07:00
|
|
|
|
// invalidate cache, because mTabContainer is about to change
|
|
|
|
|
this._browsers = null;
|
2007-08-21 22:00:44 -07:00
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
var i;
|
|
|
|
|
for (i = 0; i < this.mTabContainer.childNodes.length; i++) {
|
|
|
|
|
this.mTabContainer.childNodes[i]._tPos = i;
|
2007-08-21 22:02:31 -07:00
|
|
|
|
this.mTabContainer.childNodes[i]._selected = false;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
2007-08-21 22:02:31 -07:00
|
|
|
|
this.mCurrentTab._selected = true;
|
2009-07-10 02:13:10 -07:00
|
|
|
|
this.mTabContainer.mTabstrip.ensureElementIsVisible(this.mCurrentTab, false);
|
2007-08-21 22:01:25 -07:00
|
|
|
|
|
|
|
|
|
var evt = document.createEvent("UIEvents");
|
|
|
|
|
evt.initUIEvent("TabMove", true, false, window, oldPosition);
|
|
|
|
|
aTab.dispatchEvent(evt);
|
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
return aTab;
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="getNewIndex">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
<![CDATA[
|
2007-08-21 22:00:10 -07:00
|
|
|
|
var i;
|
|
|
|
|
if (window.getComputedStyle(this.parentNode, null).direction == "ltr") {
|
|
|
|
|
for (i = aEvent.target.localName == "tab" ? aEvent.target._tPos : 0; i < this.mTabs.length; i++)
|
2007-08-21 22:01:25 -07:00
|
|
|
|
if (aEvent.screenX < this.mTabs[i].boxObject.screenX + this.mTabs[i].boxObject.width / 2)
|
2007-08-21 22:00:10 -07:00
|
|
|
|
return i;
|
|
|
|
|
} else {
|
2007-09-17 17:59:41 -07:00
|
|
|
|
for (i = aEvent.target.localName == "tab" ? aEvent.target._tPos : 0; i < this.mTabs.length; i++)
|
2007-08-21 22:01:25 -07:00
|
|
|
|
if (aEvent.screenX > this.mTabs[i].boxObject.screenX + this.mTabs[i].boxObject.width / 2)
|
2007-08-21 22:00:10 -07:00
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
return this.mTabs.length;
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<method name="moveTabForward">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var tabPos = this.mCurrentTab._tPos;
|
|
|
|
|
if (tabPos < this.browsers.length - 1) {
|
|
|
|
|
this.moveTabTo(this.mCurrentTab, tabPos + 1);
|
|
|
|
|
this.mCurrentTab.focus();
|
|
|
|
|
}
|
|
|
|
|
else if (this.arrowKeysShouldWrap)
|
|
|
|
|
this.moveTabToStart();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="moveTabBackward">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var tabPos = this.mCurrentTab._tPos;
|
|
|
|
|
if (tabPos > 0) {
|
|
|
|
|
this.moveTabTo(this.mCurrentTab, tabPos - 1);
|
|
|
|
|
this.mCurrentTab.focus();
|
|
|
|
|
}
|
|
|
|
|
else if (this.arrowKeysShouldWrap)
|
|
|
|
|
this.moveTabToEnd();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="moveTabToStart">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var tabPos = this.mCurrentTab._tPos;
|
|
|
|
|
if (tabPos > 0) {
|
|
|
|
|
this.moveTabTo(this.mCurrentTab, 0);
|
|
|
|
|
this.mCurrentTab.focus();
|
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<method name="moveTabToEnd">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var tabPos = this.mCurrentTab._tPos;
|
|
|
|
|
if (tabPos < this.browsers.length - 1) {
|
2007-08-21 22:00:55 -07:00
|
|
|
|
this.moveTabTo(this.mCurrentTab,
|
2007-09-17 17:59:41 -07:00
|
|
|
|
this.browsers.length - 1);
|
2007-08-21 22:00:10 -07:00
|
|
|
|
this.mCurrentTab.focus();
|
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:00:10 -07:00
|
|
|
|
<method name="moveTabOver">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var direction = window.getComputedStyle(this.parentNode, null).direction;
|
|
|
|
|
if ((direction == "ltr" && aEvent.keyCode == KeyEvent.DOM_VK_RIGHT) ||
|
|
|
|
|
(direction == "rtl" && aEvent.keyCode == KeyEvent.DOM_VK_LEFT))
|
|
|
|
|
this.moveTabForward();
|
|
|
|
|
else
|
|
|
|
|
this.moveTabBackward();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-12-12 05:19:50 -08:00
|
|
|
|
<method name="duplicateTab">
|
|
|
|
|
<parameter name="aTab"/><!-- can be from a different window as well -->
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
// try to have SessionStore duplicate the given tab
|
|
|
|
|
try {
|
|
|
|
|
var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
|
|
|
|
|
.getService(Components.interfaces.nsISessionStore);
|
|
|
|
|
return ss.duplicateTab(window, aTab);
|
|
|
|
|
} catch (ex) {
|
|
|
|
|
// fall back to basic URL copying
|
|
|
|
|
return this.loadOneTab(this.getBrowserForTab(aTab).currentURI.spec);
|
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<!-- BEGIN FORWARDED BROWSER PROPERTIES. IF YOU ADD A PROPERTY TO THE BROWSER ELEMENT
|
|
|
|
|
MAKE SURE TO ADD IT HERE AS WELL. -->
|
|
|
|
|
<property name="canGoBack"
|
|
|
|
|
onget="return this.mCurrentBrowser.canGoBack;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="canGoForward"
|
|
|
|
|
onget="return this.mCurrentBrowser.canGoForward;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<method name="goBack">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.goBack();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="goForward">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.goForward();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="reload">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.reload();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="reloadWithFlags">
|
|
|
|
|
<parameter name="aFlags"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.reloadWithFlags(aFlags);
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="stop">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.stop();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<!-- throws exception for unknown schemes -->
|
|
|
|
|
<method name="loadURI">
|
|
|
|
|
<parameter name="aURI"/>
|
|
|
|
|
<parameter name="aReferrerURI"/>
|
2007-08-21 21:59:09 -07:00
|
|
|
|
<parameter name="aCharset"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 21:59:09 -07:00
|
|
|
|
return this.mCurrentBrowser.loadURI(aURI, aReferrerURI, aCharset);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<!-- throws exception for unknown schemes -->
|
|
|
|
|
<method name="loadURIWithFlags">
|
|
|
|
|
<parameter name="aURI"/>
|
|
|
|
|
<parameter name="aFlags"/>
|
|
|
|
|
<parameter name="aReferrerURI"/>
|
2007-08-21 21:59:09 -07:00
|
|
|
|
<parameter name="aCharset"/>
|
2008-01-18 08:57:14 -08:00
|
|
|
|
<parameter name="aPostData"/>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2008-01-18 08:57:14 -08:00
|
|
|
|
return this.mCurrentBrowser.loadURIWithFlags(aURI, aFlags, aReferrerURI, aCharset, aPostData);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="goHome">
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.goHome();
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<property name="homePage">
|
|
|
|
|
<getter>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.homePage;
|
|
|
|
|
]]>
|
|
|
|
|
</getter>
|
|
|
|
|
<setter>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
this.mCurrentBrowser.homePage = val;
|
|
|
|
|
return val;
|
|
|
|
|
]]>
|
|
|
|
|
</setter>
|
|
|
|
|
</property>
|
|
|
|
|
|
|
|
|
|
<method name="gotoIndex">
|
|
|
|
|
<parameter name="aIndex"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
return this.mCurrentBrowser.gotoIndex(aIndex);
|
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:06 -07:00
|
|
|
|
<method name="attachFormFill">
|
|
|
|
|
<body><![CDATA[
|
2007-08-21 21:59:41 -07:00
|
|
|
|
for (var i = 0; i < this.mPanelContainer.childNodes.length; ++i) {
|
|
|
|
|
var cb = this.getBrowserAtIndex(i);
|
2007-08-21 21:59:15 -07:00
|
|
|
|
cb.attachFormFill();
|
|
|
|
|
}
|
2007-08-21 21:59:06 -07:00
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="detachFormFill">
|
|
|
|
|
<body><![CDATA[
|
2007-08-21 21:59:41 -07:00
|
|
|
|
for (var i = 0; i < this.mPanelContainer.childNodes.length; ++i) {
|
|
|
|
|
var cb = this.getBrowserAtIndex(i);
|
2007-08-21 21:59:15 -07:00
|
|
|
|
cb.detachFormFill();
|
|
|
|
|
}
|
2007-08-21 21:59:06 -07:00
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2007-08-21 21:59:00 -07:00
|
|
|
|
<property name="pageReport"
|
|
|
|
|
onget="return this.mCurrentBrowser.pageReport;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<property name="currentURI"
|
|
|
|
|
onget="return this.mCurrentBrowser.currentURI;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
<field name="_fastFind">null</field>
|
|
|
|
|
<property name="fastFind"
|
|
|
|
|
readonly="true">
|
|
|
|
|
<getter>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
if (!this._fastFind) {
|
|
|
|
|
this._fastFind = Components.classes["@mozilla.org/typeaheadfind;1"]
|
2007-08-21 22:00:55 -07:00
|
|
|
|
.createInstance(Components.interfaces.nsITypeAheadFind);
|
2007-08-21 21:59:41 -07:00
|
|
|
|
this._fastFind.init(this.docShell);
|
|
|
|
|
}
|
|
|
|
|
return this._fastFind;
|
|
|
|
|
]]>
|
|
|
|
|
</getter>
|
|
|
|
|
</property>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<property name="docShell"
|
|
|
|
|
onget="return this.mCurrentBrowser.docShell"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="webNavigation"
|
|
|
|
|
onget="return this.mCurrentBrowser.webNavigation"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="webBrowserFind"
|
|
|
|
|
readonly="true"
|
|
|
|
|
onget="return this.mCurrentBrowser.webBrowserFind"/>
|
|
|
|
|
|
|
|
|
|
<property name="webProgress"
|
|
|
|
|
readonly="true"
|
|
|
|
|
onget="return this.mCurrentBrowser.webProgress"/>
|
|
|
|
|
|
|
|
|
|
<property name="contentWindow"
|
|
|
|
|
readonly="true"
|
|
|
|
|
onget="return this.mCurrentBrowser.contentWindow"/>
|
|
|
|
|
|
|
|
|
|
<property name="sessionHistory"
|
|
|
|
|
onget="return this.mCurrentBrowser.sessionHistory;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="markupDocumentViewer"
|
|
|
|
|
onget="return this.mCurrentBrowser.markupDocumentViewer;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="contentViewerEdit"
|
|
|
|
|
onget="return this.mCurrentBrowser.contentViewerEdit;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="contentViewerFile"
|
|
|
|
|
onget="return this.mCurrentBrowser.contentViewerFile;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="documentCharsetInfo"
|
|
|
|
|
onget="return this.mCurrentBrowser.documentCharsetInfo;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
|
|
|
|
<property name="contentDocument"
|
|
|
|
|
onget="return this.mCurrentBrowser.contentDocument;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
2007-08-21 21:59:35 -07:00
|
|
|
|
<property name="contentTitle"
|
|
|
|
|
onget="return this.mCurrentBrowser.contentTitle;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
2007-08-21 22:02:30 -07:00
|
|
|
|
<property name="contentPrincipal"
|
|
|
|
|
onget="return this.mCurrentBrowser.contentPrincipal;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<property name="securityUI"
|
|
|
|
|
onget="return this.mCurrentBrowser.securityUI;"
|
|
|
|
|
readonly="true"/>
|
|
|
|
|
|
2007-08-21 22:00:02 -07:00
|
|
|
|
<method name="dragDropSecurityCheck">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<parameter name="aDragSession"/>
|
2007-08-21 22:00:22 -07:00
|
|
|
|
<parameter name="aUri"/>
|
2007-08-21 22:00:02 -07:00
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:02:42 -07:00
|
|
|
|
nsDragAndDrop.dragDropSecurityCheck(aEvent, aDragSession, aUri);
|
2007-08-21 22:00:02 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
<field name="_keyEventHandler" readonly="true">
|
|
|
|
|
<![CDATA[({
|
|
|
|
|
tabbrowser: this,
|
|
|
|
|
handleEvent: function handleEvent(aEvent) {
|
2007-08-21 22:00:10 -07:00
|
|
|
|
if (!aEvent.isTrusted) {
|
|
|
|
|
// Don't let untrusted events mess with tabs.
|
|
|
|
|
return;
|
|
|
|
|
}
|
2007-08-21 22:00:17 -07:00
|
|
|
|
|
2008-03-28 23:44:15 -07:00
|
|
|
|
if ('altKey' in aEvent && aEvent.altKey)
|
2007-08-21 22:00:17 -07:00
|
|
|
|
return;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
#ifdef XP_MACOSX
|
|
|
|
|
if ('metaKey' in aEvent && aEvent.metaKey) {
|
2008-03-28 23:44:15 -07:00
|
|
|
|
var offset = 1;
|
|
|
|
|
switch (aEvent.charCode) {
|
|
|
|
|
case '}'.charCodeAt(0):
|
|
|
|
|
offset *= -1;
|
|
|
|
|
case '{'.charCodeAt(0):
|
|
|
|
|
if (window.getComputedStyle(this.tabbrowser, null).direction == "ltr")
|
|
|
|
|
offset *= -1;
|
|
|
|
|
|
|
|
|
|
this.tabbrowser.mTabContainer.advanceSelectedTab(offset, true);
|
|
|
|
|
aEvent.stopPropagation();
|
|
|
|
|
aEvent.preventDefault();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ('shiftKey' in aEvent && aEvent.shiftKey)
|
|
|
|
|
return;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
#else
|
2007-08-21 22:00:17 -07:00
|
|
|
|
if (('ctrlKey' in aEvent && aEvent.ctrlKey) &&
|
2008-03-28 23:44:15 -07:00
|
|
|
|
!('shiftKey' in aEvent && aEvent.shiftKey) &&
|
2007-08-21 22:00:17 -07:00
|
|
|
|
!('metaKey' in aEvent && aEvent.metaKey)) {
|
2007-08-21 22:00:55 -07:00
|
|
|
|
if (aEvent.keyCode == KeyEvent.DOM_VK_F4 &&
|
2007-08-21 22:00:10 -07:00
|
|
|
|
this.tabbrowser.mTabBox.handleCtrlPageUpDown) {
|
|
|
|
|
this.tabbrowser.removeCurrentTab();
|
2007-08-21 22:01:10 -07:00
|
|
|
|
|
|
|
|
|
aEvent.stopPropagation();
|
|
|
|
|
aEvent.preventDefault();
|
2007-08-21 22:00:10 -07:00
|
|
|
|
return;
|
|
|
|
|
}
|
2007-08-21 21:59:48 -07:00
|
|
|
|
#endif
|
2007-08-21 22:00:10 -07:00
|
|
|
|
if (aEvent.target.localName == "tabbrowser") {
|
|
|
|
|
switch (aEvent.keyCode) {
|
|
|
|
|
case KeyEvent.DOM_VK_UP:
|
|
|
|
|
this.tabbrowser.moveTabBackward();
|
|
|
|
|
break;
|
|
|
|
|
case KeyEvent.DOM_VK_DOWN:
|
|
|
|
|
this.tabbrowser.moveTabForward();
|
|
|
|
|
break;
|
|
|
|
|
case KeyEvent.DOM_VK_RIGHT:
|
|
|
|
|
case KeyEvent.DOM_VK_LEFT:
|
|
|
|
|
this.tabbrowser.moveTabOver(aEvent);
|
|
|
|
|
break;
|
|
|
|
|
case KeyEvent.DOM_VK_HOME:
|
|
|
|
|
this.tabbrowser.moveTabToStart();
|
|
|
|
|
break;
|
|
|
|
|
case KeyEvent.DOM_VK_END:
|
|
|
|
|
this.tabbrowser.moveTabToEnd();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2007-08-21 22:00:55 -07:00
|
|
|
|
// Stop the keypress event for the above keyboard
|
2007-08-21 22:00:17 -07:00
|
|
|
|
// shortcuts only.
|
|
|
|
|
return;
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
2007-08-21 22:00:17 -07:00
|
|
|
|
aEvent.stopPropagation();
|
|
|
|
|
aEvent.preventDefault();
|
2007-08-21 22:00:10 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 21:59:41 -07:00
|
|
|
|
}
|
|
|
|
|
})]]>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
</field>
|
2007-08-21 21:59:21 -07:00
|
|
|
|
|
2007-08-21 21:59:31 -07:00
|
|
|
|
<property name="userTypedClear"
|
|
|
|
|
onget="return this.mCurrentBrowser.userTypedClear;"
|
|
|
|
|
onset="return this.mCurrentBrowser.userTypedClear = val;"/>
|
|
|
|
|
|
2007-08-21 21:59:22 -07:00
|
|
|
|
<property name="userTypedValue"
|
|
|
|
|
onget="return this.mCurrentBrowser.userTypedValue;"
|
|
|
|
|
onset="return this.mCurrentBrowser.userTypedValue = val;"/>
|
|
|
|
|
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<method name="createTooltip">
|
|
|
|
|
<parameter name="event"/>
|
|
|
|
|
<body>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:01:07 -07:00
|
|
|
|
event.stopPropagation();
|
2007-08-21 22:00:54 -07:00
|
|
|
|
var tn = document.tooltipNode;
|
|
|
|
|
if (tn.localName != "tab")
|
|
|
|
|
return false; // Not a tab, so cancel the tooltip
|
|
|
|
|
if ("mOverCloseButton" in tn && tn.mOverCloseButton) {
|
|
|
|
|
event.target.setAttribute("label", tn.getAttribute("closetabtext"));
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2007-08-21 22:00:55 -07:00
|
|
|
|
if (tn.hasAttribute("label")) {
|
|
|
|
|
event.target.setAttribute("label", tn.getAttribute("label"));
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
2007-08-21 22:00:54 -07:00
|
|
|
|
]]>
|
|
|
|
|
</body>
|
|
|
|
|
</method>
|
2007-08-21 21:59:40 -07:00
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<constructor>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:01:12 -07:00
|
|
|
|
this.mCurrentBrowser = this.mPanelContainer.childNodes[0].firstChild;
|
2007-08-21 21:59:22 -07:00
|
|
|
|
this.mCurrentTab = this.mTabContainer.firstChild;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
document.addEventListener("keypress", this._keyEventHandler, false);
|
2007-08-21 22:00:10 -07:00
|
|
|
|
|
|
|
|
|
var uniqueId = "panel" + Date.now();
|
|
|
|
|
this.mPanelContainer.childNodes[0].id = uniqueId;
|
|
|
|
|
this.mTabContainer.childNodes[0].linkedPanel = uniqueId;
|
|
|
|
|
this.mTabContainer.childNodes[0]._tPos = 0;
|
2007-08-21 22:01:12 -07:00
|
|
|
|
this.mTabContainer.childNodes[0].linkedBrowser = this.mPanelContainer.childNodes[0].firstChild;
|
2007-08-21 22:02:41 -07:00
|
|
|
|
|
|
|
|
|
// set up the shared autoscroll popup
|
|
|
|
|
this._autoScrollPopup = this.mCurrentBrowser._createAutoScrollPopup();
|
2009-03-08 12:05:53 -07:00
|
|
|
|
this._autoScrollPopup.id = "autoscroller";
|
2007-08-21 22:02:41 -07:00
|
|
|
|
this.appendChild(this._autoScrollPopup);
|
|
|
|
|
this.mCurrentBrowser.setAttribute("autoscrollpopup", this._autoScrollPopup.id);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</constructor>
|
|
|
|
|
|
|
|
|
|
<destructor>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
for (var i = 0; i < this.mTabListeners.length; ++i) {
|
2007-08-21 21:59:41 -07:00
|
|
|
|
this.getBrowserAtIndex(i).webProgress.removeProgressListener(this.mTabFilters[i]);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
this.mTabFilters[i].removeProgressListener(this.mTabListeners[i]);
|
|
|
|
|
this.mTabFilters[i] = null;
|
|
|
|
|
this.mTabListeners[i] = null;
|
2007-08-21 22:01:16 -07:00
|
|
|
|
this.getBrowserAtIndex(i).removeEventListener("DOMTitleChanged", this.onTitleChanged, true);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
2007-08-21 21:59:41 -07:00
|
|
|
|
document.removeEventListener("keypress", this._keyEventHandler, false);
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]]>
|
|
|
|
|
</destructor>
|
|
|
|
|
</implementation>
|
|
|
|
|
|
|
|
|
|
<handlers>
|
2007-08-21 22:01:16 -07:00
|
|
|
|
<handler event="DOMWindowClose" phase="capturing">
|
2007-08-21 21:58:49 -07:00
|
|
|
|
<![CDATA[
|
2007-08-21 21:59:39 -07:00
|
|
|
|
if (!event.isTrusted)
|
|
|
|
|
return;
|
|
|
|
|
|
2007-08-21 21:59:41 -07:00
|
|
|
|
const browsers = this.mPanelContainer.childNodes;
|
|
|
|
|
if (browsers.length == 1) {
|
|
|
|
|
// There's only one browser left. If a window is being
|
|
|
|
|
// closed and the window is *not* the window in the
|
|
|
|
|
// browser that's still around, prevent the event's default
|
|
|
|
|
// action to prevent closing a window that's being closed
|
|
|
|
|
// already.
|
|
|
|
|
if (this.getBrowserAtIndex(0).contentWindow != event.target)
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
return;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
var i = 0;
|
|
|
|
|
for (; i < browsers.length; ++i) {
|
2007-08-21 21:59:41 -07:00
|
|
|
|
if (this.getBrowserAtIndex(i).contentWindow == event.target) {
|
2008-03-20 02:08:36 -07:00
|
|
|
|
this.removeTab(this.mTabContainer.childNodes[i]);
|
2007-08-21 21:59:41 -07:00
|
|
|
|
event.preventDefault();
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
break;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
}
|
2007-08-21 21:58:49 -07:00
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</handler>
|
2007-08-21 22:01:16 -07:00
|
|
|
|
<handler event="DOMWillOpenModalDialog" phase="capturing">
|
2007-08-21 21:59:40 -07:00
|
|
|
|
<![CDATA[
|
|
|
|
|
if (!event.isTrusted)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// We're about to open a modal dialog, make sure the opening
|
|
|
|
|
// tab is brought to the front.
|
|
|
|
|
|
2007-08-21 22:00:09 -07:00
|
|
|
|
var targetTop = event.target.top;
|
2007-08-21 21:59:52 -07:00
|
|
|
|
|
2007-08-21 21:59:40 -07:00
|
|
|
|
for (var i = 0; i < browsers.length; ++i) {
|
2007-08-21 21:59:52 -07:00
|
|
|
|
if (this.getBrowserAtIndex(i).contentWindow == targetTop) {
|
2007-08-21 21:59:40 -07:00
|
|
|
|
this.selectedTab = this.mTabContainer.childNodes[i];
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</handler>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</handlers>
|
|
|
|
|
</binding>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:02:12 -07:00
|
|
|
|
<binding id="tabbrowser-arrowscrollbox" extends="chrome://global/content/bindings/scrollbox.xml#arrowscrollbox-clicktoscroll">
|
2009-01-25 00:06:45 -08:00
|
|
|
|
<implementation>
|
|
|
|
|
<!-- Override scrollbox.xml method, since our scrollbox's children are
|
|
|
|
|
inherited from the binding parent -->
|
|
|
|
|
<method name="_getScrollableElements">
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
return document.getBindingParent(this).childNodes;
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
2009-02-12 01:18:37 -08:00
|
|
|
|
#ifdef XP_MACOSX
|
2009-01-25 00:06:45 -08:00
|
|
|
|
<field name="_scrollButtonDownBox">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "down-box");
|
|
|
|
|
</field>
|
|
|
|
|
<field name="_scrollButtonDownBoxAnimate">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "down-box-animate");
|
|
|
|
|
</field>
|
2009-02-12 01:18:37 -08:00
|
|
|
|
#endif
|
2009-01-25 00:06:45 -08:00
|
|
|
|
</implementation>
|
|
|
|
|
|
2009-02-12 01:18:37 -08:00
|
|
|
|
<handlers>
|
|
|
|
|
<handler event="underflow"><![CDATA[
|
|
|
|
|
if (event.detail == 0)
|
|
|
|
|
return; // Ignore vertical events
|
|
|
|
|
|
|
|
|
|
var tabs = document.getBindingParent(this);
|
|
|
|
|
tabs.removeAttribute("overflow");
|
|
|
|
|
#ifdef XP_MACOSX
|
|
|
|
|
this._scrollButtonDownBox.collapsed = true;
|
|
|
|
|
this._scrollButtonDownBoxAnimate.collapsed = true;
|
|
|
|
|
#endif
|
|
|
|
|
]]></handler>
|
|
|
|
|
<handler event="overflow"><![CDATA[
|
|
|
|
|
if (event.detail == 0)
|
|
|
|
|
return; // Ignore vertical events
|
|
|
|
|
|
|
|
|
|
var tabs = document.getBindingParent(this);
|
|
|
|
|
tabs.setAttribute("overflow", "true");
|
|
|
|
|
#ifdef XP_MACOSX
|
|
|
|
|
this._scrollButtonDownBox.collapsed = false;
|
|
|
|
|
this._scrollButtonDownBoxAnimate.collapsed = false;
|
|
|
|
|
#endif
|
2009-07-10 02:13:10 -07:00
|
|
|
|
this.ensureElementIsVisible(tabs.selectedItem, false);
|
2009-02-12 01:18:37 -08:00
|
|
|
|
]]></handler>
|
|
|
|
|
|
|
|
|
|
#ifdef XP_MACOSX
|
|
|
|
|
<handler event="UpdatedScrollButtonsDisabledState"><![CDATA[
|
|
|
|
|
// fix for bug #352353
|
|
|
|
|
// unlike the scrollup button on the tab strip (which is a
|
|
|
|
|
// simple toolbarbutton) the scrolldown button is
|
|
|
|
|
// a more complicated stack of boxes and a toolbarbutton
|
|
|
|
|
// so that we can animate when a tab is opened offscreen.
|
|
|
|
|
// in order to style the box with the actual background image
|
|
|
|
|
// we need to manually set the disable state to match the
|
|
|
|
|
// disable state of the toolbarbutton.
|
|
|
|
|
this._scrollButtonDownBox
|
|
|
|
|
.setAttribute("disabled", this._scrollButtonDown.disabled);
|
|
|
|
|
]]></handler>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
</handlers>
|
|
|
|
|
|
|
|
|
|
#ifdef XP_MACOSX
|
2007-08-21 22:02:12 -07:00
|
|
|
|
<content>
|
|
|
|
|
<xul:toolbarbutton class="scrollbutton-up" collapsed="true"
|
|
|
|
|
xbl:inherits="orient"
|
|
|
|
|
anonid="scrollbutton-up"
|
2007-08-26 02:17:54 -07:00
|
|
|
|
onclick="_distanceScroll(event);"
|
2007-08-21 22:02:12 -07:00
|
|
|
|
onmousedown="_startScroll(-1);"
|
2007-08-25 17:37:18 -07:00
|
|
|
|
onmouseover="_continueScroll(-1);"
|
2007-08-21 22:02:12 -07:00
|
|
|
|
onmouseup="_stopScroll();"
|
2009-07-29 11:33:53 -07:00
|
|
|
|
onmouseout="_pauseScroll();"/>
|
2007-08-21 22:02:12 -07:00
|
|
|
|
<xul:scrollbox xbl:inherits="orient,align,pack,dir" flex="1" anonid="scrollbox">
|
|
|
|
|
<children/>
|
|
|
|
|
</xul:scrollbox>
|
|
|
|
|
<xul:stack align="center" pack="end" class="scrollbutton-down-stack">
|
2007-08-21 22:02:38 -07:00
|
|
|
|
<xul:hbox flex="1" class="scrollbutton-down-box"
|
|
|
|
|
collapsed="true" anonid="down-box"/>
|
|
|
|
|
<xul:hbox flex="1" class="scrollbutton-down-box-animate"
|
|
|
|
|
collapsed="true" anonid="down-box-animate"/>
|
|
|
|
|
<xul:toolbarbutton class="scrollbutton-down" collapsed="true"
|
|
|
|
|
xbl:inherits="orient"
|
|
|
|
|
anonid="scrollbutton-down"
|
2007-08-26 02:17:54 -07:00
|
|
|
|
onclick="_distanceScroll(event);"
|
2007-08-21 22:02:38 -07:00
|
|
|
|
onmousedown="_startScroll(1);"
|
2007-08-25 17:37:18 -07:00
|
|
|
|
onmouseover="_continueScroll(1);"
|
2007-08-21 22:02:38 -07:00
|
|
|
|
onmouseup="_stopScroll();"
|
2009-07-29 11:33:53 -07:00
|
|
|
|
onmouseout="_pauseScroll();"/>
|
2007-08-21 22:02:12 -07:00
|
|
|
|
</xul:stack>
|
|
|
|
|
</content>
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#endif
|
2009-01-25 00:06:45 -08:00
|
|
|
|
</binding>
|
2007-08-21 22:02:12 -07:00
|
|
|
|
|
2007-08-21 22:00:55 -07:00
|
|
|
|
<binding id="tabbrowser-tabs"
|
2007-08-21 22:00:54 -07:00
|
|
|
|
extends="chrome://global/content/bindings/tabbox.xml#tabs">
|
|
|
|
|
<content>
|
2007-09-15 00:45:39 -07:00
|
|
|
|
<xul:stack flex="1" class="tabs-stack">
|
|
|
|
|
<xul:vbox>
|
|
|
|
|
<xul:spacer flex="1"/>
|
|
|
|
|
<xul:hbox class="tabs-bottom" align="center"/>
|
|
|
|
|
</xul:vbox>
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<xul:hbox xbl:inherits="overflow" class="tabs-container">
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#ifdef XP_MACOSX
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<xul:stack>
|
|
|
|
|
<xul:spacer class="tabs-left"/>
|
|
|
|
|
</xul:stack>
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#endif
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<xul:arrowscrollbox anonid="arrowscrollbox" orient="horizontal" flex="1"
|
2009-07-29 11:33:53 -07:00
|
|
|
|
style="min-width: 1px;"
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#ifndef XP_MACOSX
|
2008-03-09 12:59:50 -07:00
|
|
|
|
clicktoscroll="true"
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#endif
|
2008-03-09 12:59:50 -07:00
|
|
|
|
class="tabbrowser-arrowscrollbox">
|
2009-01-23 16:41:36 -08:00
|
|
|
|
# This is a hack to circumvent bug 472020, otherwise the tabs show up on the
|
|
|
|
|
# right of the newtab button.
|
2009-01-23 00:13:11 -08:00
|
|
|
|
<children includes="tab"/>
|
2009-01-23 16:41:36 -08:00
|
|
|
|
# This is to ensure anything extensions put here will go before the newtab
|
|
|
|
|
# button, necessary due to the previous hack.
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<children/>
|
2009-01-23 00:13:11 -08:00
|
|
|
|
<xul:toolbarbutton class="tabs-newtab-button"
|
2009-07-29 11:33:53 -07:00
|
|
|
|
command="cmd_newNavigatorTab"
|
2009-01-23 00:13:11 -08:00
|
|
|
|
tooltiptext="&newTabButton.tooltip;"/>
|
2008-03-09 12:59:50 -07:00
|
|
|
|
</xul:arrowscrollbox>
|
2008-09-25 00:39:41 -07:00
|
|
|
|
<xul:toolbarbutton class="tabs-newtab-button" anonid="newtab-button"
|
2009-07-29 11:33:53 -07:00
|
|
|
|
command="cmd_newNavigatorTab"
|
2008-09-25 00:39:41 -07:00
|
|
|
|
tooltiptext="&newTabButton.tooltip;"/>
|
2009-07-29 11:33:53 -07:00
|
|
|
|
<xul:stack align="center" pack="end">
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<xul:hbox flex="1" class="tabs-alltabs-box-animate" anonid="alltabs-box-animate"/>
|
2008-11-04 23:38:13 -08:00
|
|
|
|
<xul:toolbarbutton class="tabs-alltabs-button" anonid="alltabs-button"
|
2009-07-20 21:25:59 -07:00
|
|
|
|
type="menu"
|
|
|
|
|
tooltiptext="&listAllTabs.label;">
|
|
|
|
|
<xul:menupopup class="tabs-alltabs-popup" anonid="alltabs-popup"
|
|
|
|
|
position="after_end"/>
|
|
|
|
|
</xul:toolbarbutton>
|
2008-03-09 12:59:50 -07:00
|
|
|
|
</xul:stack>
|
|
|
|
|
<xul:toolbarbutton anonid="tabs-closebutton"
|
2009-07-29 11:33:53 -07:00
|
|
|
|
class="close-button tabs-closebutton"/>
|
2008-03-09 12:59:50 -07:00
|
|
|
|
</xul:hbox>
|
2007-08-21 22:01:52 -07:00
|
|
|
|
</xul:stack>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
</content>
|
2007-08-21 22:01:54 -07:00
|
|
|
|
<implementation implements="nsITimerCallback, nsIDOMEventListener">
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<constructor>
|
2007-08-21 22:01:27 -07:00
|
|
|
|
<![CDATA[
|
|
|
|
|
var pb2 =
|
|
|
|
|
Components.classes['@mozilla.org/preferences-service;1'].
|
|
|
|
|
getService(Components.interfaces.nsIPrefBranch2);
|
2007-08-21 22:01:34 -07:00
|
|
|
|
|
2007-08-21 22:01:27 -07:00
|
|
|
|
try {
|
|
|
|
|
this.mTabMinWidth = pb2.getIntPref("browser.tabs.tabMinWidth");
|
2007-08-21 22:02:37 -07:00
|
|
|
|
} catch (e) {
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
this.mTabMaxWidth = pb2.getIntPref("browser.tabs.tabMaxWidth");
|
|
|
|
|
} catch (e) {
|
|
|
|
|
}
|
|
|
|
|
try {
|
2007-08-21 22:01:27 -07:00
|
|
|
|
this.mTabClipWidth = pb2.getIntPref("browser.tabs.tabClipWidth");
|
2007-08-21 22:02:37 -07:00
|
|
|
|
} catch (e) {
|
2007-08-21 22:01:27 -07:00
|
|
|
|
}
|
2007-08-21 22:02:37 -07:00
|
|
|
|
try {
|
|
|
|
|
this.mCloseButtons = pb2.getIntPref("browser.tabs.closeButtons");
|
|
|
|
|
} catch (e) {
|
2007-08-21 22:01:27 -07:00
|
|
|
|
}
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:01:27 -07:00
|
|
|
|
this.firstChild.minWidth = this.mTabMinWidth;
|
2007-08-21 22:02:37 -07:00
|
|
|
|
this.firstChild.maxWidth = this.mTabMaxWidth;
|
2007-08-21 22:01:56 -07:00
|
|
|
|
this.adjustTabstrip();
|
2007-08-21 22:01:25 -07:00
|
|
|
|
|
2007-08-21 22:01:34 -07:00
|
|
|
|
pb2.addObserver("browser.tabs.closeButtons",
|
2007-08-21 22:02:17 -07:00
|
|
|
|
this._prefObserver, false);
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:02:44 -07:00
|
|
|
|
window.addEventListener("resize", this, false);
|
2007-08-21 22:01:27 -07:00
|
|
|
|
]]>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
</constructor>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:01:34 -07:00
|
|
|
|
<destructor>
|
|
|
|
|
<![CDATA[
|
2007-08-21 22:02:17 -07:00
|
|
|
|
var pb2 =
|
|
|
|
|
Components.classes['@mozilla.org/preferences-service;1'].
|
|
|
|
|
getService(Components.interfaces.nsIPrefBranch2);
|
|
|
|
|
pb2.removeObserver("browser.tabs.closeButtons", this._prefObserver);
|
|
|
|
|
|
2007-08-21 22:01:34 -07:00
|
|
|
|
// Release timer to avoid reference cycles.
|
2007-08-21 22:01:52 -07:00
|
|
|
|
if (this._animateTimer) {
|
|
|
|
|
this._animateTimer.cancel();
|
|
|
|
|
this._animateTimer = null;
|
2007-08-21 22:01:34 -07:00
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
</destructor>
|
|
|
|
|
|
2007-08-21 22:01:28 -07:00
|
|
|
|
<field name="mTabstripWidth">0</field>
|
|
|
|
|
|
2007-08-21 22:01:25 -07:00
|
|
|
|
<field name="mTabstrip">
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "arrowscrollbox");
|
|
|
|
|
</field>
|
|
|
|
|
|
|
|
|
|
<field name="mTabstripClosebutton">
|
2007-11-21 04:04:21 -08:00
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "tabs-closebutton");
|
2007-08-21 22:01:25 -07:00
|
|
|
|
</field>
|
|
|
|
|
|
2007-08-21 22:01:22 -07:00
|
|
|
|
<field name="_prefObserver">({
|
|
|
|
|
tabbox: this,
|
|
|
|
|
|
|
|
|
|
observe: function(subject, topic, data)
|
|
|
|
|
{
|
2007-08-21 22:01:25 -07:00
|
|
|
|
if (topic == "nsPref:changed") {
|
|
|
|
|
switch (data) {
|
|
|
|
|
case "browser.tabs.closeButtons":
|
2007-08-21 22:02:17 -07:00
|
|
|
|
subject.QueryInterface(Components.interfaces.nsIPrefBranch);
|
|
|
|
|
this.tabbox.mCloseButtons = subject.getIntPref("browser.tabs.closeButtons");
|
2007-08-21 22:01:56 -07:00
|
|
|
|
this.tabbox.adjustTabstrip();
|
2007-08-21 22:01:25 -07:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 22:01:22 -07:00
|
|
|
|
},
|
|
|
|
|
|
2007-08-21 22:02:17 -07:00
|
|
|
|
QueryInterface: function(aIID)
|
2007-08-21 22:01:22 -07:00
|
|
|
|
{
|
|
|
|
|
if (aIID.equals(Components.interfaces.nsIObserver) ||
|
|
|
|
|
aIID.equals(Components.interfaces.nsISupports))
|
|
|
|
|
return this;
|
|
|
|
|
throw Components.results.NS_NOINTERFACE;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
</field>
|
2007-08-21 22:01:45 -07:00
|
|
|
|
<field name="mTabMinWidth">100</field>
|
2007-08-21 22:02:37 -07:00
|
|
|
|
<field name="mTabMaxWidth">250</field>
|
2007-08-21 22:01:32 -07:00
|
|
|
|
<field name="mTabClipWidth">140</field>
|
2007-08-21 22:01:25 -07:00
|
|
|
|
<field name="mCloseButtons">1</field>
|
|
|
|
|
|
|
|
|
|
<method name="adjustTabstrip">
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<body><![CDATA[
|
2007-08-21 22:01:25 -07:00
|
|
|
|
// modes for tabstrip
|
|
|
|
|
// 0 - activetab = close button on active tab only
|
|
|
|
|
// 1 - alltabs = close buttons on all tabs
|
|
|
|
|
// 2 - noclose = no close buttons at all
|
|
|
|
|
// 3 - closeatend = close button at the end of the tabstrip
|
|
|
|
|
switch (this.mCloseButtons) {
|
|
|
|
|
case 0:
|
2007-08-21 22:01:39 -07:00
|
|
|
|
this.setAttribute("closebuttons", "activetab");
|
2007-08-21 22:01:25 -07:00
|
|
|
|
break;
|
|
|
|
|
case 1:
|
2009-07-10 04:50:10 -07:00
|
|
|
|
if (this.firstChild.getBoundingClientRect().width > this.mTabClipWidth)
|
2007-08-21 22:02:36 -07:00
|
|
|
|
this.setAttribute("closebuttons", "alltabs");
|
|
|
|
|
else
|
|
|
|
|
this.setAttribute("closebuttons", "activetab");
|
2007-08-21 22:01:25 -07:00
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
this.setAttribute("closebuttons", "noclose");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
this.mTabstripClosebutton.collapsed = this.mCloseButtons != 3;
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
2008-03-20 02:08:36 -07:00
|
|
|
|
|
2007-08-21 22:01:25 -07:00
|
|
|
|
<field name="_mPrefs">null</field>
|
|
|
|
|
<property name="mPrefs" readonly="true">
|
|
|
|
|
<getter>
|
|
|
|
|
<![CDATA[
|
|
|
|
|
if (!this._mPrefs) {
|
|
|
|
|
this._mPrefs =
|
|
|
|
|
Components.classes['@mozilla.org/preferences-service;1'].
|
|
|
|
|
getService(Components.interfaces.nsIPrefBranch2);
|
|
|
|
|
}
|
|
|
|
|
return this._mPrefs;
|
|
|
|
|
]]>
|
|
|
|
|
</getter>
|
|
|
|
|
</property>
|
2009-01-15 04:30:43 -08:00
|
|
|
|
|
2007-08-21 22:01:25 -07:00
|
|
|
|
<method name="_handleTabSelect">
|
|
|
|
|
<body><![CDATA[
|
2007-08-21 22:02:44 -07:00
|
|
|
|
this.mTabstrip.ensureElementIsVisible(this.selectedItem);
|
2007-08-21 22:01:25 -07:00
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
2007-08-21 22:01:54 -07:00
|
|
|
|
|
2009-01-15 04:30:43 -08:00
|
|
|
|
<method name="_fillTrailingGap">
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
try {
|
|
|
|
|
// if we're at the right side (and not the logical end,
|
|
|
|
|
// which is why this works for both LTR and RTL)
|
|
|
|
|
// of the tabstrip, we need to ensure that we stay
|
|
|
|
|
// completely scrolled to the right side
|
|
|
|
|
var tabStrip = this.mTabstrip;
|
2009-07-10 02:13:10 -07:00
|
|
|
|
if (tabStrip.scrollPosition + tabStrip.scrollClientSize >=
|
|
|
|
|
tabStrip.scrollSize)
|
2009-01-15 04:30:43 -08:00
|
|
|
|
tabStrip.scrollByPixels(-1);
|
|
|
|
|
} catch (e) {}
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 22:01:54 -07:00
|
|
|
|
<method name="handleEvent">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
switch (aEvent.type) {
|
2007-08-21 22:02:44 -07:00
|
|
|
|
case "resize":
|
|
|
|
|
var width = this.mTabstrip.boxObject.width;
|
|
|
|
|
if (width != this.mTabstripWidth) {
|
|
|
|
|
this.adjustTabstrip();
|
2009-01-15 04:30:43 -08:00
|
|
|
|
this._fillTrailingGap();
|
2007-08-21 22:02:44 -07:00
|
|
|
|
this._handleTabSelect();
|
|
|
|
|
this.mTabstripWidth = width;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2007-08-21 22:01:54 -07:00
|
|
|
|
}
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2009-07-10 11:34:46 -07:00
|
|
|
|
<field name="mAllTabsPopup">
|
|
|
|
|
document.getAnonymousElementByAttribute(this,
|
|
|
|
|
"anonid", "alltabs-popup");
|
|
|
|
|
</field>
|
|
|
|
|
|
2007-08-21 22:02:12 -07:00
|
|
|
|
<field name="mAllTabsBoxAnimate">
|
2007-08-21 22:01:34 -07:00
|
|
|
|
document.getAnonymousElementByAttribute(this,
|
2007-08-21 22:02:12 -07:00
|
|
|
|
"anonid",
|
|
|
|
|
"alltabs-box-animate");
|
|
|
|
|
</field>
|
|
|
|
|
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#ifdef XP_MACOSX
|
2007-08-21 22:02:12 -07:00
|
|
|
|
<field name="mDownBoxAnimate">
|
|
|
|
|
this.mTabstrip._scrollButtonDownBoxAnimate;
|
2007-08-21 22:01:34 -07:00
|
|
|
|
</field>
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#endif
|
2007-08-21 22:01:34 -07:00
|
|
|
|
|
2007-08-21 22:01:52 -07:00
|
|
|
|
<field name="_animateTimer">null</field>
|
|
|
|
|
<field name="_animateStep">-1</field>
|
2007-08-21 22:01:53 -07:00
|
|
|
|
<field name="_animateDelay">25</field>
|
2007-08-21 22:01:52 -07:00
|
|
|
|
<field name="_animatePercents">
|
2007-08-21 22:01:53 -07:00
|
|
|
|
[1.00, 0.85, 0.80, 0.75, 0.71, 0.68, 0.65, 0.62, 0.59, 0.57,
|
|
|
|
|
0.54, 0.52, 0.50, 0.47, 0.45, 0.44, 0.42, 0.40, 0.38, 0.37,
|
|
|
|
|
0.35, 0.34, 0.32, 0.31, 0.30, 0.29, 0.28, 0.27, 0.26, 0.25,
|
|
|
|
|
0.24, 0.23, 0.23, 0.22, 0.22, 0.21, 0.21, 0.21, 0.20, 0.20,
|
|
|
|
|
0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.19, 0.19, 0.19, 0.18,
|
|
|
|
|
0.18, 0.17, 0.17, 0.16, 0.15, 0.14, 0.13, 0.11, 0.09, 0.06]
|
2007-08-21 22:01:52 -07:00
|
|
|
|
</field>
|
|
|
|
|
|
|
|
|
|
<method name="_stopAnimation">
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
if (this._animateStep != -1) {
|
|
|
|
|
if (this._animateTimer)
|
|
|
|
|
this._animateTimer.cancel();
|
2007-08-21 22:01:34 -07:00
|
|
|
|
|
2007-08-21 22:01:52 -07:00
|
|
|
|
this._animateStep = -1;
|
2007-08-21 22:02:12 -07:00
|
|
|
|
this.mAllTabsBoxAnimate.style.opacity = 0.0;
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#ifdef XP_MACOSX
|
2007-08-21 22:02:12 -07:00
|
|
|
|
this.mDownBoxAnimate.style.opacity = 0.0;
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#endif
|
2007-08-21 22:01:52 -07:00
|
|
|
|
}
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
2007-08-21 22:01:34 -07:00
|
|
|
|
<method name="_notifyBackgroundTab">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body><![CDATA[
|
2009-07-10 02:13:10 -07:00
|
|
|
|
var scrollRect = this.mTabstrip.scrollClientRect;
|
|
|
|
|
var tab = aTab.getBoundingClientRect();
|
2007-08-21 22:01:34 -07:00
|
|
|
|
|
2008-03-04 03:24:41 -08:00
|
|
|
|
// Is the new tab already completely visible?
|
2009-07-10 02:13:10 -07:00
|
|
|
|
if (scrollRect.left <= tab.left && tab.right <= scrollRect.right)
|
2008-03-04 03:24:41 -08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (this.mTabstrip.smoothScroll) {
|
2009-07-10 02:13:10 -07:00
|
|
|
|
let selected = this.selectedItem.getBoundingClientRect();
|
2008-03-04 03:24:41 -08:00
|
|
|
|
|
|
|
|
|
// Can we make both the new tab and the selected tab completely visible?
|
2009-07-10 02:13:10 -07:00
|
|
|
|
if (Math.max(tab.right - selected.left, selected.right - tab.left) <=
|
|
|
|
|
scrollRect.width) {
|
2008-03-04 03:24:41 -08:00
|
|
|
|
this.mTabstrip.ensureElementIsVisible(aTab);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2007-08-21 22:01:34 -07:00
|
|
|
|
|
2009-04-13 10:38:09 -07:00
|
|
|
|
this.mTabstrip._smoothScrollByPixels(this.mTabstrip._isRTLScrollbox ?
|
2009-07-10 02:13:10 -07:00
|
|
|
|
selected.right - scrollRect.right :
|
|
|
|
|
selected.left - scrollRect.left);
|
2007-08-21 22:01:34 -07:00
|
|
|
|
}
|
2008-03-04 03:24:41 -08:00
|
|
|
|
|
|
|
|
|
// start the flash timer
|
|
|
|
|
this._animateStep = 0;
|
|
|
|
|
|
|
|
|
|
if (!this._animateTimer)
|
|
|
|
|
this._animateTimer =
|
|
|
|
|
Components.classes["@mozilla.org/timer;1"]
|
|
|
|
|
.createInstance(Components.interfaces.nsITimer);
|
|
|
|
|
else
|
|
|
|
|
this._animateTimer.cancel();
|
|
|
|
|
|
|
|
|
|
this._animateTimer.initWithCallback(this, this._animateDelay,
|
|
|
|
|
this._animateTimer.TYPE_REPEATING_SLACK);
|
2007-08-21 22:01:34 -07:00
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="notify">
|
|
|
|
|
<parameter name="aTimer"/>
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
if (!document)
|
|
|
|
|
aTimer.cancel();
|
|
|
|
|
|
2007-08-21 22:01:52 -07:00
|
|
|
|
var percent = this._animatePercents[this._animateStep];
|
2007-08-21 22:02:12 -07:00
|
|
|
|
this.mAllTabsBoxAnimate.style.opacity = percent;
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#ifdef XP_MACOSX
|
2007-08-21 22:02:12 -07:00
|
|
|
|
this.mDownBoxAnimate.style.opacity = percent;
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#endif
|
2007-08-21 22:01:25 -07:00
|
|
|
|
|
2007-08-21 22:01:52 -07:00
|
|
|
|
if (this._animateStep < (this._animatePercents.length - 1))
|
|
|
|
|
this._animateStep++;
|
|
|
|
|
else
|
|
|
|
|
this._stopAnimation();
|
2007-08-21 22:01:34 -07:00
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
</implementation>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<handlers>
|
2007-08-21 22:01:28 -07:00
|
|
|
|
<handler event="TabSelect" action="this._handleTabSelect();"/>
|
2007-08-21 22:01:34 -07:00
|
|
|
|
</handlers>
|
|
|
|
|
</binding>
|
|
|
|
|
|
2007-08-21 22:01:33 -07:00
|
|
|
|
<!-- close-tab-button binding
|
|
|
|
|
This binding relies on the structure of the tabbrowser binding.
|
2007-08-21 22:01:34 -07:00
|
|
|
|
Therefore it should only be used as a child of the tab or the tabs
|
2007-08-21 22:01:33 -07:00
|
|
|
|
element (in both cases, when they are anonymous nodes of <tabbrowser>).
|
|
|
|
|
This binding is exposed as a pseudo-public-API so themes can customize
|
|
|
|
|
the tabbar appearance without having to be scriptable
|
|
|
|
|
(see globalBindings.xml in Pinstripe for example).
|
|
|
|
|
-->
|
|
|
|
|
<binding id="tabbrowser-close-tab-button"
|
2007-08-21 22:02:01 -07:00
|
|
|
|
extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton-image">
|
2007-08-21 22:01:33 -07:00
|
|
|
|
<handlers>
|
2007-08-21 22:02:09 -07:00
|
|
|
|
<handler event="click" button="0"><![CDATA[
|
2007-08-21 22:01:33 -07:00
|
|
|
|
var bindingParent = document.getBindingParent(this);
|
|
|
|
|
if (bindingParent) {
|
|
|
|
|
var tabbedBrowser = document.getBindingParent(bindingParent);
|
|
|
|
|
if (bindingParent.localName == "tab") {
|
2007-08-21 22:02:06 -07:00
|
|
|
|
/* The only sequence in which a second click event (i.e. dblclik)
|
|
|
|
|
* can be dispatched on an in-tab close button is when it is shown
|
|
|
|
|
* after the first click (i.e. the first click event was dispatched
|
|
|
|
|
* on the tab). This happens when we show the close button only on
|
2007-08-21 22:02:35 -07:00
|
|
|
|
* the active tab. (bug 352021)
|
|
|
|
|
* The only sequence in which a third click event can be dispatched
|
|
|
|
|
* on an in-tab close button is when the tab was opened with a
|
|
|
|
|
* double click on the tabbar. (bug 378344)
|
|
|
|
|
* In both cases, it is most likely that the close button area has
|
|
|
|
|
* been accidentally clicked, therefore we do not close the tab.
|
2008-03-08 16:31:39 -08:00
|
|
|
|
*
|
|
|
|
|
* We don't want to ignore processing of more than one click event,
|
|
|
|
|
* though, since the user might actually be repeatedly clicking to
|
|
|
|
|
* close many tabs at once.
|
2007-08-21 22:02:06 -07:00
|
|
|
|
*/
|
2008-03-08 16:31:39 -08:00
|
|
|
|
if (event.detail > 1 && !this._ignoredClick) {
|
|
|
|
|
this._ignoredClick = true;
|
2007-08-21 22:02:06 -07:00
|
|
|
|
return;
|
2008-03-08 16:31:39 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Reset the "ignored click" flag
|
|
|
|
|
this._ignoredClick = false;
|
2007-08-21 22:02:06 -07:00
|
|
|
|
|
2009-01-16 19:59:36 -08:00
|
|
|
|
tabbedBrowser.removeTab(bindingParent);
|
2007-08-21 22:01:33 -07:00
|
|
|
|
tabbedBrowser._blockDblClick = true;
|
|
|
|
|
|
|
|
|
|
/* XXXmano hack (see bug 343628):
|
|
|
|
|
* Since we're removing the event target, if the user
|
|
|
|
|
* double-clicks this button, the dblclick event will be dispatched
|
|
|
|
|
* with the tabbar as its event target (and explicit/originalTarget),
|
|
|
|
|
* which treats that as a mouse gesture for opening a new tab.
|
2007-08-21 22:02:34 -07:00
|
|
|
|
* In this context, we're manually blocking the dblclick event
|
|
|
|
|
* (see onTabBarDblClick).
|
2007-08-21 22:01:33 -07:00
|
|
|
|
*/
|
2007-08-21 22:02:34 -07:00
|
|
|
|
var clickedOnce = false;
|
|
|
|
|
function enableDblClick(event) {
|
|
|
|
|
if (event.detail == 1 && !clickedOnce) {
|
|
|
|
|
clickedOnce = true;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
tabbedBrowser._blockDblClick = false;
|
|
|
|
|
}, 0);
|
|
|
|
|
tabbedBrowser.removeEventListener("click", enableDblClick, false);
|
2007-08-21 22:01:33 -07:00
|
|
|
|
}
|
2007-08-21 22:02:34 -07:00
|
|
|
|
tabbedBrowser.addEventListener("click", enableDblClick, false);
|
2007-08-21 22:01:33 -07:00
|
|
|
|
}
|
|
|
|
|
else // "tabs"
|
|
|
|
|
tabbedBrowser.removeCurrentTab();
|
|
|
|
|
}
|
|
|
|
|
]]></handler>
|
2007-08-21 22:02:09 -07:00
|
|
|
|
<handler event="dblclick" button="0" phase="capturing">
|
2007-08-21 22:01:33 -07:00
|
|
|
|
// for the one-close-button case
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
</handler>
|
|
|
|
|
</handlers>
|
|
|
|
|
</binding>
|
|
|
|
|
|
2007-11-21 04:04:21 -08:00
|
|
|
|
<binding id="tabbrowser-tab" display="xul:hbox"
|
2007-08-21 22:00:54 -07:00
|
|
|
|
extends="chrome://global/content/bindings/tabbox.xml#tab">
|
2009-07-29 11:33:53 -07:00
|
|
|
|
<content closetabtext="&closeTab.label;">
|
2007-11-21 04:04:21 -08:00
|
|
|
|
<xul:image xbl:inherits="validate,src=image" class="tab-icon-image"/>
|
|
|
|
|
<xul:label flex="1" xbl:inherits="value=label,crop,accesskey" class="tab-text"/>
|
|
|
|
|
<xul:toolbarbutton anonid="close-button" tabindex="-1" class="tab-close-button"/>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
</content>
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<implementation>
|
|
|
|
|
<field name="mOverCloseButton">false</field>
|
2009-07-10 11:34:46 -07:00
|
|
|
|
<field name="mCorrespondingMenuitem">null</field>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
</implementation>
|
|
|
|
|
|
|
|
|
|
<handlers>
|
|
|
|
|
<handler event="mouseover">
|
|
|
|
|
var anonid = event.originalTarget.getAttribute("anonid");
|
|
|
|
|
if (anonid == "close-button")
|
|
|
|
|
this.mOverCloseButton = true;
|
|
|
|
|
</handler>
|
|
|
|
|
<handler event="mouseout">
|
|
|
|
|
var anonid = event.originalTarget.getAttribute("anonid");
|
|
|
|
|
if (anonid == "close-button")
|
|
|
|
|
this.mOverCloseButton = false;
|
|
|
|
|
</handler>
|
2009-03-09 10:43:44 -07:00
|
|
|
|
<handler event="dragstart" phase="capturing">
|
|
|
|
|
this.style.MozUserFocus = '';
|
|
|
|
|
</handler>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<handler event="mousedown" button="0" phase="capturing">
|
|
|
|
|
<![CDATA[
|
2009-03-09 10:43:44 -07:00
|
|
|
|
if (this.mOverCloseButton) {
|
2007-08-21 22:00:54 -07:00
|
|
|
|
event.stopPropagation();
|
2009-03-09 10:43:44 -07:00
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
this.style.MozUserFocus = 'ignore';
|
|
|
|
|
this.clientTop; // just using this to flush style updates
|
|
|
|
|
}
|
2007-08-21 22:00:54 -07:00
|
|
|
|
]]>
|
|
|
|
|
</handler>
|
2009-05-06 01:29:38 -07:00
|
|
|
|
<handler event="mousedown" button="1">
|
|
|
|
|
this.style.MozUserFocus = 'ignore';
|
|
|
|
|
this.clientTop;
|
|
|
|
|
</handler>
|
2009-03-09 10:43:44 -07:00
|
|
|
|
<handler event="mousedown" button="2">
|
|
|
|
|
this.style.MozUserFocus = 'ignore';
|
|
|
|
|
this.clientTop;
|
|
|
|
|
</handler>
|
|
|
|
|
<handler event="mouseup">
|
|
|
|
|
this.style.MozUserFocus = '';
|
|
|
|
|
</handler>
|
2007-08-21 22:00:54 -07:00
|
|
|
|
</handlers>
|
|
|
|
|
</binding>
|
2007-08-21 21:58:49 -07:00
|
|
|
|
|
2009-07-10 11:34:46 -07:00
|
|
|
|
<binding id="tabbrowser-alltabs-popup"
|
|
|
|
|
extends="chrome://global/content/bindings/popup.xml#popup">
|
|
|
|
|
<implementation implements="nsIDOMEventListener">
|
|
|
|
|
<method name="_menuItemOnCommand">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
var tabcontainer = document.getBindingParent(this);
|
|
|
|
|
tabcontainer.selectedItem = aEvent.target.tab;
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="_tabOnAttrModified">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
var menuItem = aEvent.target.mCorrespondingMenuitem;
|
|
|
|
|
if (menuItem) {
|
|
|
|
|
var attrName = aEvent.attrName;
|
|
|
|
|
switch (attrName) {
|
|
|
|
|
case "label":
|
|
|
|
|
case "crop":
|
|
|
|
|
case "busy":
|
|
|
|
|
case "image":
|
|
|
|
|
case "selected":
|
|
|
|
|
if (aEvent.attrChange == aEvent.REMOVAL)
|
|
|
|
|
menuItem.removeAttribute(attrName);
|
|
|
|
|
else
|
|
|
|
|
menuItem.setAttribute(attrName, aEvent.newValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="_tabOnTabClose">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
var menuItem = aEvent.target.mCorrespondingMenuitem;
|
|
|
|
|
if (menuItem)
|
|
|
|
|
this.removeChild(menuItem);
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="handleEvent">
|
|
|
|
|
<parameter name="aEvent"/>
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
if (!aEvent.isTrusted)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
switch (aEvent.type) {
|
|
|
|
|
case "command":
|
|
|
|
|
this._menuItemOnCommand(aEvent);
|
|
|
|
|
break;
|
|
|
|
|
case "DOMAttrModified":
|
|
|
|
|
this._tabOnAttrModified(aEvent);
|
|
|
|
|
break;
|
|
|
|
|
case "TabClose":
|
|
|
|
|
this._tabOnTabClose(aEvent);
|
|
|
|
|
break;
|
|
|
|
|
case "TabOpen":
|
|
|
|
|
this._createTabMenuItem(aEvent.originalTarget);
|
|
|
|
|
break;
|
|
|
|
|
case "scroll":
|
|
|
|
|
this._updateTabsVisibilityStatus();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="_updateTabsVisibilityStatus">
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
var tabContainer = document.getBindingParent(this);
|
|
|
|
|
// We don't want menu item decoration unless there is overflow.
|
|
|
|
|
if (tabContainer.getAttribute("overflow") != "true")
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var tabstripBO = tabContainer.mTabstrip.scrollBoxObject;
|
|
|
|
|
for (var i = 0; i < this.childNodes.length; i++) {
|
|
|
|
|
var curTabBO = this.childNodes[i].tab.boxObject;
|
|
|
|
|
if (curTabBO.screenX >= tabstripBO.screenX &&
|
|
|
|
|
curTabBO.screenX + curTabBO.width <= tabstripBO.screenX + tabstripBO.width)
|
|
|
|
|
this.childNodes[i].setAttribute("tabIsVisible", "true");
|
|
|
|
|
else
|
|
|
|
|
this.childNodes[i].removeAttribute("tabIsVisible");
|
|
|
|
|
}
|
|
|
|
|
]]></body>
|
|
|
|
|
|
|
|
|
|
</method>
|
|
|
|
|
|
|
|
|
|
<method name="_createTabMenuItem">
|
|
|
|
|
<parameter name="aTab"/>
|
|
|
|
|
<body><![CDATA[
|
|
|
|
|
var menuItem = document.createElementNS(
|
|
|
|
|
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
|
|
|
|
|
"menuitem");
|
|
|
|
|
|
|
|
|
|
menuItem.setAttribute("class", "menuitem-iconic alltabs-item");
|
|
|
|
|
|
|
|
|
|
menuItem.setAttribute("label", aTab.label);
|
|
|
|
|
menuItem.setAttribute("crop", aTab.getAttribute("crop"));
|
|
|
|
|
menuItem.setAttribute("image", aTab.getAttribute("image"));
|
|
|
|
|
|
|
|
|
|
if (aTab.hasAttribute("busy"))
|
|
|
|
|
menuItem.setAttribute("busy", aTab.getAttribute("busy"));
|
|
|
|
|
if (aTab.selected)
|
|
|
|
|
menuItem.setAttribute("selected", "true");
|
|
|
|
|
|
|
|
|
|
// Keep some attributes of the menuitem in sync with its
|
|
|
|
|
// corresponding tab (e.g. the tab label)
|
|
|
|
|
aTab.mCorrespondingMenuitem = menuItem;
|
|
|
|
|
aTab.addEventListener("DOMAttrModified", this, false);
|
|
|
|
|
aTab.addEventListener("TabClose", this, false);
|
|
|
|
|
menuItem.tab = aTab;
|
|
|
|
|
menuItem.addEventListener("command", this, false);
|
|
|
|
|
|
|
|
|
|
this.appendChild(menuItem);
|
|
|
|
|
return menuItem;
|
|
|
|
|
]]></body>
|
|
|
|
|
</method>
|
|
|
|
|
</implementation>
|
|
|
|
|
|
|
|
|
|
<handlers>
|
|
|
|
|
<handler event="popupshowing">
|
|
|
|
|
|
|
|
|
|
<![CDATA[
|
|
|
|
|
// set up the menu popup
|
|
|
|
|
var tabcontainer = document.getBindingParent(this);
|
|
|
|
|
var tabs = tabcontainer.childNodes;
|
|
|
|
|
|
|
|
|
|
// Listen for changes in the tab bar.
|
|
|
|
|
var tabbrowser = document.getBindingParent(tabcontainer);
|
|
|
|
|
tabbrowser.addEventListener("TabOpen", this, false);
|
|
|
|
|
tabcontainer.mTabstrip.addEventListener("scroll", this, false);
|
|
|
|
|
|
|
|
|
|
// if an animation is in progress and the user
|
|
|
|
|
// clicks on the "all tabs" button, stop the animation
|
|
|
|
|
tabcontainer._stopAnimation();
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < tabs.length; i++) {
|
|
|
|
|
this._createTabMenuItem(tabs[i]);
|
|
|
|
|
}
|
|
|
|
|
this._updateTabsVisibilityStatus();
|
|
|
|
|
]]></handler>
|
|
|
|
|
|
|
|
|
|
<handler event="popuphiding">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
// clear out the menu popup and remove the listeners
|
|
|
|
|
while (this.hasChildNodes()) {
|
|
|
|
|
var menuItem = this.lastChild;
|
|
|
|
|
menuItem.removeEventListener("command", this, false);
|
|
|
|
|
menuItem.tab.removeEventListener("DOMAttrModified", this, false);
|
|
|
|
|
menuItem.tab.removeEventListener("TabClose", this, false);
|
|
|
|
|
menuItem.tab.mCorrespondingMenuitem = null;
|
|
|
|
|
this.removeChild(menuItem);
|
|
|
|
|
}
|
|
|
|
|
var tabcontainer = document.getBindingParent(this);
|
|
|
|
|
tabcontainer.mTabstrip.removeEventListener("scroll", this, false);
|
|
|
|
|
document.getBindingParent(tabcontainer).removeEventListener("TabOpen", this, false);
|
|
|
|
|
]]></handler>
|
|
|
|
|
|
|
|
|
|
<handler event="DOMMenuItemActive">
|
|
|
|
|
<![CDATA[
|
|
|
|
|
var tab = event.target.tab;
|
|
|
|
|
if (tab) {
|
|
|
|
|
var statusText = tab.linkedBrowser.currentURI.spec;
|
|
|
|
|
if (statusText == "about:blank") {
|
|
|
|
|
// XXXhack: Passing a space here (and not "")
|
|
|
|
|
// to make sure the the browser implementation would
|
|
|
|
|
// still consider it a hovered link.
|
|
|
|
|
statusText = " ";
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-20 21:25:59 -07:00
|
|
|
|
XULBrowserWindow.setOverLink(statusText, null);
|
2009-07-10 11:34:46 -07:00
|
|
|
|
}
|
|
|
|
|
]]></handler>
|
|
|
|
|
|
|
|
|
|
<handler event="DOMMenuItemInactive">
|
|
|
|
|
<![CDATA[
|
2009-07-20 21:25:59 -07:00
|
|
|
|
XULBrowserWindow.setOverLink("", null);
|
2009-07-10 11:34:46 -07:00
|
|
|
|
]]></handler>
|
|
|
|
|
|
|
|
|
|
</handlers>
|
|
|
|
|
</binding>
|
|
|
|
|
|
2007-08-21 21:58:49 -07:00
|
|
|
|
</bindings>
|