From e01a3a097871882a6e67a34be76aa593ad1fde04 Mon Sep 17 00:00:00 2001 From: fourtf Date: Tue, 29 May 2018 23:58:11 +0200 Subject: [PATCH] added some more race conditions to the browser extension --- browser_ext/background.js | 106 ++++++++++------------ browser_ext/inject.js | 65 +++++++++++-- src/singletons/nativemessagingmanager.cpp | 8 +- src/widgets/attachedwindow.cpp | 7 +- 4 files changed, 117 insertions(+), 69 deletions(-) diff --git a/browser_ext/background.js b/browser_ext/background.js index d78194bda..84ce20e15 100644 --- a/browser_ext/background.js +++ b/browser_ext/background.js @@ -8,6 +8,22 @@ const ignoredPages = { "directory": true, }; +/// return channel name if it should contain a chat +function matchChannelName(url) { + if (!url) + return undefined; + + const match = url.match(/^https?:\/\/(www\.)?twitch.tv\/([a-zA-Z0-9_]+)\/?$/); + + let channelName; + if (match && (channelName = match[2], !ignoredPages[channelName])) { + return channelName; + } + + return undefined; +} + + const appName = "com.chatterino.chatterino"; let port = null; @@ -41,15 +57,11 @@ function connectPort() { // tab activated chrome.tabs.onActivated.addListener((activeInfo) => { - console.log(0) chrome.tabs.get(activeInfo.tabId, (tab) => { - console.log(1) if (!tab || !tab.url) return; - console.log(2) chrome.windows.get(tab.windowId, {}, (window) => { if (!window.focused) return; - console.log(3) onTabSelected(tab.url, tab); }); @@ -76,8 +88,12 @@ chrome.windows.onRemoved.addListener((windowId) => { // window selected chrome.windows.onFocusChanged.addListener((windowId) => { - chrome.tabs.query({windowId: windowId, highlighted: true}, (tabs) => { - if (tabs.length >= 1) { + console.log(windowId); + if (windowId == -1) return; + + // this returns all tabs when the query fails + chrome.tabs.query({ windowId: windowId, highlighted: true }, (tabs) => { + if (tabs.length === 1) { let tab = tabs[0]; onTabSelected(tab.url, tab); @@ -86,33 +102,19 @@ chrome.windows.onFocusChanged.addListener((windowId) => { }); -/// return channel name if it should contain a chat -function matchChannelName(url) { - if (!url) - return undefined; - - const match = url.match(/^https?:\/\/(www\.)?twitch.tv\/([a-zA-Z0-9_]+)\/?$/); - - let channelName; - if (match && (channelName = match[2], !ignoredPages[channelName])) { - return channelName; - } - - return undefined; -} // attach or detach from tab function onTabSelected(url, tab) { let channelName = matchChannelName(url); if (channelName) { - chrome.windows.get(tab.windowId, {}, (window) => { - // attach to window - tryAttach(tab.windowId, { - name: channelName, - yOffset: window.height - tab.height, - }); - }); + // chrome.windows.get(tab.windowId, {}, (window) => { + // // attach to window + // tryAttach(tab.windowId, { + // name: channelName, + // yOffset: window.height - tab.height, + // }); + // }); } else { // detach from window tryDetach(tab.windowId); @@ -120,42 +122,34 @@ function onTabSelected(url, tab) { } // receiving messages from the inject script -function registerTheGarbage() { - chrome.runtime.onMessage.addListener((message, sender, callback) => { - // is tab highlighted - if (!sender.tab.highlighted) return; +chrome.runtime.onMessage.addListener((message, sender, callback) => { + console.log(message); - // is window focused - chrome.windows.get(sender.tab.windowId, {}, (window) => { - if (!window.focused) return; + // is tab highlighted + if (!sender.tab.highlighted) return; - // get zoom value - chrome.tabs.getZoom(sender.tab.id, (zoom) => { - let size = { - width: message.rect.width * zoom, - height: message.rect.height * zoom, - }; + // is window focused + chrome.windows.get(sender.tab.windowId, {}, (window) => { + if (!window.focused) return; - // attach to window - tryAttach(sender.tab.windowId, { - name: matchChannelName(sender.tab.url), - size: size, - }) + // get zoom value + chrome.tabs.getZoom(sender.tab.id, (zoom) => { + let size = { + width: Math.floor(message.rect.width * zoom), + height: Math.floor(message.rect.height * zoom), + }; + + console.log(zoom); + + // attach to window + tryAttach(sender.tab.windowId, { + name: matchChannelName(sender.tab.url), + size: size, }); }); }); -} +}); -function registerLoop() { - // loop until the runtime objects exists because I can't be arsed to figure out the proper way to do this - if (chrome.runtime === undefined) { - setTimeout(registerLoop(), 100); - return; - } - - registerTheGarbage(); -} -registerLoop(); // attach chatterino to a chrome window function tryAttach(windowId, data) { diff --git a/browser_ext/inject.js b/browser_ext/inject.js index 51e87b466..812b6580f 100644 --- a/browser_ext/inject.js +++ b/browser_ext/inject.js @@ -1,5 +1,6 @@ (() => { let lastRect = {}; + let port = null; function log(str) { console.log("Chatterino Native: " + str); @@ -10,6 +11,8 @@ } function queryChatRect() { + if (!matchChannelName(window.location.href)) return; + let element = findChatDiv(); if (element === undefined) { @@ -17,9 +20,24 @@ return; } - // element.firstChild.style.opacity = 0; + if (!element.chatterino) { + let xd = element.getElementsByClassName("channel-page__right-column")[0] + + if (xd != undefined) { + element.chatterino = true; + xd.style.opacity = 0; + + setTimeout(() => { + xd.innerHTML = "
" + + "Disconnected from the chatterino extension.

