Skip to content

Commit 4ba8162

Browse files
authored
Merge pull request GoogleChromeLabs#475 from MrMadClown/master
This might be a solution for GoogleChromeLabs#474
2 parents a44ed20 + 6370bef commit 4ba8162

File tree

4 files changed

+64
-10
lines changed

4 files changed

+64
-10
lines changed

src/comlink.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ export function expose(obj: any, ep: Endpoint = self as any) {
330330
returnValue = undefined;
331331
}
332332
break;
333+
default:
334+
return;
333335
}
334336
} catch (value) {
335337
returnValue = { value, [throwMarker]: 0 };

src/protocol.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface EventSource {
1717
listener: EventListenerOrEventListenerObject,
1818
options?: {}
1919
): void;
20+
2021
removeEventListener(
2122
type: string,
2223
listener: EventListenerOrEventListenerObject,
@@ -34,14 +35,15 @@ export interface PostMessageWithOrigin {
3435

3536
export interface Endpoint extends EventSource {
3637
postMessage(message: any, transfer?: Transferable[]): void;
38+
3739
start?: () => void;
3840
}
3941

4042
export const enum WireValueType {
41-
RAW,
42-
PROXY,
43-
THROW,
44-
HANDLER,
43+
RAW = "RAW",
44+
PROXY = "PROXY",
45+
THROW = "THROW",
46+
HANDLER = "HANDLER",
4547
}
4648

4749
export interface RawWireValue {
@@ -62,12 +64,12 @@ export type WireValue = RawWireValue | HandlerWireValue;
6264
export type MessageID = string;
6365

6466
export const enum MessageType {
65-
GET,
66-
SET,
67-
APPLY,
68-
CONSTRUCT,
69-
ENDPOINT,
70-
RELEASE,
67+
GET = "GET",
68+
SET = "SET",
69+
APPLY = "APPLY",
70+
CONSTRUCT = "CONSTRUCT",
71+
ENDPOINT = "ENDPOINT",
72+
RELEASE = "RELEASE",
7173
}
7274

7375
export interface GetMessage {

tests/fixtures/two-way-iframe.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script type="module">
2+
import * as Comlink from "/base/dist/esm/comlink.mjs";
3+
4+
const parentEndpoint = Comlink.windowEndpoint(self.parent);
5+
const wrappedParent = Comlink.wrap(parentEndpoint);
6+
7+
Comlink.expose(async (a, b) => {
8+
return a + (await wrappedParent(b));
9+
}, parentEndpoint);
10+
</script>

tests/two-way-iframe.comlink.test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* Copyright 2017 Google Inc. All Rights Reserved.
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
* http://www.apache.org/licenses/LICENSE-2.0
7+
* Unless required by applicable law or agreed to in writing, software
8+
* distributed under the License is distributed on an "AS IS" BASIS,
9+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
* See the License for the specific language governing permissions and
11+
* limitations under the License.
12+
*/
13+
14+
import * as Comlink from "/base/dist/esm/comlink.mjs";
15+
16+
describe("Comlink across iframes", function () {
17+
beforeEach(function () {
18+
this.ifr = document.createElement("iframe");
19+
this.ifr.sandbox.add("allow-scripts", "allow-same-origin");
20+
this.ifr.src = "/base/tests/fixtures/two-way-iframe.html";
21+
document.body.appendChild(this.ifr);
22+
return new Promise((resolve) => (this.ifr.onload = resolve));
23+
});
24+
25+
afterEach(function () {
26+
this.ifr.remove();
27+
});
28+
29+
it("can communicate both ways", async function () {
30+
let called = false;
31+
const iframe = Comlink.windowEndpoint(this.ifr.contentWindow);
32+
Comlink.expose((a) => {
33+
called = true;
34+
return ++a;
35+
}, iframe);
36+
const proxy = Comlink.wrap(iframe);
37+
expect(await proxy(1, 3)).to.equal(5);
38+
expect(called).to.equal(true);
39+
});
40+
});

0 commit comments

Comments
 (0)