99const wchar_t * scriptOnLoad =
1010LR"(
1111(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);
2218 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+ }
2739 }
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;
3248 }
3349 }
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;
3858 }
3959 }
60+ */
4061 function getWindowLocation() {
4162 let locationString = '';
4263 let currentWindow = window;
96117 return selectorList.join(' > ');
97118 }
98119 window.addEventListener('click', function(e) {
120+ if (wdw.inClick)
121+ return;
99122 var sel = getElementSelector(e.target);
100123 var msg = { "event": "click", "window": getWindowLocation(), "selector": sel };
101124 window.chrome.webview.postMessage(JSON.stringify(msg));
@@ -105,6 +128,25 @@ LR"(
105128 var msg = { "event": "input", "window": getWindowLocation(), "selector": sel, "value": e.target.value };
106129 window.chrome.webview.postMessage(JSON.stringify(msg));
107130 }, 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+ */
108150 window.addEventListener('dblclick', function(e) {
109151 var el = e.target;
110152 var sel = getElementSelector(el);
@@ -128,14 +170,22 @@ LR"(
128170 var data = arg.data;
129171 switch (data.event) {
130172 case "scroll":
131- syncScroll(data.window, data.selector, data.left, data.top );
173+ syncScroll(data);
132174 break;
133175 case "click":
134- syncClick(data.window, data.selector );
176+ syncClick(data);
135177 break;
136178 case "input":
137- syncInput(data.window, data.selector, data.value);
179+ syncInput(data);
180+ break;
181+ /*
182+ case "submit":
183+ syncSubmit(data);
138184 break;
185+ case "keydown":
186+ syncKeydown(data);
187+ break;
188+ */
139189 }
140190 });
141191})();
@@ -257,20 +307,21 @@ class CWebDiffWindow : public IWebDiffWindow
257307 }
258308 else if (event == WebDiffEvent::NavigationStarting)
259309 {
260- addEventListener (sender, ev. pane , nullptr ) ;
310+ m_compareState = NOT_COMPARED ;
261311 }
262312 else if (event == WebDiffEvent::FrameNavigationStarting)
263313 {
264- addEventListener (sender,ev.pane , nullptr );
265314 }
266315 else if (event == WebDiffEvent::NavigationCompleted)
267316 {
317+ addEventListener (sender, ev.pane , nullptr );
268318 *counter = *counter - 1 ;
269319 if (*counter == 0 )
270320 Recompare (callback2.Get ());
271321 }
272322 else if (event == WebDiffEvent::FrameNavigationCompleted)
273323 {
324+ addEventListener (sender,ev.pane , nullptr );
274325 }
275326 else if (event == WebDiffEvent::WebMessageReceived || event == WebDiffEvent::FrameWebMessageReceived)
276327 {
@@ -284,36 +335,33 @@ class CWebDiffWindow : public IWebDiffWindow
284335 if (diffIndex > -1 )
285336 SelectDiff (diffIndex);
286337 }
338+ else if (event == L" scroll" )
339+ {
340+ if (m_bSynchronizeEvents && GetSyncEventFlag (EVENT_SCROLL))
341+ syncEvent (ev.pane , msg);
342+ }
287343 else if (event == L" click" )
288344 {
289345 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);
295347 }
296348 else if (event == L" input" )
297349 {
298350 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);
305352 }
306- else if (event == L" scroll" )
353+ /*
354+ else if (event == L"submit")
307355 {
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);
316358 }
359+ else if (event == L"keydown")
360+ {
361+ if (m_bSynchronizeEvents && GetSyncEventFlag(EVENT_INPUT))
362+ syncEvent(ev.pane, msg);
363+ }
364+ */
317365 }
318366 for (const auto & listener : m_listeners)
319367 listener->Invoke (ev);
@@ -663,6 +711,11 @@ class CWebDiffWindow : public IWebDiffWindow
663711 m_eventSyncFlags = m_eventSyncFlags & ~static_cast <unsigned >(event);
664712 }
665713
714+ CompareState GetCompareState () const
715+ {
716+ return m_compareState;
717+ }
718+
666719 int GetDiffCount () const override
667720 {
668721 return static_cast <int >(m_diffInfos.size ());
@@ -915,43 +968,8 @@ class CWebDiffWindow : public IWebDiffWindow
915968 return m_webWindow[pane].ExecuteScript (sender, scriptOnLoad, callback);
916969 }
917970
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)
952972 {
953- std::wstring json =
954- L" {\" event\" : \" input\" , \" window\" : \" " + window + L" \" , \" selector\" : \" " + selector + L" \" , \" value\" : " + utils::Quote (value) + L" }" ;
955973 for (int pane = 0 ; pane < m_nPanes; ++pane)
956974 {
957975 if (pane == srcPane)
@@ -963,6 +981,7 @@ class CWebDiffWindow : public IWebDiffWindow
963981
964982 HRESULT compare (IWebDiffCallback* callback)
965983 {
984+ m_compareState = COMPARING;
966985 ComPtr<IWebDiffCallback> callback2 (callback);
967986 std::shared_ptr<std::vector<std::wstring>> jsons (new std::vector<std::wstring>());
968987 HRESULT hr = getDocumentsLoop (jsons,
@@ -1015,20 +1034,27 @@ class CWebDiffWindow : public IWebDiffWindow
10151034 Callback<IWebDiffCallback>([this , callback2](const WebDiffCallbackResult& result) -> HRESULT
10161035 {
10171036 HRESULT hr = result.errorCode ;
1037+ m_compareState = FAILED (hr) ? NOT_COMPARED : COMPARED;
10181038 if (callback2)
10191039 return callback2->Invoke ({ hr, nullptr });
10201040 return S_OK;
10211041 }).Get ());
10221042 }
1043+ if (FAILED (hr))
1044+ m_compareState = NOT_COMPARED;
10231045 if (FAILED (hr) && callback2)
10241046 return callback2->Invoke ({ hr, nullptr });
10251047 return S_OK;
10261048 }).Get ());
10271049 }
1050+ if (FAILED (hr))
1051+ m_compareState = NOT_COMPARED;
10281052 if (FAILED (hr) && callback2)
10291053 return callback2->Invoke ({ hr, nullptr });
10301054 return S_OK;
10311055 }).Get ());
1056+ if (FAILED (hr))
1057+ m_compareState = NOT_COMPARED;
10321058 return hr;
10331059 }
10341060
@@ -1577,12 +1603,9 @@ class CWebDiffWindow : public IWebDiffWindow
15771603 bool m_bShowDifferences = true ;
15781604 bool m_bShowWordDifferences = true ;
15791605 bool m_bSynchronizeEvents = true ;
1606+ bool m_bCompareCompleted = false ;
15801607 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;
15861609 IWebDiffWindow::ColorSettings m_colorSettings = {
15871610 RGB (239 , 203 , 5 ), RGB (192 , 192 , 192 ), RGB (0 , 0 , 0 ),
15881611 RGB (239 , 119 , 116 ), RGB (240 , 192 , 192 ), RGB (0 , 0 , 0 ),
0 commit comments