Skip to content

Commit 8b272b8

Browse files
committed
Implement crossmessaging
1 parent b747bfd commit 8b272b8

File tree

4 files changed

+35
-63
lines changed

4 files changed

+35
-63
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"webpack": "^1.12.2"
5151
},
5252
"dependencies": {
53+
"crossmessaging": "^0.1.1",
5354
"json-stringify-safe": "^5.0.1",
5455
"react": "^0.14.0",
5556
"react-dom": "^0.14.0",
Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { onConnect, onMessage, sendToTab } from 'crossmessaging';
12
import { MENU_DEVTOOLS } from '../../../app/constants/ContextMenus.js';
23
let connections = {};
34

@@ -8,35 +9,10 @@ function sendNAMessage(port) {
89
});
910
}
1011

11-
// Listen to messages sent from the DevTools page
12-
chrome.runtime.onConnect.addListener(function(port) {
13-
14-
function extensionListener(message) {
15-
if (message.name === 'init') {
16-
connections[message.tabId] = port;
17-
if (message.tabId !== store.tabId) {
18-
sendNAMessage(port);
19-
return;
20-
}
21-
connections[message.tabId].postMessage({
22-
payload: store.liftedStore.getState(),
23-
source: 'redux-page'
24-
});
25-
}
26-
}
27-
28-
port.onMessage.addListener(extensionListener);
29-
30-
port.onDisconnect.addListener(function(portDiscon) {
31-
portDiscon.onMessage.removeListener(extensionListener);
32-
33-
Object.keys(connections).forEach(function(id) {
34-
if (connections[id] === portDiscon) {
35-
delete connections[id];
36-
}
37-
});
38-
});
39-
});
12+
onConnect(() => ({
13+
payload: window.store.liftedStore.getState(),
14+
source: 'redux-page'
15+
}), {}, connections, window.store, sendNAMessage);
4016

4117
// Receive message from content script and relay to the devTools page
4218
function messaging(request, sender) {
@@ -48,7 +24,7 @@ function messaging(request, sender) {
4824
}
4925
if (request.payload) store.liftedStore.setState(request.payload);
5026
if (request.init) {
51-
store.tabId = tabId;
27+
store.id = tabId;
5228
if (typeof tabId === 'number') {
5329
chrome.contextMenus.update(MENU_DEVTOOLS, {documentUrlPatterns: [sender.url], enabled: true});
5430
chrome.pageAction.show(tabId);
@@ -61,15 +37,13 @@ function messaging(request, sender) {
6137
return true;
6238
}
6339

64-
chrome.runtime.onMessage.addListener(messaging);
40+
onMessage(messaging);
6541
chrome.runtime.onMessageExternal.addListener(messaging);
6642

6743
export function toContentScript(action) {
68-
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
69-
if (store.tabId in connections) {
70-
connections[ store.tabId ].postMessage({action: action});
71-
} else {
72-
chrome.tabs.sendMessage(store.tabId, {action: action});
73-
}
74-
});
44+
if (store.id in connections) {
45+
connections[ store.id ].postMessage({action: action});
46+
} else {
47+
sendToTab(store.id, {action: action});
48+
}
7549
}

src/browser/extension/devpanel/index.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import { connect } from 'crossmessaging';
12
import React from 'react';
23
import { render } from 'react-dom';
34
import Provider from '../../../app/containers/Provider';
45
import DevTools from '../../../app/containers/DevTools';
56
import createDevStore from '../../../app/store/createDevStore';
67

8+
const backgroundPageConnection = connect();
9+
710
function dispatch(action) {
811
chrome.devtools.inspectedWindow.eval(
912
'window.postMessage({' +
@@ -31,10 +34,6 @@ function showDevTools() {
3134
}
3235
}
3336

34-
const backgroundPageConnection = chrome.runtime.connect({
35-
name: 'panel'
36-
});
37-
3837
backgroundPageConnection.onMessage.addListener((message) => {
3938
if (message.na) {
4039
render(

src/browser/extension/inject/contentScript.js

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
1+
import { onMessage, sendToBg } from 'crossmessaging';
12
let payload;
3+
let sendMessage;
24

3-
const sendMessage = (
4-
window.devToolsExtensionID ?
5-
function(message) {
6-
chrome.runtime.sendMessage(window.devToolsExtensionID, message);
7-
}
8-
: chrome.runtime.sendMessage
9-
);
5+
// Relay background script massages to the page script
6+
onMessage((message) => {
7+
if (message.action) {
8+
window.postMessage({
9+
type: 'ACTION',
10+
payload: message.action,
11+
source: 'redux-cs'
12+
}, '*');
13+
}
14+
});
15+
16+
if (window.devToolsExtensionID) { // Send external messages
17+
sendMessage = function(message) {
18+
chrome.runtime.sendMessage(window.devToolsExtensionID, message);
19+
};
20+
} else {
21+
sendMessage = sendToBg;
1022

11-
if (!window.devToolsExtensionID) {
1223
let s = document.createElement('script');
1324
s.src = chrome.extension.getURL('js/page.bundle.js');
1425
s.onload = function() {
@@ -35,19 +46,6 @@ window.addEventListener('message', function(event) {
3546
sendMessage(message);
3647
});
3748

38-
// Request from the background script to send actions to the page
39-
if (chrome.runtime.onMessage) {
40-
chrome.runtime.onMessage.addListener((message) => {
41-
if (message.action) {
42-
window.postMessage({
43-
type: 'ACTION',
44-
payload: message.action,
45-
source: 'redux-cs'
46-
}, '*');
47-
}
48-
});
49-
}
50-
5149
if (typeof window.onbeforeunload !== 'undefined') {
5250
// Prevent adding beforeunload listener for Chrome apps
5351
window.onbeforeunload = function() {

0 commit comments

Comments
 (0)