Skip to content

Commit 15762ba

Browse files
Merge pull request #326 from preactjs/multi-render
2 parents d2612d9 + a4e8225 commit 15762ba

File tree

6 files changed

+88
-195
lines changed

6 files changed

+88
-195
lines changed

src/adapter/MultiRenderer.ts

Lines changed: 0 additions & 138 deletions
This file was deleted.

src/adapter/adapter/adapter.ts

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { DevtoolEvents, DevtoolsHook } from "../hook";
2-
import { Renderer } from "../renderer";
2+
import { getRendererByVNodeId, Renderer } from "../renderer";
33
import { copyToClipboard } from "../../shells/shared/utils";
44
import { createPicker } from "./picker";
55
import { ID } from "../../view/store/types";
@@ -38,23 +38,32 @@ export interface InspectData {
3838
suspended: boolean;
3939
}
4040

41-
export function createAdapter(port: PortPageHook, renderer: Renderer) {
41+
export function createAdapter(
42+
port: PortPageHook,
43+
renderers: Map<number, Renderer>,
44+
) {
4245
const { listen, send } = port;
4346

44-
const highlight = createHightlighter(renderer);
47+
const forAll = (fn: (renderer: Renderer) => void) => {
48+
for (const r of renderers.values()) {
49+
fn(r);
50+
}
51+
};
52+
53+
const highlight = createHightlighter(id =>
54+
getRendererByVNodeId(renderers, id),
55+
);
4556

4657
const inspect = (id: ID) => {
47-
if (renderer.has(id)) {
48-
const data = renderer.inspect(id);
49-
if (data) {
50-
send("inspect-result", data);
51-
}
58+
const data = getRendererByVNodeId(renderers, id)?.inspect(id);
59+
if (data) {
60+
send("inspect-result", data);
5261
}
5362
};
5463

5564
const picker = createPicker(
5665
window,
57-
renderer,
66+
renderers,
5867
id => {
5968
highlight.highlight(id);
6069
if (id > -1) {
@@ -82,19 +91,17 @@ export function createAdapter(port: PortPageHook, renderer: Renderer) {
8291
});
8392

8493
listen("inspect", id => {
85-
if (id !== null && renderer.has(id)) {
86-
const res = renderer.findDomForVNode(id);
87-
if (res && res.length > 0) {
88-
(window as any).__PREACT_DEVTOOLS__.$0 = res[0];
89-
}
94+
if (id === null) return;
95+
const res = getRendererByVNodeId(renderers, id)?.findDomForVNode(id);
96+
97+
if (res && res.length > 0) {
98+
(window as any).__PREACT_DEVTOOLS__.$0 = res[0];
9099
}
91100
inspect(id);
92101
});
93102

94103
listen("log", e => {
95-
if (renderer.has(e.id)) {
96-
renderer.log(e.id, e.children);
97-
}
104+
getRendererByVNodeId(renderers, e.id)?.log(e.id, e.children);
98105
});
99106

100107
listen("highlight", id => {
@@ -110,7 +117,13 @@ export function createAdapter(port: PortPageHook, renderer: Renderer) {
110117

111118
const update = (data: DevtoolEvents["update"]) => {
112119
const { id, type, path, value } = data;
113-
renderer.update(id, type, path.split(".").slice(1), value);
120+
121+
getRendererByVNodeId(renderers, id)?.update(
122+
id,
123+
type,
124+
path.split(".").slice(1),
125+
value,
126+
);
114127

115128
// Notify all frontends that something changed
116129
inspect(id);
@@ -120,24 +133,27 @@ export function createAdapter(port: PortPageHook, renderer: Renderer) {
120133
listen("update-state", data => update({ ...data, type: "state" }));
121134
listen("update-context", data => update({ ...data, type: "context" }));
122135
listen("update-hook", data => {
123-
if (renderer.updateHook && data.meta) {
124-
renderer.updateHook(data.id, data.meta.index, data.value);
125-
}
136+
if (!data.meta) return;
137+
138+
getRendererByVNodeId(renderers, data.id)?.updateHook?.(
139+
data.id,
140+
data.meta.index,
141+
data.value,
142+
);
126143
});
127144

128145
listen("update-filter", data => {
129-
renderer.applyFilters(parseFilters(data));
146+
const filters = parseFilters(data);
147+
forAll(r => r.applyFilters(filters));
130148
});
131149

132-
listen("refresh", () => {
133-
if (renderer.refresh) {
134-
renderer.refresh();
135-
}
136-
});
150+
listen("refresh", () => forAll(r => r.refresh?.()));
137151

138152
// Profiler
139-
listen("start-profiling", options => renderer.startProfiling!(options));
140-
listen("stop-profiling", () => renderer.stopProfiling!());
153+
listen("start-profiling", options =>
154+
forAll(r => r.startProfiling?.(options)),
155+
);
156+
listen("stop-profiling", () => forAll(r => r.stopProfiling?.()));
141157
listen("reload-and-profile", options => {
142158
window.localStorage.setItem(PROFILE_RELOAD, JSON.stringify(options));
143159

@@ -152,8 +168,8 @@ export function createAdapter(port: PortPageHook, renderer: Renderer) {
152168
});
153169

154170
// Stats
155-
listen("start-stats-recording", renderer.startRecordStats!);
156-
listen("stop-stats-recording", renderer.stopRecordStats!);
171+
listen("start-stats-recording", () => forAll(r => r.startRecordStats?.()));
172+
listen("stop-stats-recording", () => forAll(r => r.stopRecordStats?.()));
157173
listen("reload-and-record-stats", () => {
158174
window.localStorage.setItem(STATS_RELOAD, "true");
159175

@@ -168,29 +184,27 @@ export function createAdapter(port: PortPageHook, renderer: Renderer) {
168184
});
169185

170186
listen("start-highlight-updates", () => {
171-
if (renderer.startHighlightUpdates) {
172-
renderer.startHighlightUpdates();
173-
}
187+
forAll(r => r.startHighlightUpdates?.());
174188
});
175189
listen("stop-highlight-updates", () => {
176-
if (renderer.stopHighlightUpdates) {
177-
renderer.stopHighlightUpdates();
178-
}
190+
forAll(r => r.stopHighlightUpdates?.());
179191
});
180192

181193
listen("load-host-selection", () => {
182194
const hook: DevtoolsHook = (window as any).__PREACT_DEVTOOLS__;
183195
const selected = hook.$0;
184196
if (selected) {
185-
const id = renderer.findVNodeIdForDom(selected);
186-
if (id > -1) {
187-
send("select-node", id);
188-
}
197+
forAll(r => {
198+
const id = r.findVNodeIdForDom(selected);
199+
if (id > -1) {
200+
send("select-node", id);
201+
}
202+
});
189203
}
190204
});
191205

192206
listen("view-source", id => {
193-
const vnode = renderer.getVNodeById(id);
207+
const vnode = getRendererByVNodeId(renderers, id)?.getVNodeById(id);
194208
const hook: DevtoolsHook = (window as any).__PREACT_DEVTOOLS__;
195209

196210
if (vnode && typeof vnode.type === "function") {
@@ -205,8 +219,6 @@ export function createAdapter(port: PortPageHook, renderer: Renderer) {
205219
});
206220

207221
listen("suspend", data => {
208-
if (renderer.suspend) {
209-
renderer.suspend(data.id, data.active);
210-
}
222+
getRendererByVNodeId(renderers, data.id)?.suspend?.(data.id, data.active);
211223
});
212224
}

src/adapter/adapter/highlight.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import { Highlighter, style } from "../../view/components/Highlighter";
88
* This module is responsible for displaying the transparent element overlay
99
* inside the user's web page.
1010
*/
11-
export function createHightlighter(renderer: Renderer) {
11+
export function createHightlighter(
12+
getRendererByVnodeId: (id: ID) => Renderer | null,
13+
) {
1214
/**
1315
* Reference to the DOM element that we'll render the selection highlighter
1416
* into. We'll cache it so that we don't unnecessarily re-create it when the
@@ -25,6 +27,11 @@ export function createHightlighter(renderer: Renderer) {
2527
}
2628

2729
function highlight(id: ID) {
30+
const renderer = getRendererByVnodeId(id);
31+
if (!renderer) {
32+
return destroyHighlight();
33+
}
34+
2835
const vnode = renderer.getVNodeById(id);
2936
if (!vnode) {
3037
return destroyHighlight();
@@ -47,9 +54,7 @@ export function createHightlighter(renderer: Renderer) {
4754
const node = getNearestElement(first);
4855
const nodeEnd = last ? getNearestElement(last) : null;
4956
if (node != null) {
50-
const label = renderer.getDisplayNameById
51-
? renderer.getDisplayNameById(id)
52-
: renderer.getDisplayName(vnode);
57+
const label = renderer.getDisplayName(vnode);
5358

5459
let size = measureNode(node);
5560
if (nodeEnd !== null) {

src/adapter/adapter/picker.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { debounce } from "../../shells/shared/utils";
33

44
export function createPicker(
55
window: Window,
6-
renderer: Renderer,
6+
renderers: Map<number, Renderer>,
77
onHover: (id: number) => void,
88
onStop: () => void,
99
) {
@@ -22,10 +22,15 @@ export function createPicker(
2222
e.preventDefault();
2323
e.stopPropagation();
2424
if (picking && e.target != null && lastTarget !== e.target) {
25-
const id = renderer.findVNodeIdForDom(e.target as any);
26-
if (id > -1 && lastId !== id) {
27-
onHover(id);
25+
let id = lastId;
26+
for (const r of renderers.values()) {
27+
id = r.findVNodeIdForDom(e.target as any);
28+
if (id > -1 && lastId !== id) {
29+
onHover(id);
30+
break;
31+
}
2832
}
33+
2934
lastTarget = e.target;
3035
lastId = id;
3136
}

0 commit comments

Comments
 (0)