Bug 1692971 [wpt PR 27638] - WebKit export of https://bugs.webkit.org/show_bug.cgi...
[gecko.git] / toolkit / actors / TestWindowChild.jsm
blobb233dfd9bb0df71cecf282efad049c9afecdc60a
1 /* vim: set ts=2 sw=2 sts=2 et tw=80: */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
9 var EXPORTED_SYMBOLS = ["TestWindowChild"];
11 var docShellThunks = new Map();
13 class TestWindowChild extends JSWindowActorChild {
14   constructor() {
15     super();
16     this.sawActorCreated = false;
18     try {
19       void this.contentWindow;
20     } catch (e) {
21       this.uninitializedGetterError = e;
22     }
23   }
25   actorCreated() {
26     this.sawActorCreated = true;
27   }
29   receiveMessage(aMessage) {
30     switch (aMessage.name) {
31       case "toChild":
32         aMessage.data.toChild = true;
33         this.sendAsyncMessage("toParent", aMessage.data);
34         break;
35       case "asyncAdd":
36         let { a, b } = aMessage.data;
37         return new Promise(resolve => {
38           resolve({ result: a + b });
39         });
40       case "error":
41         return Promise.reject(new SyntaxError(aMessage.data.message));
42       case "exception":
43         return Promise.reject(
44           Components.Exception(aMessage.data.message, aMessage.data.result)
45         );
46       case "done":
47         this.done(aMessage.data);
48         break;
49       case "noncloneReply":
50         // Return a value which is non-cloneable, like a WindowProxy.
51         return this.contentWindow;
52       case "storeActor":
53         docShellThunks.set(this.docShell, this);
54         break;
55       case "checkActor": {
56         let actor = docShellThunks.get(this.docShell);
57         docShellThunks.delete(this.docShell);
59         let contentWindow;
60         let error;
61         try {
62           contentWindow = actor.contentWindow;
63         } catch (e) {
64           error = e;
65         }
66         if (error) {
67           return {
68             status: "error",
69             errorType: error.name,
70           };
71         }
72         return {
73           status: "success",
74           valueIsNull: contentWindow === null,
75         };
76       }
77     }
79     return undefined;
80   }
82   handleEvent(aEvent) {
83     this.sendAsyncMessage("event", { type: aEvent.type });
84   }
86   observe(subject, topic, data) {
87     switch (topic) {
88       case "audio-playback":
89         this.done({ subject, topic, data });
90         break;
91       default:
92         this.lastObserved = { subject, topic, data };
93         break;
94     }
95   }
97   show() {
98     return "TestWindowChild";
99   }
101   didDestroy() {
102     Services.obs.notifyObservers(this, "test-js-window-actor-diddestroy", true);
103   }