Bug 1822393 - Consume GeckoView directly in Android Components for CI builds. r=owlis...
[gecko.git] / browser / actors / LinkHandlerParent.sys.mjs
blob5610c7122c028a71a2b370fbe1f2cba772607600
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 const lazy = {};
7 ChromeUtils.defineESModuleGetters(lazy, {
8   PlacesUIUtils: "resource:///modules/PlacesUIUtils.sys.mjs",
9 });
11 let gTestListeners = new Set();
13 export class LinkHandlerParent extends JSWindowActorParent {
14   static addListenerForTests(listener) {
15     gTestListeners.add(listener);
16   }
18   static removeListenerForTests(listener) {
19     gTestListeners.delete(listener);
20   }
22   receiveMessage(aMsg) {
23     let browser = this.browsingContext.top.embedderElement;
24     if (!browser) {
25       return;
26     }
28     let win = browser.ownerGlobal;
30     let gBrowser = win.gBrowser;
32     switch (aMsg.name) {
33       case "Link:LoadingIcon":
34         if (!gBrowser) {
35           return;
36         }
38         if (aMsg.data.canUseForTab) {
39           let tab = gBrowser.getTabForBrowser(browser);
40           if (tab.hasAttribute("busy")) {
41             tab.setAttribute("pendingicon", "true");
42           }
43         }
45         this.notifyTestListeners("LoadingIcon", aMsg.data);
46         break;
48       case "Link:SetIcon":
49         // Cache the most recent icon and rich icon locally.
50         if (aMsg.data.canUseForTab) {
51           this.icon = aMsg.data;
52         } else {
53           this.richIcon = aMsg.data;
54         }
56         if (!gBrowser) {
57           return;
58         }
60         this.setIconFromLink(gBrowser, browser, aMsg.data);
62         this.notifyTestListeners("SetIcon", aMsg.data);
63         break;
65       case "Link:SetFailedIcon":
66         if (!gBrowser) {
67           return;
68         }
70         if (aMsg.data.canUseForTab) {
71           this.clearPendingIcon(gBrowser, browser);
72         }
74         this.notifyTestListeners("SetFailedIcon", aMsg.data);
75         break;
77       case "Link:AddSearch":
78         if (!gBrowser) {
79           return;
80         }
82         let tab = gBrowser.getTabForBrowser(browser);
83         if (!tab) {
84           break;
85         }
87         if (win.BrowserSearch) {
88           win.BrowserSearch.addEngine(browser, aMsg.data.engine);
89         }
90         break;
91     }
92   }
94   notifyTestListeners(name, data) {
95     for (let listener of gTestListeners) {
96       listener(name, data);
97     }
98   }
100   clearPendingIcon(gBrowser, aBrowser) {
101     let tab = gBrowser.getTabForBrowser(aBrowser);
102     tab.removeAttribute("pendingicon");
103   }
105   setIconFromLink(
106     gBrowser,
107     browser,
108     {
109       pageURL,
110       originalURL,
111       canUseForTab,
112       expiration,
113       iconURL,
114       canStoreIcon,
115       beforePageShow,
116     }
117   ) {
118     let tab = gBrowser.getTabForBrowser(browser);
119     if (!tab) {
120       return;
121     }
123     if (canUseForTab) {
124       this.clearPendingIcon(gBrowser, browser);
125     }
127     let iconURI;
128     try {
129       iconURI = Services.io.newURI(iconURL);
130     } catch (ex) {
131       console.error(ex);
132       return;
133     }
134     if (iconURI.scheme != "data") {
135       try {
136         Services.scriptSecurityManager.checkLoadURIWithPrincipal(
137           browser.contentPrincipal,
138           iconURI,
139           Services.scriptSecurityManager.ALLOW_CHROME
140         );
141       } catch (ex) {
142         return;
143       }
144     }
145     if (canStoreIcon) {
146       try {
147         lazy.PlacesUIUtils.loadFavicon(
148           browser,
149           Services.scriptSecurityManager.getSystemPrincipal(),
150           Services.io.newURI(pageURL),
151           Services.io.newURI(originalURL),
152           expiration,
153           iconURI
154         );
155       } catch (ex) {
156         console.error(ex);
157       }
158     }
160     if (canUseForTab) {
161       gBrowser.setIcon(tab, iconURL, originalURL, null, beforePageShow);
162     }
163   }