Skip to content

Commit

Permalink
Use WeakMap to get references by window
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Brain committed Apr 2, 2017
1 parent dd8f138 commit 06c205d
Show file tree
Hide file tree
Showing 21 changed files with 271 additions and 149 deletions.
2 changes: 1 addition & 1 deletion demo/bridge.htm
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
window.mockDomain = 'mock://foo.com';
</script>

<script src="../dist/post-robot.js"></script>
<script src="../dist/post-robot.ie.js"></script>
2 changes: 1 addition & 1 deletion demo/child.htm
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

</script>

<script src="../dist/post-robot.js"></script>
<script src="../dist/post-robot.ie.js"></script>


<button onclick="sendMessage()">post</button>
Expand Down
4 changes: 2 additions & 2 deletions demo/parent.htm
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<!DOCTYPE html>

<script src="../dist/post-robot.js"></script>
<script src="../dist/post-robot.ie.js"></script>

<button onclick="openWindow()">open</button>

<div id="messages"></div>

<script>
postRobot.openBridge('./bridge.htm', 'mock://foo.com');
postRobot.bridge.openBridge('./bridge.htm', 'mock://foo.com');

function openWindow() {
window.open('mock://foo.com|./child.htm', Math.random().toString().replace(/[^a-z0-9]+/g, ''));
Expand Down
1 change: 1 addition & 0 deletions karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ module.exports = function(config) {
query: {
presets: ['es2015'],
plugins: [
'transform-flow-strip-types',
'transform-object-rest-spread',
'syntax-object-rest-spread',
'transform-es3-property-literals',
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
"yargs": "^4.7.1"
},
"dependencies": {
"cross-domain-safe-weakmap": "^1.0.1",
"sync-browser-mocks": "^1.0.3"
}
}
8 changes: 4 additions & 4 deletions src/bridge/child.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@

import { SyncPromise as Promise } from 'sync-browser-mocks/src/promise';
import { CONSTANTS } from '../conf';
import { isSameDomain, getOpener, getFrames, util, getFrameByName } from '../lib';
import { isSameDomain, getOpener, getFrames, util, getFrameByName, weakMapMemoize } from '../lib';
import { receiveMessage } from '../drivers';

import { needsBridge, registerRemoteWindow, rejectRemoteSendMessage, registerRemoteSendMessage, getBridgeName } from './common';

function getRemoteBridgeForWindow(win) {
let awaitRemoteBridgeForWindow = weakMapMemoize(win => {
return Promise.try(() => {
for (let frame of getFrames(win)) {
try {
Expand Down Expand Up @@ -53,7 +53,7 @@ function getRemoteBridgeForWindow(win) {
return;
}
});
}
});

export function openTunnelToOpener() {
return Promise.try(() => {
Expand All @@ -70,7 +70,7 @@ export function openTunnelToOpener() {

registerRemoteWindow(opener);

return getRemoteBridgeForWindow(opener).then(bridge => {
return awaitRemoteBridgeForWindow(opener).then(bridge => {

if (!bridge) {
return rejectRemoteSendMessage(opener, new Error(`Can not register with opener: no bridge found in opener`));
Expand Down
13 changes: 5 additions & 8 deletions src/bridge/common.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

import { WeakMap } from 'cross-domain-safe-weakmap/src';

import { CONFIG, CONSTANTS } from '../conf';
import { util, promise, isSameDomain, isOpener, isSameTopWindow, getUserAgent, matchDomain } from '../lib';
import { global } from '../global';
Expand Down Expand Up @@ -72,19 +74,14 @@ export let documentBodyReady = new promise.Promise(resolve => {
}, 10);
});

global.remoteWindows = global.remoteWindows || [];
global.remoteWindows = global.remoteWindows || new WeakMap();

export function registerRemoteWindow(win, timeout = CONFIG.BRIDGE_TIMEOUT) {
let sendMessagePromise = new promise.Promise();
global.clean.push(global.remoteWindows, { win, sendMessagePromise });
global.clean.setItem(global.remoteWindows, win, { sendMessagePromise: new promise.Promise() });
}

export function findRemoteWindow(win) {
for (let i = 0; i < global.remoteWindows.length; i++) {
if (global.remoteWindows[i].win === win) {
return global.remoteWindows[i];
}
}
return global.remoteWindows.get(win);
}

export function registerRemoteSendMessage(win, domain, sendMessage) {
Expand Down
28 changes: 14 additions & 14 deletions src/bridge/parent.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@

import { WeakMap } from 'cross-domain-safe-weakmap/src';

import { CONFIG, CONSTANTS } from '../conf';
import { util, promise, log, onWindowReady, getFrameByName } from '../lib';
import { global } from '../global';
import { on } from '../interface';
import { receiveMessage } from '../drivers';

import { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';

global.bridges = global.bridges || {};

import { getBridgeName, documentBodyReady, registerRemoteSendMessage, registerRemoteWindow } from './common';
global.popupWindowsByWin = global.popupWindowsByWin || new WeakMap();
global.popupWindowsByName = global.popupWindowsByName || {};

function listenForRegister(source, domain) {
on(CONSTANTS.POST_MESSAGE_NAMES.OPEN_TUNNEL, { source, domain }, ({ origin, data }) => {
Expand All @@ -24,7 +29,7 @@ function listenForRegister(source, domain) {
throw new Error(`Register window expected to be passed sendMessage method`);
}

let winDetails = global.popupWindows[data.name];
let winDetails = global.popupWindowsByName[data.name];

if (!winDetails) {
throw new Error(`Window with name ${data.name} does not exist, or was not opened by this window`);
Expand Down Expand Up @@ -146,8 +151,6 @@ export function destroyBridges() {
return global.clean.run('bridgeFrames');
}

global.popupWindows = global.popupWindows || {};

let windowOpen = window.open;

window.open = function(url, name, options, last) {
Expand All @@ -169,23 +172,20 @@ window.open = function(url, name, options, last) {
}

if (name) {
global.clean.setItem(global.popupWindows, name, { win, domain });
let winOptions = { name, domain, win };
global.clean.setItem(global.popupWindowsByWin, win, winOptions);
global.clean.setItem(global.popupWindowsByName, name, winOptions);
}

return win;
};

export function linkUrl(win, url) {

for (let name of Object.keys(global.popupWindows)) {
let winOptions = global.popupWindows[name];
let winOptions = global.popupWindowsByWin.get(win);

if (winOptions.win === win) {
winOptions.domain = util.getDomainFromUrl(url);

registerRemoteWindow(win);

break;
}
if (winOptions) {
winOptions.domain = util.getDomainFromUrl(url);
registerRemoteWindow(win);
}
}
Loading

0 comments on commit 06c205d

Please sign in to comment.