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
|
"use strict";
function e(id) {
return document.getElementById(id);
}
/**
* Send message to main extension for HTML to display
* @param type: enable/disable
*/
function sendMessage(type) {
chrome.runtime.sendMessage({
type: type,
tabId: chrome.devtools.inspectedWindow.tabId,
});
}
/**
* Turn on the Switch Planner recording mode, and hide the long description.
*/
function enableSwitchPlanner() {
sendMessage("enable");
e("SwitchPlannerDescription").style.display = "none";
e("SwitchPlannerDetails").style.display = "block";
// Hack: Fetch and display summary information from background page
// once per second.
setInterval(display, 1000);
chrome.devtools.inspectedWindow.reload();
}
/**
* Disable the switch planner and reload, so any state is forgotten and
* the long description is restored.
*/
function disableSwitchPlanner() {
sendMessage("disable");
document.location.reload();
}
/**
* Fetch summary HTML of the planner results from the background page for
* display in the devtools panel.
*/
function display() {
chrome.runtime.sendMessage({
type: "getHosts",
tabId: chrome.devtools.inspectedWindow.tabId,
}, function(response) {
var switch_planner_details = e("SwitchPlannerDetails");
while (switch_planner_details.firstChild) {
switch_planner_details.removeChild(switch_planner_details.firstChild);
}
var nrw_text_div = document.createElement("div");
nrw_text_div.innerText = "Unrewritten HTTP resources loaded from this tab (enable HTTPS on these domains and add them to HTTPS Everywhere):"
var nrw_div = switchPlannerSmallHtmlSection(response.nrw);
var rw_text_div = document.createElement("div");
rw_text_div.style.marginTop = "20px";
rw_text_div.innerText = "Resources rewritten successfully from this tab (update these in your source code):"
var rw_div = switchPlannerSmallHtmlSection(response.rw);
switch_planner_details.appendChild(nrw_text_div);
switch_planner_details.appendChild(nrw_div);
switch_planner_details.appendChild(rw_text_div);
switch_planner_details.appendChild(rw_div);
e("SwitchPlannerResults").style.display = "block";
});
}
/**
* Format the switch planner output for presentation to a user.
* */
function switchPlannerSmallHtmlSection(asset_host_list) {
var wrapper_div = document.createElement("div");
if (asset_host_list.length == 0) {
wrapper_div.style.fontWeight = "bold";
wrapper_div.innerText = "none";
return wrapper_div;
}
for (var i = asset_host_list.length - 1; i >= 0; i--) {
var host = asset_host_list[i][3];
var activeCount = asset_host_list[i][1];
var passiveCount = asset_host_list[i][2];
var div = document.createElement("div");
var b = document.createElement("b");
b.innerText = host;
div.appendChild(b);
var text_arr = [];
if (activeCount > 0) {
text_arr.push(activeCount + " active");
}
if (passiveCount > 0) {
text_arr.push(passiveCount + " passive");
}
div.appendChild(document.createTextNode(": " + text_arr.join(', ')));
wrapper_div.appendChild(div);
}
return wrapper_div;
}
window.onload = function() {
// Open a connection to the background page. Right now this is only used
// by the background page so it knows when the devtools pane has closed.
// We don't receive messages from the background page currently, though that
// may be a future improvement. Sending messages to the background page doesn't
// require an existing connection.
chrome.runtime.connect({ name: "devtools-page" });
var checkbox = e("SwitchPlannerCheckbox");
checkbox.addEventListener("change", function() {
if (checkbox.checked) {
enableSwitchPlanner();
} else {
disableSwitchPlanner();
}
});
e("SwitchPlannerDetailsLink").addEventListener("click", function() {
window.open("switch-planner.html?tab=" + chrome.devtools.inspectedWindow.tabId);
});
// Since this is rendered in a devtools console, we have to make clicks on the
// link open a new window.
e("MixedContentLink").addEventListener("click", function(e) {
window.open(e.target.href);
});
};
|