Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit a955d6f

Browse files
committed
[firefox] make devtools reload on page navigate
1 parent 8e3e128 commit a955d6f

File tree

4 files changed

+66
-35
lines changed

4 files changed

+66
-35
lines changed

shells/firefox/main/ReactPanel.js

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,33 +28,48 @@ const ReactPanel = Class({
2828
// this.debuggee = null;
2929
},
3030
onReady() {
31-
var tabs = require('sdk/tabs');
32-
var worker = tabs.activeTab.attach({
33-
contentScriptFile: 'build/contentScript.js',
34-
});
31+
const tabs = require('sdk/tabs');
32+
let worker = makeWorker();
3533

3634
const { MessageChannel } = require('sdk/messaging');
3735
const channel = new MessageChannel();
3836
const addonSide = channel.port1;
3937
const panelSide = channel.port2;
4038

39+
function makeWorker() {
40+
let worker = tabs.activeTab.attach({
41+
contentScriptFile: 'build/contentScript.js',
42+
});
43+
worker.port.on('message', function (data) {
44+
addonSide.postMessage(data);
45+
});
46+
worker.port.on('hasReact', function (hasReact) {
47+
metaAddonSide.postMessage({type: 'hasReact', val: hasReact});
48+
});
49+
worker.on('error', function (error) {
50+
console.log('More Error!!', error);
51+
});
52+
worker.port.on('error', function (error) {
53+
console.log('Error!!', error);
54+
});
55+
return worker;
56+
}
57+
4158
addonSide.onmessage = function (evt) {
4259
worker.port.emit('message', evt.data);
4360
};
44-
worker.port.on('message', function (data) {
45-
addonSide.postMessage(data);
46-
});
47-
worker.port.on('hasReact', function (hasReact) {
48-
addonSide.postMessage({hasReact});
49-
});
50-
worker.on('error', function (error) {
51-
console.log('More Error!!', error);
52-
});
53-
worker.port.on('error', function (error) {
54-
console.log('Error!!', error);
61+
62+
const metaChannel = new MessageChannel();
63+
const metaAddonSide = metaChannel.port1;
64+
const metaPanelSide = metaChannel.port2;
65+
66+
let mainPort = this.port;
67+
tabs.activeTab.on('pageshow', function () {
68+
metaAddonSide.postMessage('show');
69+
worker = makeWorker();
5570
});
5671

57-
this.postMessage('port', [panelSide]);
72+
this.postMessage('port', [panelSide, metaPanelSide]);
5873
console.log('Panel ready');
5974
},
6075
});

shells/firefox/panel/run.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,16 @@ function reload() {
2828

2929
window.addEventListener('message', function (event) {
3030
port = event.ports[0];
31-
port.onmessage = evt => {
32-
if (evt.data.hasReact === true) {
33-
React.render(<Panel alreadyFoundReact={true} {...config} />, node);
34-
} else {
35-
node.innerHTML = '<h1>No react found on page...</h1>';
31+
var metaPort = event.ports[1];
32+
metaPort.onmessage = evt => {
33+
if (evt.data === 'show') {
34+
reload();
35+
} else if (evt.data.type === 'hasReact') {
36+
if (evt.data.val) {
37+
React.render(<Panel alreadyFoundReact={true} {...config} />, node);
38+
} else {
39+
node.innerHTML = '<h1>No react found on page...</h1>';
40+
}
3641
}
3742
};
3843
});

shells/firefox/src/backend.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ var setupHighlighter = require('../../../frontend/Highlighter/setup');
1616

1717
var inject = require('../../../agent/inject');
1818

19+
// This is the case when the page has been loaded from cache, and so there's
20+
// already a reactDevtoolsAgent active. We need to kill it before we start.
21+
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent) {
22+
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.emit('shutdown');
23+
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.emit('shutdown');
24+
}
25+
1926
// TODO: check to see if we're in RN before doing this?
2027
setInterval(function () {
2128
// this is needed to force refresh on react native

shells/firefox/src/contentScript.js

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,30 @@ if (Object.keys(unsafeWindow.__REACT_DEVTOOLS_GLOBAL_HOOK__._renderers).length)
2222
self.port.emit('hasReact', false);
2323
}
2424

25+
function connectToBackend() {
26+
self.port.on('message', function (payload) {
27+
window.postMessage({
28+
source: 'react-devtools-reporter',
29+
payload: payload
30+
}, '*');
31+
});
32+
33+
window.addEventListener('message', function (evt) {
34+
if (!evt.data || evt.data.source !== 'react-devtools-bridge') {
35+
return;
36+
}
37+
38+
self.port.emit('message', evt.data.payload);
39+
});
40+
}
41+
2542
function injectBackend() {
2643
var node = document.createElement('script');
2744

2845
node.onload = function () {
2946
window.postMessage({source: 'react-devtools-reporter'}, '*');
3047

31-
self.port.on('message', function (payload) {
32-
window.postMessage({
33-
source: 'react-devtools-reporter',
34-
payload: payload
35-
}, '*');
36-
});
37-
38-
window.addEventListener('message', function (evt) {
39-
if (!evt.data || evt.data.source !== 'react-devtools-bridge') {
40-
return;
41-
}
42-
43-
self.port.emit('message', evt.data.payload);
44-
});
48+
connectToBackend();
4549
node.parentNode.removeChild(node);
4650
};
4751

0 commit comments

Comments
 (0)