Please refresh the page." + + "
"; + xd.style.opacity = 1; + }, 2000); + } + } let rect = element.getBoundingClientRect(); + // if ( // lastRect.left == rect.left && // lastRect.right == rect.right && @@ -27,7 +45,6 @@ // lastRect.bottom == rect.bottom // ) { // // log("skipped sending message"); - // return; // } lastRect = rect; @@ -36,10 +53,12 @@ rect: rect, }; - chrome.runtime.sendMessage(data, (response) => { - // log("received message response"); - // console.log(response) - }); + try { + chrome.runtime.sendMessage(data); + } catch { + // failed to send a message to the runtime -> maybe the extension got reloaded + // alert("reload the page to re-enable chatterino native"); + } } function queryCharRectLoop() { @@ -47,11 +66,43 @@ queryChatRect(); let t2 = performance.now(); console.log("queryCharRect " + (t2 - t1) + "ms"); - setTimeout(queryCharRectLoop, 500); + // setTimeout(queryCharRectLoop, 500); + } + + const ignoredPages = { + "settings": true, + "payments": true, + "inventory": true, + "messages": true, + "subscriptions": true, + "friends": true, + "directory": true, + }; + + /// return channel name if it should contain a chat + function matchChannelName(url) { + if (!url) + return undefined; + + const match = url.match(/^https?:\/\/(www\.)?twitch.tv\/([a-zA-Z0-9_]+)\/?$/); + + let channelName; + if (match && (channelName = match[2], !ignoredPages[channelName])) { + return channelName; + } + + return undefined; } queryCharRectLoop(); + window.addEventListener("load", () => { + setTimeout(queryChatRect, 1000); + }); window.addEventListener("resize", queryChatRect); + window.addEventListener("focus", queryChatRect); + window.addEventListener("mouseup", () => { + setTimeout(queryChatRect, 10); + }); log("initialized"); })() diff --git a/src/singletons/nativemessagingmanager.cpp b/src/singletons/nativemessagingmanager.cpp index 36def5396..a4810fddc 100644 --- a/src/singletons/nativemessagingmanager.cpp +++ b/src/singletons/nativemessagingmanager.cpp @@ -172,9 +172,11 @@ void NativeMessagingManager::ReceiverThread::handleMessage(const QJsonObject &ro if (attach) { #ifdef USEWINSDK - auto *window = widgets::AttachedWindow::get(::GetForegroundWindow(), args); - if (!name.isEmpty()) { - window->setChannel(app->twitch.server->getOrAddChannel(name)); + if (args.height != -1) { + auto *window = widgets::AttachedWindow::get(::GetForegroundWindow(), args); + if (!name.isEmpty()) { + window->setChannel(app->twitch.server->getOrAddChannel(name)); + } } // window->show(); #endif diff --git a/src/widgets/attachedwindow.cpp b/src/widgets/attachedwindow.cpp index 1b0b84b07..d28facfb8 100644 --- a/src/widgets/attachedwindow.cpp +++ b/src/widgets/attachedwindow.cpp @@ -80,7 +80,7 @@ AttachedWindow *AttachedWindow::get(void *target, const GetArgs &args) if (show) { window->show(); - window->resize(size); + // window->resize(size); } return window; @@ -156,8 +156,9 @@ void AttachedWindow::attachToHwnd(void *_hwnd) SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); if (this->_height == -1) { - ::MoveWindow(hwnd, rect.right - this->_width - 8, rect.top + this->yOffset - 8, - this->_width, rect.bottom - rect.top - this->yOffset, false); + // ::MoveWindow(hwnd, rect.right - this->_width - 8, rect.top + this->yOffset + // - 8, + // this->_width, rect.bottom - rect.top - this->yOffset, false); } else { ::MoveWindow(hwnd, rect.right - this->_width - 8, rect.bottom - this->_height - 8, this->_width, this->_height, false);