releases-comm-central/im/content/aboutPanel.xml

126 строки
4.2 KiB
XML

<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<bindings id="aboutPanelBindings"
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">
<binding id="aboutPanel">
<content flex="1">
<xul:vbox flex="1">
<xul:browser anonid="aboutBrowser" disablehistory="true" type="content"
flex="1" tooltip="imTooltip"/>
</xul:vbox>
</content>
<implementation>
<method name="showAboutPage">
<parameter name="aPage"/>
<body>
<![CDATA[
let url = aPage.startsWith("about:") ? aPage : "about:" + aPage;
this.browser.loadURI(url);
]]>
</body>
</method>
<method name="refreshTitle">
<body>
<![CDATA[
let browser = this.browser;
this.tab.setAttribute("label",
browser.contentTitle.replace(/\0/g, "") || browser.currentURI.spec);
if (browser.currentURI.spec == "about:addons") {
// Set the tab type to "addons" so that CSS will set its favicon.
this.tab.setAttribute("type", "addons");
}
]]>
</body>
</method>
<method name="finishImport">
<parameter name="aAboutPanel"/>
<body>
<![CDATA[
this.browser.swapDocShells(aAboutPanel.browser);
this.refreshTitle();
]]>
</body>
</method>
<property name="browser" readonly="true">
<getter>
return document.getAnonymousElementByAttribute(this, "anonid", "aboutBrowser");
</getter>
</property>
<constructor>
<![CDATA[
this.browser.addEventListener("DOMTitleChanged", this.refreshTitle.bind(this));
// The addon manager does its own link handling using window.open().
// We need to override this method to open http links externally.
let win = this.browser.contentWindow;
let open = win.open;
win.open = function(aUrl) {
let uri = Services.io.newURI(aUrl, null, null);
if (!uri.schemeIs("http") && !uri.schemeIs("https")) {
open.apply(this, arguments);
}
else {
Components.classes["@mozilla.org/uriloader/external-protocol-service;1"]
.getService(Components.interfaces.nsIExternalProtocolService).loadUrl(uri);
}
}
]]>
</constructor>
</implementation>
<handlers>
<handler event="click">
<![CDATA[
// We only handle middle clicks. We don't handle the addon manager.
if (event.button != 1 || this.browser.currentURI.spec == "about:addons")
return;
// The event target may be a descendant of the actual link.
let url;
for (let elem = event.target; elem; elem = elem.parentNode) {
if (elem instanceof HTMLAnchorElement) {
url = elem.href;
if (url)
break;
}
}
if (!url)
return;
event.stopPropagation();
event.preventDefault();
// If it's an about page, open it.
if (url.startsWith("about:")) {
let panel = document.createElementNS(
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
"aboutPanel");
// addPanel will return null if the window can't accept new tabs.
if (window.getTabBrowser().addPanel(panel)) {
panel.showAboutPage(url);
return;
}
// If we couldn't add a new tab, load the page in this one.
this.showAboutPage(url);
return;
}
// Otherwise open in default browser.
// loadUrl can throw if the default browser is misconfigured.
Components.classes["@mozilla.org/uriloader/external-protocol-service;1"]
.getService(Components.interfaces.nsIExternalProtocolService)
.loadUrl(Services.io.newURI(url, null, null));
]]>
</handler>
</handlers>
</binding>
</bindings>