| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-2016 Eyeo GmbH | 3  * Copyright (C) 2006-2016 Eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 25 #include "AdblockPlusClient.h" | 25 #include "AdblockPlusClient.h" | 
| 26 #include "PluginClientBase.h" | 26 #include "PluginClientBase.h" | 
| 27 #include "PluginClientFactory.h" | 27 #include "PluginClientFactory.h" | 
| 28 #include "PluginUtil.h" | 28 #include "PluginUtil.h" | 
| 29 #include "../shared/Utils.h" | 29 #include "../shared/Utils.h" | 
| 30 #include "../shared/Dictionary.h" | 30 #include "../shared/Dictionary.h" | 
| 31 #include "IeVersion.h" | 31 #include "IeVersion.h" | 
| 32 #include "../shared/Version.h" | 32 #include "../shared/Version.h" | 
| 33 #include <thread> | 33 #include <thread> | 
| 34 #include <array> | 34 #include <array> | 
|  | 35 #include "WebBrowserEventsListener.h" | 
| 35 | 36 | 
| 36 #ifdef DEBUG_HIDE_EL | 37 #ifdef DEBUG_HIDE_EL | 
| 37 DWORD profileTime = 0; | 38 DWORD profileTime = 0; | 
| 38 #endif | 39 #endif | 
| 39 | 40 | 
| 40 extern CComModule _Module; | 41 extern CComModule _Module; | 
| 41 | 42 | 
| 42 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); | 43 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); | 
| 43 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR
      ECT); | 44 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR
      ECT); | 
