Skip to content

Commit 4097cfe

Browse files
committed
WIP (8)
1 parent a5c6478 commit 4097cfe

File tree

2 files changed

+118
-88
lines changed

2 files changed

+118
-88
lines changed

src/WinWebDiffLib/WebDiffWindow.hpp

Lines changed: 111 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,55 @@
99
const wchar_t* scriptOnLoad =
1010
LR"(
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;
@@ -96,6 +117,8 @@ LR"(
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),

src/WinWebDiffLib/WinWebDiffLib.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ struct IWebDiffWindow
6262
EVENT_CLICK = ( 1 << 1 ),
6363
EVENT_INPUT = ( 1 << 2 ),
6464
};
65+
enum CompareState
66+
{
67+
NOT_COMPARED,
68+
COMPARING,
69+
COMPARED,
70+
};
6571
struct DiffOptions
6672
{
6773
enum DiffAlgorithm {
@@ -183,6 +189,7 @@ struct IWebDiffWindow
183189
virtual void SetSyncEventFlags(unsigned flags) = 0;
184190
virtual bool GetSyncEventFlag(EventType event) const = 0;
185191
virtual void SetSyncEventFlag(EventType event, bool flag) = 0;
192+
virtual CompareState GetCompareState() const = 0;
186193
};
187194

188195
extern "C"

0 commit comments

Comments
 (0)