1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { JSONHandler } = ChromeUtils.importESModule(
"chrome://remote/content/cdp/JSONHandler.sys.mjs"
);
// Get list of supported routes from JSONHandler
const routes = Object.keys(new JSONHandler().routes);
add_task(async function json_version() {
const { userAgent } = Cc[
"@mozilla.org/network/protocol;1?name=http"
].getService(Ci.nsIHttpProtocolHandler);
const json = await requestJSON("/json/version");
is(
json.Browser,
`${Services.appinfo.name}/${Services.appinfo.version}`,
"Browser name and version found"
);
is(json["Protocol-Version"], "1.3", "Protocol version found");
is(json["User-Agent"], userAgent, "User agent found");
is(json["V8-Version"], "1.0", "V8 version found");
is(json["WebKit-Version"], "1.0", "Webkit version found");
is(
json.webSocketDebuggerUrl,
RemoteAgent.cdp.targetList.getMainProcessTarget().wsDebuggerURL,
"Websocket URL for main process target found"
);
});
add_task(async function check_routes() {
for (const route of routes) {
// Check request succeeded (200) and responded with valid JSON
info(`Checking ${route}`);
await requestJSON(route);
info(`Checking ${route + "/"}`);
await requestJSON(route + "/");
}
});
add_task(async function json_list({ client }) {
const { Target } = client;
const { targetInfos } = await Target.getTargets();
const json = await requestJSON("/json/list");
const jsonAlias = await requestJSON("/json");
Assert.deepEqual(json, jsonAlias, "/json/list and /json return the same");
ok(Array.isArray(json), "Target list is an array");
is(
json.length,
targetInfos.length,
"Targets as listed on /json/list are equal to Target.getTargets"
);
for (let i = 0; i < json.length; i++) {
const jsonTarget = json[i];
const wsTarget = targetInfos[i];
is(
jsonTarget.id,
wsTarget.targetId,
"Target id matches between HTTP and Target.getTargets"
);
is(
jsonTarget.type,
wsTarget.type,
"Target type matches between HTTP and Target.getTargets"
);
is(
jsonTarget.url,
wsTarget.url,
"Target url matches between HTTP and Target.getTargets"
);
// Ensure expected values specifically for JSON endpoint
// and that type is always "page" as main process target should not be included
is(
jsonTarget.type,
"page",
`Target (${jsonTarget.id}) from list has expected type (page)`
);
is(
jsonTarget.webSocketDebuggerUrl,
`ws://${RemoteAgent.debuggerAddress}/devtools/page/${wsTarget.targetId}`,
`Target (${jsonTarget.id}) from list has expected webSocketDebuggerUrl value`
);
}
});
add_task(async function json_prevent_load_in_iframe({ client }) {
const { Page } = client;
const PAGE = `https://example.com/document-builder.sjs?html=${encodeURIComponent(
'<iframe src="http://localhost:9222/json/version"></iframe>`'
)}`;
await Page.enable();
const NAVIGATED = "Page.frameNavigated";
const history = new RecordEvents(2);
history.addRecorder({
event: Page.frameNavigated,
eventName: NAVIGATED,
messageFn: payload => {
return `Received ${NAVIGATED} for frame id ${payload.frame.id}`;
},
});
await loadURL(PAGE);
const frameNavigatedEvents = await history.record();
const frames = frameNavigatedEvents
.map(({ payload }) => payload.frame)
.filter(frame => frame.parentId !== undefined);
const windowGlobal = BrowsingContext.get(frames[0].id).currentWindowGlobal;
ok(
windowGlobal.documentURI.spec.startsWith("about:neterror?e=cspBlocked"),
"Expected page not be loaded within an iframe"
);
});
async function requestJSON(path) {
const response = await fetch(`http://${RemoteAgent.debuggerAddress}${path}`);
is(response.status, 200, "JSON response is 200");
return response.json();
}
|