| 44 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); | 45 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 91       if (right < left) | 92       if (right < left) | 
| 92       { | 93       { | 
| 93         throw std::runtime_error("invariant violation: rectangle right < left"); | 94         throw std::runtime_error("invariant violation: rectangle right < left"); | 
| 94       } | 95       } | 
| 95       return static_cast<unsigned long>(right - left); | 96       return static_cast<unsigned long>(right - left); | 
| 96     } | 97     } | 
| 97   }; | 98   }; | 
| 98 } | 99 } | 
| 99 | 100 | 
| 100 CPluginClass::CPluginClass() | 101 CPluginClass::CPluginClass() | 
| 101   : m_webBrowser2(nullptr) | 102   : m_data(std::make_shared<Data>()) | 
| 102 { | 103 { | 
| 103   DEBUG_GENERAL([this]() -> std::wstring | 104   DEBUG_GENERAL([this]() -> std::wstring | 
| 104     { | 105     { | 
| 105       std::wstring s = L"CPluginClass::<constructor>, this = "; | 106       std::wstring s = L"CPluginClass::<constructor>, this = "; | 
| 106       s += ToHexLiteral(this); | 107       s += ToHexLiteral(this); | 
| 107       return s; | 108       return s; | 
| 108     }()); | 109     }()); | 
| 109 | 110 | 
| 110   //Use this line to debug memory leaks | 111   //Use this line to debug memory leaks | 
| 111   //    _CrtDumpMemoryLeaks(); | 112   //    _CrtDumpMemoryLeaks(); | 
| 112 | 113 | 
| 113   m_isAdvised = false; | 114   m_isAdvised = false; | 
| 114   m_hTabWnd = NULL; | 115   m_hTabWnd = NULL; | 
| 115   m_hStatusBarWnd = NULL; | 116   m_hStatusBarWnd = NULL; | 
| 116   m_hPaneWnd = NULL; | 117   m_hPaneWnd = NULL; | 
| 117   m_nPaneWidth = 0; | 118   m_nPaneWidth = 0; | 
| 118   m_pWndProcStatus = NULL; | 119   m_pWndProcStatus = NULL; | 
| 119   m_hTheme = NULL; | 120   m_hTheme = NULL; | 
| 120   m_isInitializedOk = false; | 121   m_isInitializedOk = false; | 
| 121 | 122 | 
| 122 | 123 | 
| 123   m_tab = new CPluginTab(); | 124   m_data->tab.reset(new CPluginTab()); | 
| 124 | 125 | 
| 125   Dictionary::Create(GetBrowserLanguage()); | 126   Dictionary::Create(GetBrowserLanguage()); | 
| 126 } | 127 } | 
| 127 | 128 | 
| 128 CPluginClass::~CPluginClass() | 129 CPluginClass::~CPluginClass() | 
| 129 { | 130 { | 
| 130   DEBUG_GENERAL([this]() -> std::wstring | 131   DEBUG_GENERAL([this]() -> std::wstring | 
| 131     { | 132     { | 
| 132       std::wstring s = L"CPluginClass::<destructor>, this = "; | 133       std::wstring s = L"CPluginClass::<destructor>, this = "; | 
| 133       s += ToHexLiteral(this); | 134       s += ToHexLiteral(this); | 
| 134       return s; | 135       return s; | 
| 135     }()); | 136     }()); | 
| 136 | 137 | 
| 137   delete m_tab; | 138   m_data.reset(); | 
| 138 } | 139 } | 
| 139 | 140 | 
| 140 HWND CPluginClass::GetBrowserHWND() const | 141 HWND CPluginClass::GetBrowserHWND() const | 
| 141 { | 142 { | 
| 142   if (!m_webBrowser2) | 143   if (!m_data->webBrowser2) | 
| 143   { | 144   { | 
| 144     DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserHWND - Reached with m_webB
      rowser2 == nullptr"); | 145     DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserHWND - Reached with webBro
      wser2 == nullptr"); | 
| 145     return nullptr; | 146     return nullptr; | 
| 146   } | 147   } | 
| 147   SHANDLE_PTR hBrowserWndHandle = 0; | 148   SHANDLE_PTR hBrowserWndHandle = 0; | 
| 148   HRESULT hr = m_webBrowser2->get_HWND(&hBrowserWndHandle); | 149   HRESULT hr = m_data->webBrowser2->get_HWND(&hBrowserWndHandle); | 
| 149   if (FAILED(hr)) | 150   if (FAILED(hr)) | 
| 150   { | 151   { | 
| 151     DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_BROWSER_WINDOW, "Cl
      ass::GetBrowserHWND - failed"); | 152     DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_BROWSER_WINDOW, "Cl
      ass::GetBrowserHWND - failed"); | 
| 152     return nullptr; | 153     return nullptr; | 
| 153   } | 154   } | 
| 154   return (HWND)hBrowserWndHandle; | 155   return (HWND)hBrowserWndHandle; | 
| 155 } | 156 } | 
| 156 | 157 | 
| 157 bool CPluginClass::IsRootBrowser(IWebBrowser2* otherBrowser) | 158 bool CPluginClass::IsRootBrowser(IWebBrowser2* otherBrowser) | 
| 158 { | 159 { | 
| 159   return m_webBrowser2.IsEqualObject(otherBrowser); | 160   return m_data->webBrowser2.IsEqualObject(otherBrowser); | 
| 160 } | 161 } | 
| 161 | 162 | 
| 162 CComQIPtr<IWebBrowser2> CPluginClass::GetAsyncBrowser() | 163 CComQIPtr<IWebBrowser2> CPluginClass::GetAsyncBrowser() | 
| 163 { | 164 { | 
| 164   CComQIPtr<IWebBrowser2> browser; | 165   CComQIPtr<IWebBrowser2> browser; | 
| 165 | 166 | 
| 166   s_criticalSectionLocal.Lock(); | 167   s_criticalSectionLocal.Lock(); | 
| 167   { | 168   { | 
| 168     browser = s_asyncWebBrowser2; | 169     browser = s_asyncWebBrowser2; | 
| 169   } | 170   } | 
| 170   s_criticalSectionLocal.Unlock(); | 171   s_criticalSectionLocal.Unlock(); | 
| 171 | 172 | 
| 172   return browser; | 173   return browser; | 
| 173 } | 174 } | 
| 174 | 175 | 
| 175 std::wstring CPluginClass::GetBrowserUrl() const | 176 std::wstring CPluginClass::GetBrowserUrl() const | 
| 176 { | 177 { | 
| 177   std::wstring url; | 178   std::wstring url; | 
| 178   if (m_webBrowser2) | 179   if (m_data->webBrowser2) | 
| 179   { | 180   { | 
| 180     CComBSTR bstrURL; | 181     CComBSTR bstrURL; | 
| 181     if (SUCCEEDED(m_webBrowser2->get_LocationURL(&bstrURL))) | 182     if (SUCCEEDED(m_data->webBrowser2->get_LocationURL(&bstrURL))) | 
| 182     { | 183     { | 
| 183       url = ToWstring(bstrURL); | 184       url = ToWstring(bstrURL); | 
| 184     } | 185     } | 
| 185   } | 186   } | 
| 186   else | 187   else | 
| 187   { | 188   { | 
| 188     DEBUG_GENERAL(L"CPluginClass::GetBrowserUrl - Reached with m_webBrowser2 == 
      nullptr (probable invariant violation)"); | 189     DEBUG_GENERAL(L"CPluginClass::GetBrowserUrl - Reached with webBrowser2 == nu
      llptr (probable invariant violation)"); | 
| 189   } | 190   } | 
| 190   if (url.empty()) | 191   if (url.empty()) | 
| 191   { | 192   { | 
| 192     url = m_tab->GetDocumentUrl(); | 193     url = m_data->tab->GetDocumentUrl(); | 
| 193   } | 194   } | 
| 194   return url; | 195   return url; | 
| 195 } | 196 } | 
| 196 | 197 | 
| 197 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 198 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 
| 198 { | 199 { | 
| 199   if (thisPtr == NULL) | 200   if (thisPtr == NULL) | 
| 200     return 0; | 201     return 0; | 
| 201   if (!((CPluginClass*)thisPtr)->InitObject()) | 202   if (!((CPluginClass*)thisPtr)->InitObject()) | 
| 202   { | 203   { | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 226 | 227 | 
| 227       HRESULT hr = ::CoInitialize(NULL); | 228       HRESULT hr = ::CoInitialize(NULL); | 
| 228       if (FAILED(hr)) | 229       if (FAILED(hr)) | 
| 229       { | 230       { | 
| 230         DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
       "Class::SetSite - CoInitialize"); | 231         DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
       "Class::SetSite - CoInitialize"); | 
| 231       } | 232       } | 
| 232 | 233 | 
| 233       /* | 234       /* | 
| 234        * We were instantiated as a BHO, so our site is always of type IWebBrowse
      r2. | 235        * We were instantiated as a BHO, so our site is always of type IWebBrowse
      r2. | 
| 235        */ | 236        */ | 
| 236       m_webBrowser2 = ATL::CComQIPtr<IWebBrowser2>(unknownSite); | 237       m_data->webBrowser2 = ATL::CComQIPtr<IWebBrowser2>(unknownSite); | 
| 237       if (!m_webBrowser2) | 238       if (!m_data->webBrowser2) | 
| 238       { | 239       { | 
| 239         throw std::logic_error("CPluginClass::SetSite - Unable to convert site p
      ointer to IWebBrowser2*"); | 240         throw std::logic_error("CPluginClass::SetSite - Unable to convert site p
      ointer to IWebBrowser2*"); | 
| 240       } | 241       } | 
| 241       DEBUG_GENERAL([this]() -> std::wstring | 242       DEBUG_GENERAL([this]() -> std::wstring | 
| 242         { | 243         { | 
| 243           std::wstringstream ss; | 244           std::wstringstream ss; | 
| 244           ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this); | 245           ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this); | 
| 245           ss << L", browser = " << ToHexLiteral(m_webBrowser2); | 246           ss << L", browser = " << ToHexLiteral(m_data->webBrowser2); | 
| 246           return ss.str(); | 247           return ss.str(); | 
| 247         }()); | 248         }()); | 
| 248 | 249 | 
| 249       //register the mimefilter | 250       //register the mimefilter | 
| 250       //and only mimefilter | 251       //and only mimefilter | 
| 251       //on some few computers the mimefilter does not get properly registered wh
      en it is done on another thread | 252       //on some few computers the mimefilter does not get properly registered wh
      en it is done on another thread | 
| 252       s_criticalSectionLocal.Lock(); | 253       s_criticalSectionLocal.Lock(); | 
| 253       { | 254       { | 
| 254         // Always register on startup, then check if we need to unregister in a 
      separate thread | 255         // Always register on startup, then check if we need to unregister in a 
      separate thread | 
| 255         s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 256         s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 
| 256         s_asyncWebBrowser2 = unknownSite; | 257         s_asyncWebBrowser2 = unknownSite; | 
| 257         s_instances.insert(this); | 258         s_instances.insert(this); | 
| 258       } | 259       } | 
| 259       s_criticalSectionLocal.Unlock(); | 260       s_criticalSectionLocal.Unlock(); | 
| 260 | 261 | 
| 261       try | 262       try | 
| 262       { | 263       { | 
| 263         HRESULT hr = DispEventAdvise(m_webBrowser2); | 264         HRESULT hr = DispEventAdvise(m_data->webBrowser2); | 
| 264         if (SUCCEEDED(hr)) | 265         if (SUCCEEDED(hr)) | 
| 265         { | 266         { | 
| 266           m_isAdvised = true; | 267           m_isAdvised = true; | 
| 267           try | 268           try | 
| 268           { | 269           { | 
| 269             std::thread startInitObjectThread(StartInitObject, this); | 270             std::thread startInitObjectThread(StartInitObject, this); | 
| 270             startInitObjectThread.detach(); // TODO: but actually we should wait
       for the thread in the dtr. | 271             startInitObjectThread.detach(); // TODO: but actually we should wait
       for the thread in the dtr. | 
| 271           } | 272           } | 
| 272           catch (const std::system_error& ex) | 273           catch (const std::system_error& ex) | 
| 273           { | 274           { | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 290     { | 291     { | 
| 291       DEBUG_GENERAL([this]() -> std::wstring | 292       DEBUG_GENERAL([this]() -> std::wstring | 
| 292       { | 293       { | 
| 293         std::wstringstream ss; | 294         std::wstringstream ss; | 
| 294         ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this); | 295         ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this); | 
| 295         ss << L", browser = nullptr"; | 296         ss << L", browser = nullptr"; | 
| 296         return ss.str(); | 297         return ss.str(); | 
| 297       }()); | 298       }()); | 
| 298 | 299 | 
| 299       Unadvise(); | 300       Unadvise(); | 
|  | 301       assert(m_data->connectedWebBrowsersCache.empty() && "Connected web browser
       cache should be already empty"); | 
| 300 | 302 | 
| 301       // Destroy window | 303       // Destroy window | 
| 302       if (m_pWndProcStatus) | 304       if (m_pWndProcStatus) | 
| 303       { | 305       { | 
| 304         ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn
      dProcStatus); | 306         ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn
      dProcStatus); | 
| 305 | 307 | 
| 306         m_pWndProcStatus = NULL; | 308         m_pWndProcStatus = NULL; | 
| 307       } | 309       } | 
| 308 | 310 | 
| 309       if (m_hPaneWnd) | 311       if (m_hPaneWnd) | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 329           s_threadInstances.erase(it); | 331           s_threadInstances.erase(it); | 
| 330         } | 332         } | 
| 331         if (s_instances.empty()) | 333         if (s_instances.empty()) | 
| 332         { | 334         { | 
| 333           // TODO: Explicitly releasing a resource when a container becomes empt
      y looks like a job better suited for shared_ptr | 335           // TODO: Explicitly releasing a resource when a container becomes empt
      y looks like a job better suited for shared_ptr | 
| 334           CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 336           CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 
| 335         } | 337         } | 
| 336       } | 338       } | 
| 337       s_criticalSectionLocal.Unlock(); | 339       s_criticalSectionLocal.Unlock(); | 
| 338 | 340 | 
| 339       m_webBrowser2 = nullptr; | 341       m_data->webBrowser2 = nullptr; | 
| 340 | 342 | 
| 341       DEBUG_GENERAL("===========================================================
      =====================\nNEW TAB UI - END\n=======================================
      =========================================") | 343       DEBUG_GENERAL("===========================================================
      =====================\nNEW TAB UI - END\n=======================================
      =========================================") | 
| 342 | 344 | 
| 343       ::CoUninitialize(); | 345       ::CoUninitialize(); | 
| 344     } | 346     } | 
| 345 | 347 | 
| 346   } | 348   } | 
| 347   catch (...) | 349   catch (...) | 
| 348   { | 350   { | 
| 349   } | 351   } | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 479     ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; | 481     ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; | 
| 480     if (!webBrowser) | 482     if (!webBrowser) | 
| 481     { | 483     { | 
| 482       return; | 484       return; | 
| 483     } | 485     } | 
| 484     if (!urlVariant || urlVariant->vt != VT_BSTR) | 486     if (!urlVariant || urlVariant->vt != VT_BSTR) | 
| 485     { | 487     { | 
| 486       return; | 488       return; | 
| 487     } | 489     } | 
| 488     std::wstring url = ToWstring(urlVariant->bstrVal); | 490     std::wstring url = ToWstring(urlVariant->bstrVal); | 
|  | 491     EnsureWebBrowserConnected(webBrowser); | 
| 489 | 492 | 
| 490     // If webbrowser2 is equal to top level browser (as set in SetSite), we are | 493     // If webbrowser2 is equal to top level browser (as set in SetSite), we are | 
| 491     // navigating new page | 494     // navigating new page | 
| 492     CPluginClient* client = CPluginClient::GetInstance(); | 495     CPluginClient* client = CPluginClient::GetInstance(); | 
| 493     if (url.find(L"javascript") == 0) | 496     if (url.find(L"javascript") == 0) | 
| 494     { | 497     { | 
| 495     } | 498     } | 
| 496     else if (IsRootBrowser(webBrowser)) | 499     else if (IsRootBrowser(webBrowser)) | 
| 497     { | 500     { | 
| 498       m_tab->OnNavigate(url); | 501       m_data->tab->OnNavigate(url); | 
| 499       DEBUG_GENERAL( | 502       DEBUG_GENERAL( | 
| 500       L"========================================================================
      ========\n" | 503       L"========================================================================
      ========\n" | 
| 501       L"Begin main navigation url:" + url + L"\n" | 504       L"Begin main navigation url:" + url + L"\n" | 
| 502       L"========================================================================
      ========") | 505       L"========================================================================
      ========") | 
| 503 | 506 | 
| 504 #ifdef ENABLE_DEBUG_RESULT | 507 #ifdef ENABLE_DEBUG_RESULT | 
| 505       CPluginDebug::DebugResultDomain(url); | 508       CPluginDebug::DebugResultDomain(url); | 
| 506 #endif | 509 #endif | 
| 507       UpdateStatusBar(); | 510       UpdateStatusBar(); | 
| 508     } | 511     } | 
| 509     else | 512     else | 
| 510     { | 513     { | 
| 511       DEBUG_NAVI(L"Navi::Begin navigation url:" + url) | 514       DEBUG_NAVI(L"Navi::Begin navigation url:" + url) | 
| 512       m_tab->CacheFrame(url); | 515       m_data->tab->CacheFrame(url); | 
| 513     } | 516     } | 
| 514   } | 517   } | 
| 515   catch (...) | 518   catch (...) | 
| 516   { | 519   { | 
| 517   } | 520   } | 
| 518 } | 521 } | 
| 519 | 522 | 
| 520 // Entry point | 523 // Entry point | 
| 521 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() | 524 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() | 
| 522 { | 525 { | 
| 523   try | 526   try | 
| 524   { | 527   { | 
| 525     if (!m_webBrowser2) | 528     if (!m_data->webBrowser2) | 
| 526     { | 529     { | 
| 527       DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with 
      m_webBrowser2 == nullptr"); | 530       DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with 
      webBrowser2 == nullptr"); | 
| 528       return; | 531       return; | 
| 529     } | 532     } | 
| 530     DEBUG_NAVI(L"Navi::Download Complete") | 533     DEBUG_NAVI(L"Navi::Download Complete") | 
| 531     m_tab->OnDownloadComplete(m_webBrowser2); | 534       m_data->tab->OnDownloadComplete(m_data->webBrowser2); | 
| 532   } | 535   } | 
| 533   catch (...) | 536   catch (...) | 
| 534   { | 537   { | 
| 535   } |  | 
| 536 } |  | 
| 537 |  | 
| 538 // Entry point |  | 
| 539 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
      isp, VARIANT* /*urlOrPidl*/) |  | 
| 540 { |  | 
| 541   try |  | 
| 542   { |  | 
| 543     DEBUG_NAVI(L"Navi::Document Complete"); |  | 
| 544     ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; |  | 
| 545     if (!webBrowser2) |  | 
| 546     { |  | 
| 547       return; |  | 
| 548     } |  | 
| 549     std::wstring frameSrc = GetLocationUrl(*webBrowser2); |  | 
| 550     m_tab->OnDocumentComplete(webBrowser2, frameSrc, IsRootBrowser(webBrowser2))
      ; |  | 
| 551   } |  | 
| 552   catch (...) |  | 
| 553   { |  | 
| 554   } | 538   } | 
| 555 } | 539 } | 
| 556 | 540 | 
| 557 // Entry point | 541 // Entry point | 
| 558 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
      nsigned long validFlagsMask) | 542 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
      nsigned long validFlagsMask) | 
