-
Notifications
You must be signed in to change notification settings - Fork 1
/
content.js
139 lines (121 loc) · 3.93 KB
/
content.js
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
139
var annotations_local_enable = false;
// Now monitor the DOM for additions and substitute emoji into new nodes.
// @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver.
const observer = new MutationObserver((mutations) => {
var updateSelection = false;
mutations.forEach((mutation) => {
if (childOfId(mutation.target,"local_time_popup")==false)
updateSelection = true;
if (settings.feature_annotations || annotations_local_enable)
{
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
// This DOM change was new nodes being added. Run our substitution
// algorithm on each newly added node.
for (let i = 0; i < mutation.addedNodes.length; i++) {
const newNode = mutation.addedNodes[i];
replaceText(newNode);
}
}
else if (mutation.type==='characterData')
{
replaceText(mutation.target);
}
}
});
if (updateSelection) checkSelection();
});
function checkSelection(e)
{
if (settings.feature_tooltips==false) return;
var selection = window.getSelection();
if (selection.isCollapsed)
{
if (popup_div) popup_div.style.display = 'none';
return;
}
// selection starts or ends on the pop up, abort
if (childOfId(selection.anchorNode,"local_time_popup")) return;
if (childOfId(selection.focusNode,"local_time_popup")) return;
var selectionTxt = selection.toString();
var list = document.createElement("ul");
processText(selectionTxt, function (result, found) {
var node = document.createElement("li");
node.textContent = found[0]+ " → " + result;
list.appendChild(node);
});
if (!popup_div)
{
var popup_div_inner = document.createElement("div");
popup_div = document.createElement("div");
popup_div.id = "local_time_popup";
popup_div.style.zIndex = 999; // TODO: make top, check pages zIndex range
popup_div.appendChild(popup_div_inner);
document.body.appendChild(popup_div);
}
if (list.childElementCount > 0)
{
// (outer) div > (inner) div > ul
while (popup_div.lastChild.hasChildNodes())
popup_div.lastChild.removeChild(popup_div.lastChild.lastChild);
popup_div.lastChild.appendChild(list);
var getRange = selection.getRangeAt(0);
var getRect = getRange.getBoundingClientRect();
var w = Math.round(getRect.width);
if (w<200) w=200;
var l = Math.round(getRect.left + getRect.width/2 - w/2);
if (l<0) l=0;
popup_div.style.width = w + "px";
popup_div.style.top = (6+getRect.bottom) + "px";
popup_div.style.left = l + "px";
popup_div.style.display = 'block';
}
else
{
popup_div.style.display = 'none';
}
}
function processContent()
{
if (settings.feature_annotations)
replaceAllText();
observer.observe(document.body, {
childList: true,
subtree: true
});
window.addEventListener('mouseup', checkSelection );
}
function restoreOptions()
{
browser.storage.local.get('settings')
.then(gotOptions)
.then(processContent)
.catch(processContent);
}
function statusId(settings)
{
if (settings.feature_annotations)
return 1;
else if (annotations_local_enable)
return 2;
else if (settings.feature_tooltips)
return 3;
else
return 4;
}
function begin()
{
restoreOptions();
// listen for background script and trigger full replace
browser.runtime.onMessage.addListener(request => {
if (request.greeting=="toggle")
{
annotations_local_enable = !annotations_local_enable;
}
if (annotations_local_enable)
replaceAllText();
return Promise.resolve({
response: statusId(settings)
});
});
}
begin();