@@ -14,6 +14,7 @@ var arrayFrom = function arrayFrom(arrayLike) {
14
14
};
15
15
16
16
var documentBody = document.body;
17
+
17
18
if (!documentBody) {
18
19
throw new Error('No document.body element!');
19
20
}
@@ -31,13 +32,16 @@ var sendMessage = function sendMessage(msg) {
31
32
window.onerror = function (message, source, line, column, error) {
32
33
if (window.enableWebViewErrorDisplay) {
33
34
var elementJsError = document.getElementById('js-error-detailed');
35
+
34
36
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>');
36
38
}
37
39
} else {
38
40
var _elementJsError = document.getElementById('js-error-plain');
41
+
39
42
var elementSheetGenerated = document.getElementById('generated-styles');
40
43
var elementSheetHide = document.getElementById('style-hide-js-error-plain');
44
+
41
45
if (_elementJsError && elementSheetGenerated && elementSheetHide && elementSheetHide instanceof HTMLStyleElement && elementSheetHide.sheet && elementSheetGenerated instanceof HTMLStyleElement && elementSheetGenerated.sheet) {
42
46
elementSheetHide.sheet.disabled = true;
43
47
var _height = _elementJsError.offsetHeight;
@@ -56,12 +60,12 @@ window.onerror = function (message, source, line, column, error) {
56
60
error: error
57
61
}
58
62
});
59
-
60
63
return true;
61
64
};
62
65
63
66
var showHideElement = function showHideElement(elementId, show) {
64
67
var element = document.getElementById(elementId);
68
+
65
69
if (element) {
66
70
element.classList.toggle('hidden', !show);
67
71
}
@@ -70,31 +74,36 @@ var showHideElement = function showHideElement(elementId, show) {
70
74
var height = documentBody.clientHeight;
71
75
window.addEventListener('resize', function (event) {
72
76
var difference = height - documentBody.clientHeight;
77
+
73
78
if (documentBody.scrollHeight !== documentBody.scrollTop + documentBody.clientHeight) {
74
- window.scrollBy({ left: 0, top: difference });
79
+ window.scrollBy({
80
+ left: 0,
81
+ top: difference
82
+ });
75
83
}
84
+
76
85
height = documentBody.clientHeight;
77
86
});
78
87
79
88
var getMessageNode = function getMessageNode(node) {
80
89
var curNode = node;
90
+
81
91
while (curNode && curNode.parentNode && curNode.parentNode !== documentBody) {
82
92
curNode = curNode.parentNode;
83
93
}
94
+
84
95
return curNode;
85
96
};
86
97
87
98
var getMessageIdFromNode = function getMessageIdFromNode(node) {
88
99
var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
89
-
90
100
var msgNode = getMessageNode(node);
91
101
return msgNode && msgNode instanceof Element ? +msgNode.getAttribute('data-msg-id') : defaultValue;
92
102
};
93
103
94
104
var getStartAndEndNodes = function getStartAndEndNodes() {
95
105
var startNode = getMessageNode(document.elementFromPoint(200, 20));
96
106
var endNode = getMessageNode(document.elementFromPoint(200, window.innerHeight - 20));
97
-
98
107
return {
99
108
start: getMessageIdFromNode(startNode, Number.MAX_SAFE_INTEGER),
100
109
end: getMessageIdFromNode(endNode, 0)
@@ -105,10 +114,8 @@ var prevNodes = getStartAndEndNodes();
105
114
106
115
var sendScrollMessage = function sendScrollMessage() {
107
116
var currentNodes = getStartAndEndNodes();
108
-
109
117
sendMessage({
110
118
type: 'scroll',
111
-
112
119
offsetHeight: documentBody.offsetHeight,
113
120
innerHeight: window.innerHeight,
114
121
scrollY: window.scrollY,
@@ -125,27 +132,30 @@ var sendScrollMessageIfListShort = function sendScrollMessageIfListShort() {
125
132
};
126
133
127
134
var scrollEventsDisabled = true;
128
-
129
135
var lastTouchEventTimestamp = 0;
130
136
var lastTouchPositionX = -1;
131
137
var lastTouchPositionY = -1;
132
138
133
139
var handleScrollEvent = function handleScrollEvent() {
134
140
lastTouchEventTimestamp = 0;
141
+
135
142
if (scrollEventsDisabled) {
136
143
return;
137
144
}
138
145
139
146
sendScrollMessage();
140
-
141
147
var nearEnd = documentBody.offsetHeight - window.scrollY - window.innerHeight > 100;
142
148
showHideElement('scroll-bottom', nearEnd);
143
149
};
144
150
145
151
window.addEventListener('scroll', handleScrollEvent);
146
152
147
153
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
+ });
149
159
};
150
160
151
161
var isNearBottom = function isNearBottom() {
@@ -159,30 +169,45 @@ var scrollToBottomIfNearEnd = function scrollToBottomIfNearEnd() {
159
169
};
160
170
161
171
var scrollToAnchor = function scrollToAnchor(anchor) {
162
- var anchorNode = document.getElementById(' msg-' + anchor);
172
+ var anchorNode = document.getElementById(" msg-" + anchor);
163
173
164
174
if (anchorNode) {
165
- anchorNode.scrollIntoView({ block: 'start' });
175
+ anchorNode.scrollIntoView({
176
+ block: 'start'
177
+ });
166
178
} else {
167
- window.scroll({ left: 0, top: documentBody.scrollHeight + 200 });
179
+ window.scroll({
180
+ left: 0,
181
+ top: documentBody.scrollHeight + 200
182
+ });
168
183
}
169
184
};
170
185
171
186
var findPreserveTarget = function findPreserveTarget() {
172
187
var msgNode = getMessageNode(document.elementFromPoint(200, 50));
188
+
173
189
if (!msgNode || !(msgNode instanceof HTMLElement)) {
174
- return { type: 'none' };
190
+ return {
191
+ type: 'none'
192
+ };
175
193
}
194
+
176
195
var msgId = getMessageIdFromNode(msgNode);
177
196
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
+ };
179
202
};
180
203
181
204
var scrollToPreserve = function scrollToPreserve(msgId, prevBoundTop) {
182
- var newElement = document.getElementById('msg-' + msgId);
205
+ var newElement = document.getElementById("msg-" + msgId);
206
+
183
207
if (!newElement) {
184
208
return;
185
209
}
210
+
186
211
var newBoundRect = newElement.getBoundingClientRect();
187
212
window.scrollBy(0, newBoundRect.top - prevBoundTop);
188
213
};
@@ -195,29 +220,37 @@ var appendAuthToImages = function appendAuthToImages(auth) {
195
220
}
196
221
197
222
var srcPath = img.src.substring(auth.realm.length);
223
+
198
224
if (!(srcPath.startsWith('/user_uploads/') || srcPath.startsWith('/thumbnail?'))) {
199
225
return;
200
226
}
201
227
202
228
var delimiter = img.src.includes('?') ? '&' : '?';
203
- img.src += delimiter + ' api_key=' + auth.apiKey;
229
+ img.src += delimiter + " api_key=" + auth.apiKey;
204
230
});
205
231
};
206
232
207
233
var handleMessageContent = function handleMessageContent(msg) {
208
- var target = void 0;
234
+ var target;
235
+
209
236
if (msg.updateStrategy === 'replace') {
210
- target = { type: 'none' };
237
+ target = {
238
+ type: 'none'
239
+ };
211
240
} else if (msg.updateStrategy === 'scroll-to-anchor') {
212
- target = { type: 'anchor', anchor: msg.anchor };
241
+ target = {
242
+ type: 'anchor',
243
+ anchor: msg.anchor
244
+ };
213
245
} else if (msg.updateStrategy === 'scroll-to-bottom-if-near-bottom' && isNearBottom()) {
214
- target = { type: 'bottom' };
246
+ target = {
247
+ type: 'bottom'
248
+ };
215
249
} else {
216
250
target = findPreserveTarget();
217
251
}
218
252
219
253
documentBody.innerHTML = msg.content;
220
-
221
254
appendAuthToImages(msg.auth);
222
255
223
256
if (target.type === 'bottom') {
@@ -246,6 +279,7 @@ var handleMessageFetching = function handleMessageFetching(msg) {
246
279
247
280
var handleMessageTyping = function handleMessageTyping(msg) {
248
281
var elementTyping = document.getElementById('typing');
282
+
249
283
if (elementTyping) {
250
284
elementTyping.innerHTML = msg.content;
251
285
setTimeout(function () {
@@ -259,25 +293,20 @@ var messageHandlers = {
259
293
fetching: handleMessageFetching,
260
294
typing: handleMessageTyping
261
295
};
262
-
263
296
document.addEventListener('message', function (e) {
264
297
scrollEventsDisabled = true;
265
-
266
298
var decodedData = decodeURIComponent(escape(window.atob(e.data)));
267
299
var messages = JSON.parse(decodedData);
268
300
messages.forEach(function (msg) {
269
301
messageHandlers[msg.type](msg);
270
302
});
271
303
scrollEventsDisabled = false;
272
304
});
273
-
274
305
documentBody.addEventListener('click', function (e) {
275
306
e.preventDefault();
276
307
lastTouchEventTimestamp = 0;
277
-
278
308
var target = e.target;
279
309
280
-
281
310
if (!(target instanceof HTMLElement)) {
282
311
return;
283
312
}
@@ -305,6 +334,7 @@ documentBody.addEventListener('click', function (e) {
305
334
}
306
335
307
336
var inlineImageLink = target.closest('.message_inline_image a');
337
+
308
338
if (inlineImageLink && !inlineImageLink.closest('.youtube-video, .vimeo-video')) {
309
339
sendMessage({
310
340
type: 'image',
@@ -349,8 +379,11 @@ var handleLongPress = function handleLongPress(target) {
349
379
return;
350
380
}
351
381
352
- lastTouchEventTimestamp = 0;
382
+ if (!(e.target instanceof Element)) {
383
+ return;
384
+ }
353
385
386
+ lastTouchEventTimestamp = 0;
354
387
sendMessage({
355
388
type: 'longPress',
356
389
target: target.matches('.header') ? 'header' : 'message',
@@ -386,21 +419,22 @@ documentBody.addEventListener('touchend', function (e) {
386
419
lastTouchEventTimestamp = Date.now();
387
420
}
388
421
});
389
-
390
422
documentBody.addEventListener('touchmove', function (e) {
391
423
lastTouchEventTimestamp = 0;
392
424
});
393
-
394
425
documentBody.addEventListener('drag', function (e) {
395
426
lastTouchEventTimestamp = 0;
396
427
});
397
428
398
429
var waitForBridge = function waitForBridge() {
399
430
if (window.postMessage.length === 1) {
400
- sendMessage({ type: 'ready' });
431
+ sendMessage({
432
+ type: 'ready'
433
+ });
401
434
} else {
402
435
setTimeout(waitForBridge, 10);
403
436
}
404
437
};
438
+
405
439
waitForBridge();
406
440
` ;
0 commit comments