| 559 { | 543 { | 
| 560   try | 544   try | 
| 561   { | 545   { | 
| 562     DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); | 546     DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); | 
| 563     bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL
      ECMDIDF_WINDOWSTATE_ENABLED) | 547     bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL
      ECMDIDF_WINDOWSTATE_ENABLED) | 
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 982       } | 966       } | 
| 983     } | 967     } | 
| 984   } | 968   } | 
| 985   s_criticalSectionLocal.Unlock(); | 969   s_criticalSectionLocal.Unlock(); | 
| 986 | 970 | 
| 987   return result; | 971   return result; | 
| 988 } | 972 } | 
| 989 | 973 | 
| 990 CPluginTab* CPluginClass::GetTab() | 974 CPluginTab* CPluginClass::GetTab() | 
| 991 { | 975 { | 
| 992   return m_tab; | 976   return m_data->tab.get(); | 
| 993 } | 977 } | 
| 994 | 978 | 
| 995 CPluginTab* CPluginClass::GetTab(DWORD dwThreadId) | 979 CPluginTab* CPluginClass::GetTab(DWORD dwThreadId) | 
| 996 { | 980 { | 
| 997   CPluginTab* tab = NULL; | 981   CPluginTab* tab = NULL; | 
| 998 | 982 | 
| 999   s_criticalSectionLocal.Lock(); | 983   s_criticalSectionLocal.Lock(); | 
| 1000   { | 984   { | 
| 1001     std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(dw
      ThreadId); | 985     std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(dw
      ThreadId); | 
| 1002     if (it != s_threadInstances.end()) | 986     if (it != s_threadInstances.end()) | 
| 1003     { | 987     { | 
| 1004       tab = it->second->m_tab; | 988       tab = it->second->m_data->tab.get(); | 
| 1005     } | 989     } | 
| 1006   } | 990   } | 
| 1007   s_criticalSectionLocal.Unlock(); | 991   s_criticalSectionLocal.Unlock(); | 
| 1008 | 992 | 
| 1009   return tab; | 993   return tab; | 
| 1010 } | 994 } | 
| 1011 | 995 | 
| 1012 // Entry point | 996 // Entry point | 
| 1013 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
      LECMD prgCmds[], OLECMDTEXT* pCmdText) | 997 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
      LECMD prgCmds[], OLECMDTEXT* pCmdText) | 
