1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/content/widgets/remote-browser.xml Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,306 @@ 1.4 +<?xml version="1.0"?> 1.5 + 1.6 +<!-- This Source Code Form is subject to the terms of the Mozilla Public 1.7 + - License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> 1.9 + 1.10 +<bindings id="firefoxBrowserBindings" 1.11 + xmlns="http://www.mozilla.org/xbl" 1.12 + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 1.13 + 1.14 + <binding id="remote-browser" extends="chrome://global/content/bindings/browser.xml#browser"> 1.15 + 1.16 + <implementation type="application/javascript" implements="nsIObserver, nsIDOMEventListener, nsIMessageListener"> 1.17 + 1.18 + <field name="_securityUI">null</field> 1.19 + 1.20 + <property name="securityUI" 1.21 + readonly="true"> 1.22 + <getter><![CDATA[ 1.23 + if (!this._securityUI) { 1.24 + let jsm = "resource://gre/modules/RemoteSecurityUI.jsm"; 1.25 + let RemoteSecurityUI = Components.utils.import(jsm, {}).RemoteSecurityUI; 1.26 + this._securityUI = new RemoteSecurityUI(); 1.27 + } 1.28 + 1.29 + // We want to double-wrap the JS implemented interface, so that QI and instanceof works. 1.30 + var ptr = Cc["@mozilla.org/supports-interface-pointer;1"]. 1.31 + createInstance(Ci.nsISupportsInterfacePointer); 1.32 + ptr.data = this._securityUI; 1.33 + return ptr.data.QueryInterface(Ci.nsISecureBrowserUI); 1.34 + ]]></getter> 1.35 + </property> 1.36 + 1.37 + <method name="adjustPriority"> 1.38 + <parameter name="adjustment"/> 1.39 + <body><![CDATA[ 1.40 + this.messageManager.sendAsyncMessage("NetworkPrioritizer:AdjustPriority", 1.41 + {adjustment: adjustment}); 1.42 + ]]></body> 1.43 + </method> 1.44 + 1.45 + <field name="_remoteWebNavigation">null</field> 1.46 + 1.47 + <property name="webNavigation" 1.48 + onget="return this._remoteWebNavigation;" 1.49 + readonly="true"/> 1.50 + 1.51 + <field name="_remoteWebProgress">null</field> 1.52 + 1.53 + <property name="webProgress" readonly="true"> 1.54 + <getter> 1.55 + <![CDATA[ 1.56 + if (!this._remoteWebProgress) { 1.57 + let jsm = "resource://gre/modules/RemoteWebProgress.jsm"; 1.58 + let RemoteWebProgressManager = Cu.import(jsm, {}).RemoteWebProgressManager; 1.59 + this._remoteWebProgressManager = new RemoteWebProgressManager(this); 1.60 + this._remoteWebProgress = this._remoteWebProgressManager.topLevelWebProgress; 1.61 + } 1.62 + return this._remoteWebProgress; 1.63 + ]]> 1.64 + </getter> 1.65 + </property> 1.66 + 1.67 + <field name="_remoteFinder">null</field> 1.68 + 1.69 + <property name="finder" readonly="true"> 1.70 + <getter><![CDATA[ 1.71 + if (!this._remoteFinder) { 1.72 + let jsm = "resource://gre/modules/RemoteFinder.jsm"; 1.73 + let RemoteFinder = Cu.import(jsm, {}).RemoteFinder; 1.74 + this._remoteFinder = new RemoteFinder(this); 1.75 + } 1.76 + return this._remoteFinder; 1.77 + ]]></getter> 1.78 + </property> 1.79 + 1.80 + <field name="_documentURI">null</field> 1.81 + 1.82 + <field name="_documentContentType">null</field> 1.83 + 1.84 + <!-- 1.85 + Used by session restore to ensure that currentURI is set so 1.86 + that switch-to-tab works before the tab is fully 1.87 + restored. This function also invokes onLocationChanged 1.88 + listeners in tabbrowser.xml. 1.89 + --> 1.90 + <method name="_setCurrentURI"> 1.91 + <parameter name="aURI"/> 1.92 + <body><![CDATA[ 1.93 + this._remoteWebProgressManager.setCurrentURI(aURI); 1.94 + ]]></body> 1.95 + </method> 1.96 + 1.97 + <property name="documentURI" 1.98 + onget="return this._documentURI;" 1.99 + readonly="true"/> 1.100 + 1.101 + <property name="documentContentType" 1.102 + onget="return this._documentContentType;" 1.103 + readonly="true"/> 1.104 + 1.105 + <field name="_contentTitle">""</field> 1.106 + 1.107 + <property name="contentTitle" 1.108 + onget="return this._contentTitle" 1.109 + readonly="true"/> 1.110 + 1.111 + <field name="_characterSet">null</field> 1.112 + 1.113 + <property name="characterSet" 1.114 + onget="return this._characterSet" 1.115 + readonly="true"/> 1.116 + 1.117 + <field name="_contentWindow">null</field> 1.118 + 1.119 + <property name="contentWindow" 1.120 + onget="return this._contentWindow" 1.121 + readonly="true"/> 1.122 + 1.123 + <property name="contentDocument" 1.124 + onget="return this.contentWindow ? this.contentWindow.document : null" 1.125 + readonly="true"/> 1.126 + 1.127 + <field name="_syncHandler">null</field> 1.128 + 1.129 + <property name="syncHandler" 1.130 + onget="return this._syncHandler" 1.131 + readonly="true"/> 1.132 + 1.133 + <field name="_imageDocument">null</field> 1.134 + 1.135 + <property name="imageDocument" 1.136 + onget="return this._imageDocument" 1.137 + readonly="true"/> 1.138 + 1.139 + <field name="_fullZoom">1</field> 1.140 + <property name="fullZoom"> 1.141 + <getter><![CDATA[ 1.142 + return this._fullZoom; 1.143 + ]]></getter> 1.144 + <setter><![CDATA[ 1.145 + this._fullZoom = val; 1.146 + this.messageManager.sendAsyncMessage("FullZoom", {value: val}); 1.147 + ]]></setter> 1.148 + </property> 1.149 + 1.150 + <field name="_textZoom">1</field> 1.151 + <property name="textZoom"> 1.152 + <getter><![CDATA[ 1.153 + return this._textZoom; 1.154 + ]]></getter> 1.155 + <setter><![CDATA[ 1.156 + this._textZoom = val; 1.157 + this.messageManager.sendAsyncMessage("TextZoom", {value: val}); 1.158 + ]]></setter> 1.159 + </property> 1.160 + 1.161 + <field name="_isSyntheticDocument">false</field> 1.162 + <property name="isSyntheticDocument"> 1.163 + <getter><![CDATA[ 1.164 + return this._isSyntheticDocument; 1.165 + ]]></getter> 1.166 + </property> 1.167 + 1.168 + <property name="autoCompletePopup" 1.169 + onget="return document.getElementById(this.getAttribute('autocompletepopup'))" 1.170 + readonly="true"/> 1.171 + 1.172 + <property name="docShellIsActive"> 1.173 + <getter> 1.174 + <![CDATA[ 1.175 + throw new Error("not supported"); 1.176 + ]]> 1.177 + </getter> 1.178 + <setter> 1.179 + <![CDATA[ 1.180 + let {frameLoader} = this.QueryInterface(Ci.nsIFrameLoaderOwner); 1.181 + frameLoader.tabParent.setIsDocShellActive(val); 1.182 + return val; 1.183 + ]]> 1.184 + </setter> 1.185 + </property> 1.186 + 1.187 + <constructor> 1.188 + <![CDATA[ 1.189 + /* 1.190 + * Don't try to send messages from this function. The message manager for 1.191 + * the <browser> element may not be initialized yet. 1.192 + */ 1.193 + 1.194 + let jsm = "resource://gre/modules/RemoteWebNavigation.jsm"; 1.195 + let RemoteWebNavigation = Cu.import(jsm, {}).RemoteWebNavigation; 1.196 + this._remoteWebNavigation = new RemoteWebNavigation(this); 1.197 + 1.198 + this.messageManager.addMessageListener("Browser:Init", this); 1.199 + this.messageManager.addMessageListener("DOMTitleChanged", this); 1.200 + this.messageManager.addMessageListener("ImageDocumentLoaded", this); 1.201 + this.messageManager.addMessageListener("SetSyncHandler", this); 1.202 + this.messageManager.addMessageListener("DocumentInserted", this); 1.203 + this.messageManager.addMessageListener("FullZoomChange", this); 1.204 + this.messageManager.addMessageListener("TextZoomChange", this); 1.205 + this.messageManager.loadFrameScript("chrome://global/content/browser-child.js", true); 1.206 + 1.207 + if (this.hasAttribute("selectpopup")) { 1.208 + this.messageManager.addMessageListener("Forms:ShowDropDown", this); 1.209 + this.messageManager.addMessageListener("Forms:HideDropDown", this); 1.210 + this.messageManager.loadFrameScript("chrome://global/content/select-child.js", true); 1.211 + } 1.212 + 1.213 + jsm = "resource://gre/modules/RemoteController.jsm"; 1.214 + let RemoteController = Components.utils.import(jsm, {}).RemoteController; 1.215 + this._controller = new RemoteController(this); 1.216 + this.controllers.appendController(this._controller); 1.217 + 1.218 + jsm = "resource://gre/modules/RemoteAddonsParent.jsm"; 1.219 + let RemoteAddonsParent = Components.utils.import(jsm, {}).RemoteAddonsParent; 1.220 + RemoteAddonsParent.init(); 1.221 + ]]> 1.222 + </constructor> 1.223 + 1.224 + <method name="receiveMessage"> 1.225 + <parameter name="aMessage"/> 1.226 + <body><![CDATA[ 1.227 + let data = aMessage.data; 1.228 + switch (aMessage.name) { 1.229 + case "Browser:Init": 1.230 + let result = {}; 1.231 + result.useGlobalHistory = !this.hasAttribute("disableglobalhistory"); 1.232 + result.initPopup = this.autoCompletePopup; 1.233 + return result; 1.234 + break; 1.235 + case "DOMTitleChanged": 1.236 + this._contentTitle = data.title; 1.237 + break; 1.238 + case "ImageDocumentLoaded": 1.239 + this._imageDocument = { 1.240 + width: data.width, 1.241 + height: data.height 1.242 + }; 1.243 + break; 1.244 + 1.245 + case "SetSyncHandler": 1.246 + this._syncHandler = aMessage.objects.handler; 1.247 + break; 1.248 + 1.249 + case "Forms:ShowDropDown": { 1.250 + Cu.import("resource://gre/modules/SelectParentHelper.jsm"); 1.251 + let dropdown = document.getElementById(this.getAttribute("selectpopup")); 1.252 + SelectParentHelper.populate(dropdown, data.options, data.selectedIndex); 1.253 + SelectParentHelper.open(this, dropdown, data.rect); 1.254 + break; 1.255 + } 1.256 + 1.257 + case "DocumentInserted": 1.258 + this._isSyntheticDocument = data.synthetic; 1.259 + break; 1.260 + 1.261 + case "FullZoomChange": 1.262 + this._fullZoom = data.value; 1.263 + break; 1.264 + 1.265 + case "TextZoomChange": 1.266 + this._textZoom = data.value; 1.267 + break; 1.268 + 1.269 + case "Forms:HideDropDown": { 1.270 + Cu.import("resource://gre/modules/SelectParentHelper.jsm"); 1.271 + let dropdown = document.getElementById(this.getAttribute("selectpopup")); 1.272 + SelectParentHelper.hide(dropdown); 1.273 + break; 1.274 + } 1.275 + 1.276 + default: 1.277 + // Delegate to browser.xml. 1.278 + return this._receiveMessage(aMessage); 1.279 + break; 1.280 + } 1.281 + ]]></body> 1.282 + </method> 1.283 + 1.284 + <!-- 1.285 + For out-of-process code, event.screen[XY] is relative to the 1.286 + left/top of the content view. For in-process code, 1.287 + event.screen[XY] is relative to the left/top of the screen. We 1.288 + use this method to map screen coordinates received from a 1.289 + (possibly out-of-process) <browser> element to coordinates 1.290 + that are relative to the screen. This code handles the 1.291 + out-of-process case, where we need to translate by the screen 1.292 + position of the <browser> element. 1.293 + --> 1.294 + <method name="mapScreenCoordinatesFromContent"> 1.295 + <parameter name="aScreenX"/> 1.296 + <parameter name="aScreenY"/> 1.297 + <body> 1.298 + <![CDATA[ 1.299 + return { x: aScreenX + this.boxObject.screenX, 1.300 + y: aScreenY + this.boxObject.screenY }; 1.301 + ]]> 1.302 + </body> 1.303 + </method> 1.304 + 1.305 + </implementation> 1.306 + 1.307 + </binding> 1.308 + 1.309 +</bindings>