Bug 1685680 [wpt PR 27099] - Add missing jsapi tests for wasm reference-types proposa...
[gecko.git] / browser / actors / LinkHandlerParent.jsm
bloba61a4dded0317d0a3f5c8b3828fb4bb041aee076
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 const EXPORTED_SYMBOLS = ["LinkHandlerParent"];
9 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
11 ChromeUtils.defineModuleGetter(
12   this,
13   "PlacesUIUtils",
14   "resource:///modules/PlacesUIUtils.jsm"
17 let gTestListeners = new Set();
19 class LinkHandlerParent extends JSWindowActorParent {
20   static addListenerForTests(listener) {
21     gTestListeners.add(listener);
22   }
24   static removeListenerForTests(listener) {
25     gTestListeners.delete(listener);
26   }
28   receiveMessage(aMsg) {
29     let browser = this.browsingContext.top.embedderElement;
30     if (!browser) {
31       return;
32     }
34     let win = browser.ownerGlobal;
36     let gBrowser = win.gBrowser;
38     switch (aMsg.name) {
39       case "Link:LoadingIcon":
40         if (!gBrowser) {
41           return;
42         }
44         if (aMsg.data.canUseForTab) {
45           let tab = gBrowser.getTabForBrowser(browser);
46           if (tab.hasAttribute("busy")) {
47             tab.setAttribute("pendingicon", "true");
48           }
49         }
51         this.notifyTestListeners("LoadingIcon", aMsg.data);
52         break;
54       case "Link:SetIcon":
55         // Cache the most recent icon and rich icon locally.
56         if (aMsg.data.canUseForTab) {
57           this.icon = aMsg.data;
58         } else {
59           this.richIcon = aMsg.data;
60         }
62         if (!gBrowser) {
63           return;
64         }
66         this.setIconFromLink(gBrowser, browser, aMsg.data);
68         this.notifyTestListeners("SetIcon", aMsg.data);
69         break;
71       case "Link:SetFailedIcon":
72         if (!gBrowser) {
73           return;
74         }
76         if (aMsg.data.canUseForTab) {
77           this.clearPendingIcon(gBrowser, browser);
78         }
80         this.notifyTestListeners("SetFailedIcon", aMsg.data);
81         break;
83       case "Link:AddSearch":
84         if (!gBrowser) {
85           return;
86         }
88         let tab = gBrowser.getTabForBrowser(browser);
89         if (!tab) {
90           break;
91         }
93         if (win.BrowserSearch) {
94           win.BrowserSearch.addEngine(
95             browser,
96             aMsg.data.engine,
97             Services.io.newURI(aMsg.data.url)
98           );
99         }
100         break;
101     }
102   }
104   notifyTestListeners(name, data) {
105     for (let listener of gTestListeners) {
106       listener(name, data);
107     }
108   }
110   clearPendingIcon(gBrowser, aBrowser) {
111     let tab = gBrowser.getTabForBrowser(aBrowser);
112     tab.removeAttribute("pendingicon");
113   }
115   setIconFromLink(
116     gBrowser,
117     browser,
118     { pageURL, originalURL, canUseForTab, expiration, iconURL, canStoreIcon }
119   ) {
120     let tab = gBrowser.getTabForBrowser(browser);
121     if (!tab) {
122       return;
123     }
125     if (canUseForTab) {
126       this.clearPendingIcon(gBrowser, browser);
127     }
129     let iconURI;
130     try {
131       iconURI = Services.io.newURI(iconURL);
132     } catch (ex) {
133       Cu.reportError(ex);
134       return;
135     }
136     if (iconURI.scheme != "data") {
137       try {
138         Services.scriptSecurityManager.checkLoadURIWithPrincipal(
139           browser.contentPrincipal,
140           iconURI,
141           Services.scriptSecurityManager.ALLOW_CHROME
142         );
143       } catch (ex) {
144         return;
145       }
146     }
147     if (canStoreIcon) {
148       try {
149         PlacesUIUtils.loadFavicon(
150           browser,
151           Services.scriptSecurityManager.getSystemPrincipal(),
152           Services.io.newURI(pageURL),
153           Services.io.newURI(originalURL),
154           expiration,
155           iconURI
156         );
157       } catch (ex) {
158         Cu.reportError(ex);
159       }
160     }
162     if (canUseForTab) {
163       gBrowser.setIcon(tab, iconURL, originalURL);
164     }
165   }