| 1014 { | 998 { | 
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1239 { | 1223 { | 
| 1240   try | 1224   try | 
| 1241   { | 1225   { | 
| 1242     HWND hBrowserWnd = GetBrowserHWND(); | 1226     HWND hBrowserWnd = GetBrowserHWND(); | 
| 1243     if (!hBrowserWnd) | 1227     if (!hBrowserWnd) | 
| 1244     { | 1228     { | 
| 1245       return E_FAIL; | 1229       return E_FAIL; | 
| 1246     } | 1230     } | 
| 1247 | 1231 | 
| 1248     // Create menu | 1232     // Create menu | 
| 1249     HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); | 1233     HMENU hMenu = CreatePluginMenu(m_data->tab->GetDocumentUrl()); | 
| 1250     if (!hMenu) | 1234     if (!hMenu) | 
| 1251     { | 1235     { | 
| 1252       return E_FAIL; | 1236       return E_FAIL; | 
| 1253     } | 1237     } | 
| 1254 | 1238 | 
| 1255     // Check if button in toolbar was pressed | 1239     // Check if button in toolbar was pressed | 
| 1256     int nIDCommand = -1; | 1240     int nIDCommand = -1; | 
| 1257     BOOL bRightAlign = FALSE; | 1241     BOOL bRightAlign = FALSE; | 
| 1258 | 1242 | 
| 1259     POINT pt; | 1243     POINT pt; | 
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1655   if (m_hPaneWnd == NULL) | 1639   if (m_hPaneWnd == NULL) | 
| 1656   { | 1640   { | 
| 1657     CreateStatusBarPane(); | 1641     CreateStatusBarPane(); | 
| 1658   } | 1642   } | 
| 1659   if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1643   if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 
| 1660   { | 1644   { | 
| 1661       DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
      ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1645       DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
      ATE_STATUSBAR, "Class::Invalidate statusbar"); | 
| 1662   } | 1646   } | 
| 1663 } | 1647 } | 
| 1664 | 1648 | 
| 1665 |  | 
| 1666 void CPluginClass::Unadvise() | 1649 void CPluginClass::Unadvise() | 
| 1667 { | 1650 { | 
| 1668   if (!m_webBrowser2) | 1651   if (!m_data->webBrowser2) | 
| 1669   { | 1652   { | 
| 1670     DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::Unadvise - Reached with m_webBrowser
      2 == nullptr"); | 1653     DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::Unadvise - Reached with webBrowser2 
      == nullptr"); | 
| 1671     return; | 1654     return; | 
| 1672   } | 1655   } | 
| 1673   s_criticalSectionLocal.Lock(); | 1656   s_criticalSectionLocal.Lock(); | 
| 1674   { | 1657   { | 
| 1675     if (m_isAdvised) | 1658     if (m_isAdvised) | 
| 1676     { | 1659     { | 
| 1677       HRESULT hr = DispEventUnadvise(m_webBrowser2); | 1660       HRESULT hr = DispEventUnadvise(m_data->webBrowser2); | 
| 1678       if (FAILED(hr)) | 1661       if (FAILED(hr)) | 
| 1679       { | 1662       { | 
| 1680         DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
      E, "Class::Unadvise - Unadvise"); | 1663         DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
      E, "Class::Unadvise - Unadvise"); | 
| 1681       } | 1664       } | 
| 1682       m_isAdvised = false; | 1665       m_isAdvised = false; | 
| 1683     } | 1666     } | 
| 1684   } | 1667   } | 
| 1685   s_criticalSectionLocal.Unlock(); | 1668   s_criticalSectionLocal.Unlock(); | 
| 1686 } | 1669 } | 
| 1687 | 1670 | 
|  | 1671 void CPluginClass::EnsureWebBrowserConnected(const ATL::CComPtr<IWebBrowser2>& w
      ebBrowser) | 
