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

Commit ec7aaa3

Browse files
committed
Merge pull request #117 from facebook/firefox-load-fix
Firefox load fix
2 parents e303b2e + 896ee83 commit ec7aaa3

File tree

5 files changed

+77
-36
lines changed

5 files changed

+77
-36
lines changed

shells/firefox/data/panel.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323
background-color: white;
2424
font-family: sans-serif;
2525
}
26-
#container h1 {
26+
#message {
2727
margin: 20px auto;
28+
color: #ccc;
2829
}
2930
#logs {
3031
position: fixed;

shells/firefox/main/ReactPanel.js

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,33 +28,51 @@ 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.port.on('unload', function () {
50+
metaAddonSide.postMessage('unload');
51+
});
52+
worker.on('error', function (error) {
53+
console.log('More Error!!', error);
54+
});
55+
worker.port.on('error', function (error) {
56+
console.log('Error!!', error);
57+
});
58+
return worker;
59+
}
60+
4161
addonSide.onmessage = function (evt) {
4262
worker.port.emit('message', evt.data);
4363
};
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);
64+
65+
const metaChannel = new MessageChannel();
66+
const metaAddonSide = metaChannel.port1;
67+
const metaPanelSide = metaChannel.port2;
68+
69+
let mainPort = this.port;
70+
tabs.activeTab.on('pageshow', function () {
71+
metaAddonSide.postMessage('show');
72+
worker = makeWorker();
5573
});
5674

57-
this.postMessage('port', [panelSide]);
75+
this.postMessage('port', [panelSide, metaPanelSide]);
5876
console.log('Panel ready');
5977
},
6078
});

shells/firefox/panel/run.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,18 @@ 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 === 'unload') {
36+
node.innerHTML = '<h1 id="message">Looking for React</h1>';
37+
} else if (evt.data.type === 'hasReact') {
38+
if (evt.data.val) {
39+
React.render(<Panel alreadyFoundReact={true} {...config} />, node);
40+
} else {
41+
node.innerHTML = '<h1 id="message">No react found on page...</h1>';
42+
}
3643
}
3744
};
3845
});

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: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,34 @@ if (Object.keys(unsafeWindow.__REACT_DEVTOOLS_GLOBAL_HOOK__._renderers).length)
2222
self.port.emit('hasReact', false);
2323
}
2424

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

2849
node.onload = function () {
2950
window.postMessage({source: 'react-devtools-reporter'}, '*');
3051

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-
});
52+
connectToBackend();
4553
node.parentNode.removeChild(node);
4654
};
4755

0 commit comments

Comments
 (0)