9
9
const wchar_t * scriptOnLoad =
10
10
LR"(
11
11
(function() {
12
- if (window.wdw)
13
- {
14
- return;
15
- }
16
- window.wdw = {};
17
- function syncScroll(win, selector, left, top) {
18
- var el = document.querySelector(selector);
19
- if (el && getWindowLocation() === win) {
20
- var sleft = Math.round((el.scrollWidth - el.clientWidth) * left);
21
- var stop = Math.round((el.scrollHeight - el.clientHeight) * top);
12
+ window.wdw = { "inClick": false/*, "inSubmit": false, "inKeydown": false*/ };
13
+ function syncScroll(e) {
14
+ var el = document.querySelector(e.selector);
15
+ if (el && getWindowLocation() === e.window) {
16
+ var sleft = Math.round((el.scrollWidth - el.clientWidth) * e.left);
17
+ var stop = Math.round((el.scrollHeight - el.clientHeight) * e.top);
22
18
clearTimeout(wdw.timeout);
23
- wdw.timeout = setTimeout(function() {
24
- el.scroll(sleft, stop);
25
- }, 200);
26
- }
19
+ wdw.timeout = setTimeout(function() {
20
+ if (el.scroll)
21
+ el.scroll(sleft, stop);
22
+ }, 100);
23
+ }
24
+ }
25
+ function syncClick(e) {
26
+ var el = document.querySelector(e.selector);
27
+ if (el && getWindowLocation() === e.window) {
28
+ wdw.inClick = true;
29
+ if (el.click)
30
+ el.click();
31
+ wdw.inClick = false;
32
+ }
33
+ }
34
+ function syncInput(e) {
35
+ var el = document.querySelector(e.selector);
36
+ if (el && getWindowLocation() === e.window) {
37
+ el.value = e.value;
38
+ }
27
39
}
28
- function syncClick(win, selector) {
29
- var el = document.querySelector(selector);
30
- if (el && getWindowLocation() === win) {
31
- el.click();
40
+ /*
41
+ function syncSubmit(e) {
42
+ var el = document.querySelector(e.selector);
43
+ if (el && getWindowLocation() === e.window) {
44
+ wdw.inSubmit = true;
45
+ if (el.submit)
46
+ el.submit();
47
+ wdw.inSubmit = false;
32
48
}
33
49
}
34
- function syncInput(win, selector, value) {
35
- var el = document.querySelector(selector);
36
- if (el && getWindowLocation() === win) {
37
- el.value = value;
50
+ function syncKeydown(e) {
51
+ var el = document.querySelector(e.selector);
52
+ if (el && getWindowLocation() === e.window) {
53
+ wdw.inKeydown = true;
54
+ var ev = new KeyboardEvent("keydown", e);
55
+ if (el.dispatchEvent)
56
+ el.dispatchEvent(ev);
57
+ wdw.inKeydown = false;
38
58
}
39
59
}
60
+ */
40
61
function getWindowLocation() {
41
62
let locationString = '';
42
63
let currentWindow = window;
96
117
return selectorList.join(' > ');
97
118
}
98
119
window.addEventListener('click', function(e) {
120
+ if (wdw.inClick)
121
+ return;
99
122
var sel = getElementSelector(e.target);
100
123
var msg = { "event": "click", "window": getWindowLocation(), "selector": sel };
101
124
window.chrome.webview.postMessage(JSON.stringify(msg));
@@ -105,6 +128,25 @@ LR"(
105
128
var msg = { "event": "input", "window": getWindowLocation(), "selector": sel, "value": e.target.value };
106
129
window.chrome.webview.postMessage(JSON.stringify(msg));
107
130
}, true);
131
+ /*
132
+ var forms = document.querySelectorAll('form');
133
+ forms.forEach(function(form) {
134
+ form.addEventListener('submit', function(e) {
135
+ if (wdw.inSubmit)
136
+ return;
137
+ var sel = getElementSelector(e.target);
138
+ var msg = { "event": "submit", "window": getWindowLocation(), "selector": sel };
139
+ window.chrome.webview.postMessage(JSON.stringify(msg));
140
+ });
141
+ }, true);
142
+ window.addEventListener('keydown', function(e) {
143
+ if (wdw.inKeydown)
144
+ return;
145
+ var sel = getElementSelector(e.target);
146
+ var msg = { "event": "keydown", "window": getWindowLocation(), "selector": sel, "altKey": e.altKey, "code": e.code, "ctrlKey": e.ctrlKey, "isComposing": e.isComposing, "key": e.key, "locale": e.locale, "location": e.location, "metaKey": e.metaKey, "repeat": e.repeat, "shiftKey": e.shiftKey };
147
+ window.chrome.webview.postMessage(JSON.stringify(msg));
148
+ }, true);
149
+ */
108
150
window.addEventListener('dblclick', function(e) {
109
151
var el = e.target;
110
152
var sel = getElementSelector(el);
@@ -128,14 +170,22 @@ LR"(
128
170
var data = arg.data;
129
171
switch (data.event) {
130
172
case "scroll":
131
- syncScroll(data.window, data.selector, data.left, data.top );
173
+ syncScroll(data);
132
174
break;
133
175
case "click":
134
- syncClick(data.window, data.selector );
176
+ syncClick(data);
135
177
break;
136
178
case "input":
137
- syncInput(data.window, data.selector, data.value);
179
+ syncInput(data);
180
+ break;
181
+ /*
182
+ case "submit":
183
+ syncSubmit(data);
138
184
break;
185
+ case "keydown":
186
+ syncKeydown(data);
187
+ break;
188
+ */
139
189
}
140
190
});
141
191
})();
@@ -257,20 +307,21 @@ class CWebDiffWindow : public IWebDiffWindow
257
307
}
258
308
else if (event == WebDiffEvent::NavigationStarting)
259
309
{
260
- addEventListener (sender, ev. pane , nullptr ) ;
310
+ m_compareState = NOT_COMPARED ;
261
311
}
262
312
else if (event == WebDiffEvent::FrameNavigationStarting)
263
313
{
264
- addEventListener (sender,ev.pane , nullptr );
265
314
}
266
315
else if (event == WebDiffEvent::NavigationCompleted)
267
316
{
317
+ addEventListener (sender, ev.pane , nullptr );
268
318
*counter = *counter - 1 ;
269
319
if (*counter == 0 )
270
320
Recompare (callback2.Get ());
271
321
}
272
322
else if (event == WebDiffEvent::FrameNavigationCompleted)
273
323
{
324
+ addEventListener (sender,ev.pane , nullptr );
274
325
}
275
326
else if (event == WebDiffEvent::WebMessageReceived || event == WebDiffEvent::FrameWebMessageReceived)
276
327
{
@@ -284,36 +335,33 @@ class CWebDiffWindow : public IWebDiffWindow
284
335
if (diffIndex > -1 )
285
336
SelectDiff (diffIndex);
286
337
}
338
+ else if (event == L" scroll" )
339
+ {
340
+ if (m_bSynchronizeEvents && GetSyncEventFlag (EVENT_SCROLL))
341
+ syncEvent (ev.pane , msg);
342
+ }
287
343
else if (event == L" click" )
288
344
{
289
345
if (m_bSynchronizeEvents && GetSyncEventFlag (EVENT_CLICK))
290
- {
291
- const std::wstring& window = doc[L" window" ].GetString ();
292
- const std::wstring& selector = doc[L" selector" ].GetString ();
293
- syncClick (ev.pane , window, selector);
294
- }
346
+ syncEvent (ev.pane , msg);
295
347
}
296
348
else if (event == L" input" )
297
349
{
298
350
if (m_bSynchronizeEvents && GetSyncEventFlag (EVENT_INPUT))
299
- {
300
- const std::wstring& window = doc[L" window" ].GetString ();
301
- const std::wstring& selector = doc[L" selector" ].GetString ();
302
- const std::wstring& value = doc[L" value" ].GetString ();
303
- syncInput (ev.pane , window, selector, value);
304
- }
351
+ syncEvent (ev.pane , msg);
305
352
}
306
- else if (event == L" scroll" )
353
+ /*
354
+ else if (event == L"submit")
307
355
{
308
- if (m_bSynchronizeEvents && GetSyncEventFlag (EVENT_SCROLL))
309
- {
310
- const double left = doc[L" left" ].GetDouble ();
311
- const double top = doc[L" top" ].GetDouble ();
312
- const std::wstring& window = doc[L" window" ].GetString ();
313
- const std::wstring& selector = doc[L" selector" ].GetString ();
314
- syncScroll (ev.pane , window, selector, left, top);
315
- }
356
+ if (m_bSynchronizeEvents && GetSyncEventFlag(EVENT_CLICK))
357
+ syncEvent(ev.pane, msg);
316
358
}
359
+ else if (event == L"keydown")
360
+ {
361
+ if (m_bSynchronizeEvents && GetSyncEventFlag(EVENT_INPUT))
362
+ syncEvent(ev.pane, msg);
363
+ }
364
+ */
317
365
}
318
366
for (const auto & listener : m_listeners)
319
367
listener->Invoke (ev);
@@ -663,6 +711,11 @@ class CWebDiffWindow : public IWebDiffWindow
663
711
m_eventSyncFlags = m_eventSyncFlags & ~static_cast <unsigned >(event);
664
712
}
665
713
714
+ CompareState GetCompareState () const
715
+ {
716
+ return m_compareState;
717
+ }
718
+
666
719
int GetDiffCount () const override
667
720
{
668
721
return static_cast <int >(m_diffInfos.size ());
@@ -915,43 +968,8 @@ class CWebDiffWindow : public IWebDiffWindow
915
968
return m_webWindow[pane].ExecuteScript (sender, scriptOnLoad, callback);
916
969
}
917
970
918
- HRESULT syncScroll (int srcPane, const std::wstring& window, const std::wstring& selector, double left, double top)
919
- {
920
- std::wstring json =
921
- L" {\" event\" : \" scroll\" , \" window\" : \" " + window + L" \" , \" selector\" : \" " + selector + L" \" , "
922
- L" \" left\" : " + std::to_wstring (left) + L" , \" top\" : " + std::to_wstring (top) + L" }" ;
923
- for (int pane = 0 ; pane < m_nPanes; ++pane)
924
- {
925
- if (pane == srcPane)
926
- continue ;
927
- m_webWindow[pane].PostWebMessageAsJsonInAllFrames (json.c_str ());
928
- }
929
- return S_OK;
930
- }
931
-
932
- HRESULT syncClick (int srcPane, const std::wstring& window, const std::wstring& selector)
933
- {
934
- uint64_t now = GetTickCount64 ();
935
- if (m_lastEvent.type != L" click" || m_lastEvent.selector != selector || GetTickCount64 () - m_lastEvent.time > 200 )
936
- {
937
- m_lastEvent.type = L" click" ;
938
- m_lastEvent.selector = selector;
939
- m_lastEvent.time = now;
940
- std::wstring json = L" {\" event\" : \" click\" , \" window\" : \" " + window + L" \" , \" selector\" : \" " + selector + L" \" }" ;
941
- for (int pane = 0 ; pane < m_nPanes; ++pane)
942
- {
943
- if (pane == srcPane)
944
- continue ;
945
- m_webWindow[pane].PostWebMessageAsJsonInAllFrames (json.c_str ());
946
- }
947
- }
948
- return S_OK;
949
- }
950
-
951
- HRESULT syncInput (int srcPane, const std::wstring& window, const std::wstring& selector, const std::wstring& value)
971
+ HRESULT syncEvent (int srcPane, const std::wstring& json)
952
972
{
953
- std::wstring json =
954
- L" {\" event\" : \" input\" , \" window\" : \" " + window + L" \" , \" selector\" : \" " + selector + L" \" , \" value\" : " + utils::Quote (value) + L" }" ;
955
973
for (int pane = 0 ; pane < m_nPanes; ++pane)
956
974
{
957
975
if (pane == srcPane)
@@ -963,6 +981,7 @@ class CWebDiffWindow : public IWebDiffWindow
963
981
964
982
HRESULT compare (IWebDiffCallback* callback)
965
983
{
984
+ m_compareState = COMPARING;
966
985
ComPtr<IWebDiffCallback> callback2 (callback);
967
986
std::shared_ptr<std::vector<std::wstring>> jsons (new std::vector<std::wstring>());
968
987
HRESULT hr = getDocumentsLoop (jsons,
@@ -1015,20 +1034,27 @@ class CWebDiffWindow : public IWebDiffWindow
1015
1034
Callback<IWebDiffCallback>([this , callback2](const WebDiffCallbackResult& result) -> HRESULT
1016
1035
{
1017
1036
HRESULT hr = result.errorCode ;
1037
+ m_compareState = FAILED (hr) ? NOT_COMPARED : COMPARED;
1018
1038
if (callback2)
1019
1039
return callback2->Invoke ({ hr, nullptr });
1020
1040
return S_OK;
1021
1041
}).Get ());
1022
1042
}
1043
+ if (FAILED (hr))
1044
+ m_compareState = NOT_COMPARED;
1023
1045
if (FAILED (hr) && callback2)
1024
1046
return callback2->Invoke ({ hr, nullptr });
1025
1047
return S_OK;
1026
1048
}).Get ());
1027
1049
}
1050
+ if (FAILED (hr))
1051
+ m_compareState = NOT_COMPARED;
1028
1052
if (FAILED (hr) && callback2)
1029
1053
return callback2->Invoke ({ hr, nullptr });
1030
1054
return S_OK;
1031
1055
}).Get ());
1056
+ if (FAILED (hr))
1057
+ m_compareState = NOT_COMPARED;
1032
1058
return hr;
1033
1059
}
1034
1060
@@ -1577,12 +1603,9 @@ class CWebDiffWindow : public IWebDiffWindow
1577
1603
bool m_bShowDifferences = true ;
1578
1604
bool m_bShowWordDifferences = true ;
1579
1605
bool m_bSynchronizeEvents = true ;
1606
+ bool m_bCompareCompleted = false ;
1580
1607
unsigned m_eventSyncFlags = EVENT_SCROLL | EVENT_CLICK | EVENT_INPUT;
1581
- struct LastEvent {
1582
- std::wstring type;
1583
- std::wstring selector;
1584
- uint64_t time;
1585
- } m_lastEvent;
1608
+ CompareState m_compareState = NOT_COMPARED;
1586
1609
IWebDiffWindow::ColorSettings m_colorSettings = {
1587
1610
RGB (239 , 203 , 5 ), RGB (192 , 192 , 192 ), RGB (0 , 0 , 0 ),
1588
1611
RGB (239 , 119 , 116 ), RGB (240 , 192 , 192 ), RGB (0 , 0 , 0 ),
0 commit comments