|  | 1672 { | 
|  | 1673   auto it = m_data->connectedWebBrowsersCache.find(webBrowser); | 
|  | 1674   if (it != m_data->connectedWebBrowsersCache.end()) | 
|  | 1675   { | 
|  | 1676     return; | 
|  | 1677   } | 
|  | 1678   ATL::CComObject<WebBrowserEventsListener>* listenerImpl = nullptr; | 
|  | 1679   if (FAILED(ATL::CComObject<WebBrowserEventsListener>::CreateInstance(&listener
      Impl))) | 
|  | 1680   { | 
|  | 1681     return; | 
|  | 1682   } | 
|  | 1683   ATL::CComPtr<IUnknown> listenerRefCounterGuard(listenerImpl->GetUnknown()); | 
|  | 1684   std::weak_ptr<Data> dataForCapturing = m_data; | 
|  | 1685   auto onListenerDestroy = [webBrowser, dataForCapturing] | 
|  | 1686   { | 
|  | 1687     if (auto data = dataForCapturing.lock()) | 
|  | 1688     { | 
|  | 1689       data->connectedWebBrowsersCache.erase(webBrowser); | 
|  | 1690     } | 
|  | 1691   }; | 
|  | 1692   auto onReloaded = [webBrowser, dataForCapturing] | 
|  | 1693   { | 
|  | 1694     if (auto data = dataForCapturing.lock()) | 
|  | 1695     { | 
|  | 1696       auto frameSrc = GetLocationUrl(*webBrowser); | 
|  | 1697       data->tab->OnDocumentComplete(webBrowser, frameSrc, data->webBrowser2.IsEq
      ualObject(webBrowser)); | 
|  | 1698     } | 
|  | 1699   }; | 
|  | 1700   if (FAILED(listenerImpl->Init(webBrowser, onListenerDestroy, onReloaded))) | 
|  | 1701   { | 
|  | 1702     return; | 
|  | 1703   } | 
|  | 1704   m_data->connectedWebBrowsersCache.emplace(webBrowser, listenerImpl); | 
|  | 1705 } | 
|  | 1706 | 
| 1688 HICON CPluginClass::GetIcon(int type) | 1707 HICON CPluginClass::GetIcon(int type) | 
| 1689 { | 1708 { | 
| 1690   HICON icon = NULL; | 1709   HICON icon = NULL; | 
| 1691 | 1710 | 
| 1692   s_criticalSectionLocal.Lock(); | 1711   s_criticalSectionLocal.Lock(); | 
| 1693   { | 1712   { | 
| 1694     if (!s_hIcons[type]) | 1713     if (!s_hIcons[type]) | 
| 1695     { | 1714     { | 
| 1696       std::wstring imageToLoad = L"#"; | 1715       std::wstring imageToLoad = L"#"; | 
| 1697       imageToLoad += std::to_wstring(s_hIconTypes[type]); | 1716       imageToLoad += std::to_wstring(s_hIconTypes[type]); | 
| 1698       s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(), 
      IMAGE_ICON, iconWidth, iconHeight, LR_SHARED); | 1717       s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(), 
      IMAGE_ICON, iconWidth, iconHeight, LR_SHARED); | 
| 1699       if (!s_hIcons[type]) | 1718       if (!s_hIcons[type]) | 
| 1700       { | 1719       { | 
| 1701         DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_
      ICON, "Class::GetIcon - LoadIcon"); | 1720         DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_
      ICON, "Class::GetIcon - LoadIcon"); | 
| 1702       } | 1721       } | 
| 1703     } | 1722     } | 
| 1704 | 1723 | 
| 1705     icon = s_hIcons[type]; | 1724     icon = s_hIcons[type]; | 
| 1706   } | 1725   } | 
| 1707   s_criticalSectionLocal.Unlock(); | 1726   s_criticalSectionLocal.Unlock(); | 
| 1708 | 1727 | 
| 1709   return icon; | 1728   return icon; | 
| 1710 } | 1729 } | 
| 1711 | 1730 | 
| 1712 ATOM CPluginClass::GetAtomPaneClass() | 1731 ATOM CPluginClass::GetAtomPaneClass() | 
| 1713 { | 1732 { | 
| 1714   return s_atomPaneClass; | 1733   return s_atomPaneClass; | 
| 1715 } | 1734 } | 
| 1716 | 1735 | 
| OLD | NEW | 
|---|