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;
|
2007-08-21 22:00:54 -07:00
|
|
|
|
<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
|
|
|
|
|
%globalDTD;
|
2007-08-21 21:58:49 -07:00
|
|
|
|
]>
|
|
|
|
|
|
|
|
|
|
<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();">
|
2008-11-15 11:47:53 -08:00
|
|
|
|
<xul:hbox class="tab-drop-indicator-bar" collapsed="true" chromedir="&locale.dir;"
|
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[
|
2007-11-19 23:58:58 -08:00
|
|
|
|
var browsers = this.browsers;
|
|
|
|
|
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) {
|
2007-08-21 21:58:49 -07:00
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mProgressListeners[i];
|
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onProgressChange(aWebProgress, aRequest,
|
|
|
|
|
aCurSelfProgress, aMaxSelfProgress,
|
|
|
|
|
aCurTotalProgress, aMaxTotalProgress);
|
|
|
|
|
} 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:01:05 -07:00
|
|
|
|
|
2008-11-18 02:53:25 -08:00
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mTabsProgressListeners[i];
|
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onProgressChange(this.mBrowser, aWebProgress, aRequest,
|
|
|
|
|
aCurSelfProgress, aMaxSelfProgress,
|
|
|
|
|
aCurTotalProgress, aMaxTotalProgress);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
|
|
|
|
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) {
|
2007-08-21 21:58:49 -07:00
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
var 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) {
|
|
|
|
|
// 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:01:05 -07:00
|
|
|
|
|
2008-11-18 02:53:25 -08:00
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mTabsProgressListeners[i];
|
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onStateChange(this.mBrowser, aWebProgress, aRequest, aStateFlags, aStatus);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
|
|
|
|
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) {
|
2007-08-21 21:58:49 -07:00
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mProgressListeners[i];
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mTabsProgressListeners[i];
|
|
|
|
|
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) {
|
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mProgressListeners[i];
|
|
|
|
|
if (p)
|
2008-03-05 14:34:54 -08:00
|
|
|
|
try {
|
|
|
|
|
p.onStatusChange(aWebProgress, aRequest, aStatus, aMessage);
|
|
|
|
|
} 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:01:05 -07:00
|
|
|
|
|
2008-11-18 02:53:25 -08:00
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mTabsProgressListeners[i];
|
|
|
|
|
if (p)
|
|
|
|
|
try {
|
|
|
|
|
p.onStatusChange(this.mBrowser, aWebProgress, aRequest, aStatus, aMessage);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
|
|
|
|
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) {
|
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mProgressListeners[i];
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mTabsProgressListeners[i];
|
|
|
|
|
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) {
|
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mProgressListeners[i];
|
|
|
|
|
if (p && "onRefreshAttempted" in p) {
|
|
|
|
|
try {
|
|
|
|
|
if (!p.onRefreshAttempted(aWebProgress, aURI, aDelay, aSameURI))
|
|
|
|
|
allowRefresh = false;
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < this.mTabBrowser.mTabsProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mTabBrowser.mTabsProgressListeners[i];
|
|
|
|
|
if (p && "onRefreshAttempted" in p) {
|
|
|
|
|
try {
|
|
|
|
|
if (!p.onRefreshAttempted(this.mBrowser, aWebProgress, aURI, aDelay, aSameURI))
|
|
|
|
|
allowRefresh = false;
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners or following code
|
|
|
|
|
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);
|
|
|
|
|
browser.mIconURL = aURI;
|
|
|
|
|
|
2007-10-09 22:03:52 -07:00
|
|
|
|
if (aURI) {
|
|
|
|
|
if (!(aURI instanceof Components.interfaces.nsIURI)) {
|
|
|
|
|
var ios = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
|
|
|
|
aURI = ios.newURI(aURI, null, null);
|
|
|
|
|
}
|
2008-12-30 04:44:55 -08:00
|
|
|
|
if (this.mFaviconService)
|
|
|
|
|
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) {
|
|
|
|
|
for (var i = 0; i < this.mProgressListeners.length; i++) {
|
|
|
|
|
var p = this.mProgressListeners[i];
|
|
|
|
|
if ('onLinkIconAvailable' in p)
|
|
|
|
|
try {
|
|
|
|
|
p.onLinkIconAvailable(browser);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// don't inhibit other listeners
|
|
|
|
|
Components.utils.reportError(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < this.mTabsProgressListeners.length; i++) {
|
|
|
|
|
var 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;
|
|
|
|
|
|
|
|
|
|
this.setIcon(aTab, browser.currentURI.spec);
|
|
|
|
|
} 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[
|
2007-10-09 22:03:52 -07:00
|
|
|
|
if (!(aURI instanceof Components.interfaces.nsIURI)) {
|
|
|
|
|
var ios = Components.classes["@mozilla.org/network/io-service;1"]
|
|
|
|
|
.getService(Components.interfaces.nsIIOService);
|
|
|
|
|
aURI = ios.newURI(aURI, null, null);
|
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-12-30 04:44:55 -08:00
|
|
|
|
if (this.mFaviconService)
|
|
|
|
|
return this.mFaviconService.isFailedFavicon(aURI);
|
|
|
|
|
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;
|
|
|
|
|
|
2007-08-21 21:59:23 -07:00
|
|
|
|
if (this.mCurrentBrowser) {
|
2007-08-21 22:00:00 -07:00
|
|
|
|
// Only save the focused element if it is in our content window
|
|
|
|
|
// or in an ancestor window.
|
|
|
|
|
var focusedWindow = document.commandDispatcher.focusedWindow;
|
|
|
|
|
var saveFocus = false;
|
|
|
|
|
|
2007-08-21 22:00:23 -07:00
|
|
|
|
if (focusedWindow && focusedWindow.top == window.content) {
|
2007-08-21 22:00:00 -07:00
|
|
|
|
saveFocus = true;
|
|
|
|
|
} else {
|
|
|
|
|
var contentWindow = window;
|
|
|
|
|
|
|
|
|
|
while (contentWindow) {
|
|
|
|
|
if (contentWindow == focusedWindow) {
|
|
|
|
|
saveFocus = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (contentWindow.parent == contentWindow) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
contentWindow = contentWindow.parent;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (saveFocus) {
|
|
|
|
|
// Preserve the currently-focused element or DOM window for
|
|
|
|
|
// this tab.
|
|
|
|
|
|
|
|
|
|
this.mCurrentBrowser.focusedWindow = focusedWindow;
|
|
|
|
|
this.mCurrentBrowser.focusedElement = document.commandDispatcher.focusedElement;
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 22:02:25 -07:00
|
|
|
|
if (this.mCurrentBrowser.focusedElement &&
|
|
|
|
|
this.mCurrentBrowser.focusedElement.parentNode !=
|
|
|
|
|
this.mCurrentTab.parentNode) {
|
|
|
|
|
// Clear focus outline before we draw on top of it.
|
|
|
|
|
// Only blur the focused element if it isn't a tab,
|
|
|
|
|
// to avoid breaking keyboard tab navigation
|
2007-08-21 22:02:39 -07:00
|
|
|
|
var elem = this.mCurrentBrowser.focusedElement;
|
|
|
|
|
if (elem instanceof HTMLElement || elem instanceof XULElement) {
|
|
|
|
|
elem.blur();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
var content = elem.ownerDocument.defaultView;
|
|
|
|
|
if (content instanceof Components.interfaces.nsIInterfaceRequestor)
|
|
|
|
|
content.getInterface(Components.interfaces.nsIDOMWindowUtils).focus(null);
|
|
|
|
|
}
|
2007-08-21 21:59:44 -07:00
|
|
|
|
}
|
2007-08-21 22:01:01 -07:00
|
|
|
|
this.mCurrentBrowser.setAttribute("type", "content-targetable");
|
2007-08-21 21:59:23 -07:00
|
|
|
|
}
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
2007-08-21 21:59:00 -07:00
|
|
|
|
var updatePageReport = false;
|
2007-12-14 16:25:17 -08:00
|
|
|
|
if (!this.mCurrentBrowser ||
|
|
|
|
|
(this.mCurrentBrowser.pageReport && !newBrowser.pageReport) ||
|
2007-08-21 21:59:00 -07:00
|
|
|
|
(!this.mCurrentBrowser.pageReport && newBrowser.pageReport))
|
|
|
|
|
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);
|
|
|
|
|
|
2007-08-21 21:59:44 -07:00
|
|
|
|
if (document.commandDispatcher.focusedElement &&
|
|
|
|
|
document.commandDispatcher.focusedElement.parentNode ==
|
|
|
|
|
this.mCurrentTab.parentNode) {
|
|
|
|
|
// The focus is on a tab in the same tab panel
|
|
|
|
|
return; // If focus was on a tab, switching tabs focuses the new tab
|
2007-08-21 21:59:23 -07:00
|
|
|
|
}
|
|
|
|
|
|
2007-08-21 21:59:44 -07:00
|
|
|
|
var whatToFocus = window.content;
|
|
|
|
|
|
2008-04-14 09:28:01 -07:00
|
|
|
|
// Focus the previously focused element or window, but make sure
|
|
|
|
|
// the focused element is still part of the document
|
|
|
|
|
let focusedElem = newBrowser.focusedElement;
|
|
|
|
|
if (focusedElem && focusedElem.ownerDocument &&
|
|
|
|
|
!(focusedElem.ownerDocument.compareDocumentPosition(focusedElem) &
|
|
|
|
|
Node.DOCUMENT_POSITION_DISCONNECTED)) {
|
2007-08-21 21:59:44 -07:00
|
|
|
|
if (newBrowser.focusedElement.parentNode !=
|
|
|
|
|
this.mCurrentTab.parentNode) {
|
|
|
|
|
// Focus the remembered element unless it's in the current tab panel
|
|
|
|
|
whatToFocus = newBrowser.focusedElement;
|
2007-08-21 21:59:23 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2007-08-21 21:59:44 -07:00
|
|
|
|
else if (newBrowser.focusedWindow) {
|
|
|
|
|
whatToFocus = newBrowser.focusedWindow;
|
|
|
|
|
}
|
2007-08-21 22:02:22 -07:00
|
|
|
|
|
2007-08-21 22:02:26 -07:00
|
|
|
|
// Change focus for this window to |whatToFocus|, without
|
|
|
|
|
// focusing the window itself.
|
|
|
|
|
var cmdDispatcher = document.commandDispatcher;
|
|
|
|
|
|
|
|
|
|
var ww =
|
|
|
|
|
Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
|
|
|
|
|
.getService(Components.interfaces.nsIWindowWatcher);
|
|
|
|
|
if (ww.activeWindow == window) {
|
|
|
|
|
cmdDispatcher.suppressFocusScroll = true;
|
2007-08-21 22:02:39 -07:00
|
|
|
|
if (whatToFocus instanceof HTMLElement ||
|
|
|
|
|
whatToFocus instanceof XULElement ||
|
|
|
|
|
whatToFocus instanceof Window) {
|
|
|
|
|
whatToFocus.focus();
|
|
|
|
|
}
|
|
|
|
|
else if (whatToFocus instanceof Node) {
|
|
|
|
|
var content = window.content;
|
|
|
|
|
if (content instanceof Components.interfaces.nsIInterfaceRequestor)
|
|
|
|
|
content.getInterface(Components.interfaces.nsIDOMWindowUtils).focus(whatToFocus);
|
|
|
|
|
}
|
2007-08-21 22:02:26 -07:00
|
|
|
|
cmdDispatcher.suppressFocusScroll = false;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// set the element in command dispatcher so focus will restore
|
|
|
|
|
// properly when the window does become active
|
|
|
|
|
if (whatToFocus instanceof Window) {
|
|
|
|
|
cmdDispatcher.focusedWindow = whatToFocus;
|
|
|
|
|
cmdDispatcher.focusedElement = null;
|
2007-08-21 22:01:57 -07:00
|
|
|
|
}
|
2007-08-21 22:02:22 -07:00
|
|
|
|
else {
|
2007-08-21 22:02:26 -07:00
|
|
|
|
cmdDispatcher.focusedWindow = whatToFocus.ownerDocument.defaultView;
|
|
|
|
|
cmdDispatcher.focusedElement = whatToFocus;
|
2007-08-21 22:01:57 -07:00
|
|
|
|
}
|
2007-08-21 21:59:44 -07:00
|
|
|
|
}
|
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;
|
|
|
|
|
|
|
|
|
|
var i = 0;
|
2007-08-21 21:59:41 -07:00
|
|
|
|
for ( ; i < this.parentNode.parentNode.childNodes.length; i++) {
|
2007-08-21 22:01:12 -07:00
|
|
|
|
if (this.parentNode.parentNode.childNodes[i].firstChild == this)
|
2007-08-21 21:58:49 -07:00
|
|
|
|
break;
|
|
|
|
|
}
|
2007-08-21 22:00:55 -07:00
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
if (document.defaultView
|
|
|
|
|
.getComputedStyle(this.mTabContainer, "")
|
|
|
|
|
.direction == "rtl") {
|
|
|
|
|
/* 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 */
|
|
|
|
|
|
|
|
|
|
this.mTabContainer.mTabstrip.scrollBoxObject
|
|
|
|
|
.scrollBy(this.mTabContainer.firstChild.boxObject.width, 0);
|
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
|
|
2007-08-21 22:01:37 -07:00
|
|
|
|
// |setTimeout| here to ensure we're post reflow
|
|
|
|
|
var _delayedUpdate = function(aTabContainer) {
|
2007-08-21 22:01:56 -07:00
|
|
|
|
aTabContainer.adjustTabstrip();
|
2007-08-21 22:01:37 -07:00
|
|
|
|
|
2007-08-21 22:01:48 -07:00
|
|
|
|
if (aTabContainer.selectedItem != t)
|
|
|
|
|
aTabContainer._notifyBackgroundTab(t);
|
|
|
|
|
|
2007-08-21 22:01:37 -07:00
|
|
|
|
// XXXmano: this is a temporary workaround to bug 343585
|
|
|
|
|
// 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.
|
|
|
|
|
aTabContainer.mTabstrip._updateScrollButtonsDisabledState();
|
|
|
|
|
}
|
|
|
|
|
setTimeout(_delayedUpdate, 0, this.mTabContainer);
|
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) {
|
|
|
|
|
// see notes in addTab
|
|
|
|
|
function _delayedUpdate(aTabContainer) {
|
|
|
|
|
aTabContainer.adjustTabstrip();
|
|
|
|
|
aTabContainer.mTabstrip._updateScrollButtonsDisabledState();
|
|
|
|
|
};
|
|
|
|
|
setTimeout(_delayedUpdate, 0, this.tabContainer);
|
2009-03-25 02:54:33 -07:00
|
|
|
|
|
2009-04-25 01:09:39 -07:00
|
|
|
|
if (aNewTab && gURLBar)
|
|
|
|
|
gURLBar.focus();
|
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
|
2007-08-21 21:59:56 -07:00
|
|
|
|
// XBL implementation of nsIObserver still works. But
|
|
|
|
|
// clearing focusedWindow happens below because it gets
|
|
|
|
|
// reset by updateCurrentBrowser.
|
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
|
|
|
|
|
2009-03-24 04:47:06 -07:00
|
|
|
|
// see comment about destroy above
|
2008-08-11 01:38:43 -07:00
|
|
|
|
browser.focusedWindow = null;
|
|
|
|
|
browser.focusedElement = null;
|
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 08:20:19 -07:00
|
|
|
|
// If we have hooked it up to a filter, don't forget to remove it
|
|
|
|
|
// (but don't fail if it wasn't)
|
|
|
|
|
if (!this.mTabbedMode && this.mTabFilters[0])
|
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;
|
|
|
|
|
var tabStripBoxObject = tabStrip.scrollBoxObject;
|
2007-09-17 17:59:41 -07:00
|
|
|
|
var minMargin = tabStripBoxObject.x - this.boxObject.x;
|
|
|
|
|
// 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.
|
|
|
|
|
var maxMargin = Math.min(minMargin + tabStripBoxObject.width,
|
|
|
|
|
ib.boxObject.x + ib.boxObject.width -
|
|
|
|
|
ind.boxObject.width);
|
2007-10-28 20:03:46 -07:00
|
|
|
|
if (!ltr)
|
|
|
|
|
[minMargin, maxMargin] = [this.boxObject.width - maxMargin,
|
|
|
|
|
this.boxObject.width - minMargin];
|
2007-09-17 17:59:41 -07:00
|
|
|
|
var newMargin, tabBoxObject;
|
|
|
|
|
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) {
|
2007-09-17 17:59:41 -07:00
|
|
|
|
tabBoxObject = this.mTabs[newIndex-1].boxObject;
|
|
|
|
|
if (ltr)
|
|
|
|
|
newMargin = tabBoxObject.screenX - this.boxObject.screenX
|
|
|
|
|
+ tabBoxObject.width;
|
|
|
|
|
else
|
|
|
|
|
newMargin = this.boxObject.screenX - tabBoxObject.screenX
|
|
|
|
|
+ this.boxObject.width;
|
2007-08-21 22:02:40 -07:00
|
|
|
|
}
|
|
|
|
|
else {
|
2007-09-17 17:59:41 -07:00
|
|
|
|
tabBoxObject = this.mTabs[newIndex].boxObject;
|
|
|
|
|
if (ltr)
|
|
|
|
|
newMargin = tabBoxObject.screenX - this.boxObject.screenX;
|
|
|
|
|
else
|
|
|
|
|
newMargin = this.boxObject.screenX - tabBoxObject.screenX
|
|
|
|
|
+ this.boxObject.width - tabBoxObject.width;
|
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-04-15 17:33:15 -07:00
|
|
|
|
// Deatch happens only if the tab was dropped below the tabbar.
|
|
|
|
|
// That is applied even if it was dropped outside the browser
|
|
|
|
|
// window.
|
|
|
|
|
var bo = this.mTabContainer.mTabstrip.boxObject;
|
|
|
|
|
var tabbarEndScreenY = bo.screenY + bo.height;
|
|
|
|
|
if (aEvent.screenY > tabbarEndScreenY) {
|
2009-02-19 04:00:05 -08:00
|
|
|
|
var draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
|
2009-01-22 19:00:54 -08:00
|
|
|
|
this.replaceTabWithWindow(draggedTab);
|
2008-11-15 11:47:53 -08:00
|
|
|
|
}
|
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;
|
2007-08-21 22:01:30 -07:00
|
|
|
|
this.mTabContainer.mTabstrip.scrollBoxObject.ensureElementIsVisible(this.mCurrentTab);
|
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
|
|
|
|
|
this.scrollBoxObject.ensureElementIsVisible(tabs.selectedItem);
|
|
|
|
|
]]></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();"
|
2007-08-25 17:37:18 -07:00
|
|
|
|
onmouseout="_pauseScroll();"
|
2007-08-21 22:02:12 -07:00
|
|
|
|
chromedir="&locale.dir;"/>
|
|
|
|
|
<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();"
|
2007-08-25 17:37:18 -07:00
|
|
|
|
onmouseout="_pauseScroll();"
|
2007-08-21 22:02:38 -07:00
|
|
|
|
chromedir="&locale.dir;"/>
|
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"
|
|
|
|
|
style="min-width: 1px;" chromedir="&locale.dir;"
|
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"
|
|
|
|
|
command="cmd_newNavigatorTab" chromedir="&locale.dir;"
|
|
|
|
|
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"
|
|
|
|
|
command="cmd_newNavigatorTab" chromedir="&locale.dir;"
|
|
|
|
|
tooltiptext="&newTabButton.tooltip;"/>
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<xul:stack align="center" pack="end" chromedir="&locale.dir;">
|
|
|
|
|
<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"
|
|
|
|
|
tooltiptext="&listAllTabs.label;"
|
|
|
|
|
oncommand="ctrlTab.open(true);"/>
|
2008-03-09 12:59:50 -07:00
|
|
|
|
</xul:stack>
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#ifdef XP_MACOSX
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<xul:hbox anonid="tabstrip-closebutton" class="tabs-closebutton-box" align="center" pack="end" chromedir="&locale.dir;">
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#endif
|
2008-03-09 12:59:50 -07:00
|
|
|
|
<xul:toolbarbutton anonid="tabs-closebutton"
|
|
|
|
|
class="close-button tabs-closebutton" chromedir="&locale.dir;"/>
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#ifdef XP_MACOSX
|
2007-09-15 00:45:39 -07:00
|
|
|
|
</xul:hbox>
|
2008-03-09 12:59:50 -07:00
|
|
|
|
#endif
|
|
|
|
|
</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
|
|
|
|
#ifdef XP_MACOSX
|
2007-08-21 22:01:25 -07:00
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "tabstrip-closebutton");
|
2007-11-21 04:04:21 -08:00
|
|
|
|
#else
|
|
|
|
|
document.getAnonymousElementByAttribute(this, "anonid", "tabs-closebutton");
|
|
|
|
|
#endif
|
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:
|
2007-08-21 22:02:36 -07:00
|
|
|
|
var width = this.firstChild.boxObject.width;
|
|
|
|
|
// 0 width is an invalid value and indicates
|
|
|
|
|
// an item without display, so ignore.
|
|
|
|
|
if (width > this.mTabClipWidth || width == 0)
|
|
|
|
|
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;
|
|
|
|
|
var scrollPos = {};
|
|
|
|
|
tabStrip.scrollBoxObject.getPosition(scrollPos, {});
|
|
|
|
|
var scrolledSize = {};
|
|
|
|
|
tabStrip.scrollBoxObject.getScrolledSize(scrolledSize, {});
|
|
|
|
|
|
|
|
|
|
if (scrollPos.value + tabStrip.boxObject.width >=
|
|
|
|
|
scrolledSize.value) {
|
|
|
|
|
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>
|
|
|
|
|
|
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[
|
|
|
|
|
var tsbo = this.mTabstrip.scrollBoxObject;
|
|
|
|
|
var tsboStart = tsbo.screenX;
|
|
|
|
|
var tsboEnd = tsboStart + tsbo.width;
|
|
|
|
|
|
|
|
|
|
var ctbo = aTab.boxObject;
|
|
|
|
|
var ctboStart = ctbo.screenX;
|
|
|
|
|
var ctboEnd = ctboStart + ctbo.width;
|
|
|
|
|
|
2008-03-04 03:24:41 -08:00
|
|
|
|
// Is the new tab already completely visible?
|
|
|
|
|
if (tsboStart <= ctboStart && ctboEnd <= tsboEnd)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (this.mTabstrip.smoothScroll) {
|
|
|
|
|
var selStart = this.selectedItem.boxObject.screenX;
|
|
|
|
|
var selEnd = selStart + this.selectedItem.boxObject.width;
|
|
|
|
|
|
|
|
|
|
// Can we make both the new tab and the selected tab completely visible?
|
|
|
|
|
if (Math.max(ctboEnd - selStart, selEnd - ctboStart) <= tsbo.width) {
|
|
|
|
|
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 ?
|
|
|
|
|
selEnd - tsboEnd : selStart - tsboStart);
|
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">
|
2007-08-21 22:00:57 -07:00
|
|
|
|
<content chromedir="&locale.dir;"
|
2007-08-21 22:00:54 -07:00
|
|
|
|
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>
|
|
|
|
|
</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
|
|
|
|
|
|
|
|
|
</bindings>
|