Skip to content

Commit 1fbbff3

Browse files
committed
flow: Add MouseEvent type
Use a little `desctructuring`-type of a trick to hint to Flow that we already ensured the `target` prop is the correct type.
1 parent 0fb679a commit 1fbbff3

File tree

1 file changed

+65
-31
lines changed

1 file changed

+65
-31
lines changed

src/webview/js/generatedEs3.js

+65-31
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var arrayFrom = function arrayFrom(arrayLike) {
1414
};
1515
1616
var documentBody = document.body;
17+
1718
if (!documentBody) {
1819
throw new Error('No document.body element!');
1920
}
@@ -31,13 +32,16 @@ var sendMessage = function sendMessage(msg) {
3132
window.onerror = function (message, source, line, column, error) {
3233
if (window.enableWebViewErrorDisplay) {
3334
var elementJsError = document.getElementById('js-error-detailed');
35+
3436
if (elementJsError) {
35-
elementJsError.innerHTML = ['Message: ' + message, 'Source: ' + source, 'Line: ' + line + ':' + column, 'Error: ' + JSON.stringify(error), ''].map(escapeHtml).join('<br>');
37+
elementJsError.innerHTML = ["Message: " + message, "Source: " + source, "Line: " + line + ":" + column, "Error: " + JSON.stringify(error), ''].map(escapeHtml).join('<br>');
3638
}
3739
} else {
3840
var _elementJsError = document.getElementById('js-error-plain');
41+
3942
var elementSheetGenerated = document.getElementById('generated-styles');
4043
var elementSheetHide = document.getElementById('style-hide-js-error-plain');
44+
4145
if (_elementJsError && elementSheetGenerated && elementSheetHide && elementSheetHide instanceof HTMLStyleElement && elementSheetHide.sheet && elementSheetGenerated instanceof HTMLStyleElement && elementSheetGenerated.sheet) {
4246
elementSheetHide.sheet.disabled = true;
4347
var _height = _elementJsError.offsetHeight;
@@ -56,12 +60,12 @@ window.onerror = function (message, source, line, column, error) {
5660
error: error
5761
}
5862
});
59-
6063
return true;
6164
};
6265
6366
var showHideElement = function showHideElement(elementId, show) {
6467
var element = document.getElementById(elementId);
68+
6569
if (element) {
6670
element.classList.toggle('hidden', !show);
6771
}
@@ -70,31 +74,36 @@ var showHideElement = function showHideElement(elementId, show) {
7074
var height = documentBody.clientHeight;
7175
window.addEventListener('resize', function (event) {
7276
var difference = height - documentBody.clientHeight;
77+
7378
if (documentBody.scrollHeight !== documentBody.scrollTop + documentBody.clientHeight) {
74-
window.scrollBy({ left: 0, top: difference });
79+
window.scrollBy({
80+
left: 0,
81+
top: difference
82+
});
7583
}
84+
7685
height = documentBody.clientHeight;
7786
});
7887
7988
var getMessageNode = function getMessageNode(node) {
8089
var curNode = node;
90+
8191
while (curNode && curNode.parentNode && curNode.parentNode !== documentBody) {
8292
curNode = curNode.parentNode;
8393
}
94+
8495
return curNode;
8596
};
8697
8798
var getMessageIdFromNode = function getMessageIdFromNode(node) {
8899
var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
89-
90100
var msgNode = getMessageNode(node);
91101
return msgNode && msgNode instanceof Element ? +msgNode.getAttribute('data-msg-id') : defaultValue;
92102
};
93103
94104
var getStartAndEndNodes = function getStartAndEndNodes() {
95105
var startNode = getMessageNode(document.elementFromPoint(200, 20));
96106
var endNode = getMessageNode(document.elementFromPoint(200, window.innerHeight - 20));
97-
98107
return {
99108
start: getMessageIdFromNode(startNode, Number.MAX_SAFE_INTEGER),
100109
end: getMessageIdFromNode(endNode, 0)
@@ -105,10 +114,8 @@ var prevNodes = getStartAndEndNodes();
105114
106115
var sendScrollMessage = function sendScrollMessage() {
107116
var currentNodes = getStartAndEndNodes();
108-
109117
sendMessage({
110118
type: 'scroll',
111-
112119
offsetHeight: documentBody.offsetHeight,
113120
innerHeight: window.innerHeight,
114121
scrollY: window.scrollY,
@@ -125,27 +132,30 @@ var sendScrollMessageIfListShort = function sendScrollMessageIfListShort() {
125132
};
126133
127134
var scrollEventsDisabled = true;
128-
129135
var lastTouchEventTimestamp = 0;
130136
var lastTouchPositionX = -1;
131137
var lastTouchPositionY = -1;
132138
133139
var handleScrollEvent = function handleScrollEvent() {
134140
lastTouchEventTimestamp = 0;
141+
135142
if (scrollEventsDisabled) {
136143
return;
137144
}
138145
139146
sendScrollMessage();
140-
141147
var nearEnd = documentBody.offsetHeight - window.scrollY - window.innerHeight > 100;
142148
showHideElement('scroll-bottom', nearEnd);
143149
};
144150
145151
window.addEventListener('scroll', handleScrollEvent);
146152
147153
var scrollToBottom = function scrollToBottom() {
148-
window.scroll({ left: 0, top: documentBody.scrollHeight, behavior: 'smooth' });
154+
window.scroll({
155+
left: 0,
156+
top: documentBody.scrollHeight,
157+
behavior: 'smooth'
158+
});
149159
};
150160
151161
var isNearBottom = function isNearBottom() {
@@ -159,30 +169,45 @@ var scrollToBottomIfNearEnd = function scrollToBottomIfNearEnd() {
159169
};
160170
161171
var scrollToAnchor = function scrollToAnchor(anchor) {
162-
var anchorNode = document.getElementById('msg-' + anchor);
172+
var anchorNode = document.getElementById("msg-" + anchor);
163173
164174
if (anchorNode) {
165-
anchorNode.scrollIntoView({ block: 'start' });
175+
anchorNode.scrollIntoView({
176+
block: 'start'
177+
});
166178
} else {
167-
window.scroll({ left: 0, top: documentBody.scrollHeight + 200 });
179+
window.scroll({
180+
left: 0,
181+
top: documentBody.scrollHeight + 200
182+
});
168183
}
169184
};
170185
171186
var findPreserveTarget = function findPreserveTarget() {
172187
var msgNode = getMessageNode(document.elementFromPoint(200, 50));
188+
173189
if (!msgNode || !(msgNode instanceof HTMLElement)) {
174-
return { type: 'none' };
190+
return {
191+
type: 'none'
192+
};
175193
}
194+
176195
var msgId = getMessageIdFromNode(msgNode);
177196
var prevBoundRect = msgNode.getBoundingClientRect();
178-
return { type: 'preserve', msgId: msgId, prevBoundTop: prevBoundRect.top };
197+
return {
198+
type: 'preserve',
199+
msgId: msgId,
200+
prevBoundTop: prevBoundRect.top
201+
};
179202
};
180203
181204
var scrollToPreserve = function scrollToPreserve(msgId, prevBoundTop) {
182-
var newElement = document.getElementById('msg-' + msgId);
205+
var newElement = document.getElementById("msg-" + msgId);
206+
183207
if (!newElement) {
184208
return;
185209
}
210+
186211
var newBoundRect = newElement.getBoundingClientRect();
187212
window.scrollBy(0, newBoundRect.top - prevBoundTop);
188213
};
@@ -195,29 +220,37 @@ var appendAuthToImages = function appendAuthToImages(auth) {
195220
}
196221
197222
var srcPath = img.src.substring(auth.realm.length);
223+
198224
if (!(srcPath.startsWith('/user_uploads/') || srcPath.startsWith('/thumbnail?'))) {
199225
return;
200226
}
201227
202228
var delimiter = img.src.includes('?') ? '&' : '?';
203-
img.src += delimiter + 'api_key=' + auth.apiKey;
229+
img.src += delimiter + "api_key=" + auth.apiKey;
204230
});
205231
};
206232
207233
var handleMessageContent = function handleMessageContent(msg) {
208-
var target = void 0;
234+
var target;
235+
209236
if (msg.updateStrategy === 'replace') {
210-
target = { type: 'none' };
237+
target = {
238+
type: 'none'
239+
};
211240
} else if (msg.updateStrategy === 'scroll-to-anchor') {
212-
target = { type: 'anchor', anchor: msg.anchor };
241+
target = {
242+
type: 'anchor',
243+
anchor: msg.anchor
244+
};
213245
} else if (msg.updateStrategy === 'scroll-to-bottom-if-near-bottom' && isNearBottom()) {
214-
target = { type: 'bottom' };
246+
target = {
247+
type: 'bottom'
248+
};
215249
} else {
216250
target = findPreserveTarget();
217251
}
218252
219253
documentBody.innerHTML = msg.content;
220-
221254
appendAuthToImages(msg.auth);
222255
223256
if (target.type === 'bottom') {
@@ -246,6 +279,7 @@ var handleMessageFetching = function handleMessageFetching(msg) {
246279
247280
var handleMessageTyping = function handleMessageTyping(msg) {
248281
var elementTyping = document.getElementById('typing');
282+
249283
if (elementTyping) {
250284
elementTyping.innerHTML = msg.content;
251285
setTimeout(function () {
@@ -259,25 +293,20 @@ var messageHandlers = {
259293
fetching: handleMessageFetching,
260294
typing: handleMessageTyping
261295
};
262-
263296
document.addEventListener('message', function (e) {
264297
scrollEventsDisabled = true;
265-
266298
var decodedData = decodeURIComponent(escape(window.atob(e.data)));
267299
var messages = JSON.parse(decodedData);
268300
messages.forEach(function (msg) {
269301
messageHandlers[msg.type](msg);
270302
});
271303
scrollEventsDisabled = false;
272304
});
273-
274305
documentBody.addEventListener('click', function (e) {
275306
e.preventDefault();
276307
lastTouchEventTimestamp = 0;
277-
278308
var target = e.target;
279309
280-
281310
if (!(target instanceof HTMLElement)) {
282311
return;
283312
}
@@ -305,6 +334,7 @@ documentBody.addEventListener('click', function (e) {
305334
}
306335
307336
var inlineImageLink = target.closest('.message_inline_image a');
337+
308338
if (inlineImageLink && !inlineImageLink.closest('.youtube-video, .vimeo-video')) {
309339
sendMessage({
310340
type: 'image',
@@ -349,8 +379,11 @@ var handleLongPress = function handleLongPress(target) {
349379
return;
350380
}
351381
352-
lastTouchEventTimestamp = 0;
382+
if (!(e.target instanceof Element)) {
383+
return;
384+
}
353385
386+
lastTouchEventTimestamp = 0;
354387
sendMessage({
355388
type: 'longPress',
356389
target: target.matches('.header') ? 'header' : 'message',
@@ -386,21 +419,22 @@ documentBody.addEventListener('touchend', function (e) {
386419
lastTouchEventTimestamp = Date.now();
387420
}
388421
});
389-
390422
documentBody.addEventListener('touchmove', function (e) {
391423
lastTouchEventTimestamp = 0;
392424
});
393-
394425
documentBody.addEventListener('drag', function (e) {
395426
lastTouchEventTimestamp = 0;
396427
});
397428
398429
var waitForBridge = function waitForBridge() {
399430
if (window.postMessage.length === 1) {
400-
sendMessage({ type: 'ready' });
431+
sendMessage({
432+
type: 'ready'
433+
});
401434
} else {
402435
setTimeout(waitForBridge, 10);
403436
}
404437
};
438+
405439
waitForBridge();
406440
`;

0 commit comments

Comments
 (0)