| 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-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2015 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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 CLOSETHEMEDATA pfnClose = NULL; | 53 CLOSETHEMEDATA pfnClose = NULL; |
| 54 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; | 54 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; |
| 55 OPENTHEMEDATA pfnOpenThemeData = NULL; | 55 OPENTHEMEDATA pfnOpenThemeData = NULL; |
| 56 | 56 |
| 57 ATOM CPluginClass::s_atomPaneClass = NULL; | 57 ATOM CPluginClass::s_atomPaneClass = NULL; |
| 58 HINSTANCE CPluginClass::s_hUxtheme = NULL; | 58 HINSTANCE CPluginClass::s_hUxtheme = NULL; |
| 59 std::set<CPluginClass*> CPluginClass::s_instances; | 59 std::set<CPluginClass*> CPluginClass::s_instances; |
| 60 std::map<DWORD, CPluginClass*> CPluginClass::s_threadInstances; | 60 std::map<DWORD, CPluginClass*> CPluginClass::s_threadInstances; |
| 61 | 61 |
| 62 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal; | 62 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal; |
| 63 CComAutoCriticalSection CPluginClass::s_criticalSectionBrowser; | |
| 64 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow; | 63 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow; |
| 65 | 64 |
| 66 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2; | 65 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2; |
| 67 | 66 |
| 68 /* | 67 /* |
| 69 * Without namespace declaration, the identifier "Rectangle" is ambiguous | 68 * Without namespace declaration, the identifier "Rectangle" is ambiguous |
| 70 * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85)
.aspx | 69 * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85)
.aspx |
| 71 */ | 70 */ |
| 72 namespace AdblockPlus | 71 namespace AdblockPlus |
| 73 { | 72 { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 84 } | 83 } |
| 85 | 84 |
| 86 int Width() const | 85 int Width() const |
| 87 { | 86 { |
| 88 return right - left; | 87 return right - left; |
| 89 } | 88 } |
| 90 }; | 89 }; |
| 91 } | 90 } |
| 92 | 91 |
| 93 CPluginClass::CPluginClass() | 92 CPluginClass::CPluginClass() |
| 93 : m_webBrowser2(nullptr) |
| 94 { | 94 { |
| 95 //Use this line to debug memory leaks | 95 //Use this line to debug memory leaks |
| 96 // _CrtDumpMemoryLeaks(); | 96 // _CrtDumpMemoryLeaks(); |
| 97 | 97 |
| 98 m_isAdvised = false; | 98 m_isAdvised = false; |
| 99 m_hTabWnd = NULL; | 99 m_hTabWnd = NULL; |
| 100 m_hStatusBarWnd = NULL; | 100 m_hStatusBarWnd = NULL; |
| 101 m_hPaneWnd = NULL; | 101 m_hPaneWnd = NULL; |
| 102 m_nPaneWidth = 0; | 102 m_nPaneWidth = 0; |
| 103 m_pWndProcStatus = NULL; | 103 m_pWndProcStatus = NULL; |
| 104 m_hTheme = NULL; | 104 m_hTheme = NULL; |
| 105 m_isInitializedOk = false; | 105 m_isInitializedOk = false; |
| 106 | 106 |
| 107 | 107 |
| 108 m_tab = new CPluginTab(this); | 108 m_tab = new CPluginTab(this); |
| 109 | 109 |
| 110 Dictionary::Create(GetBrowserLanguage()); | 110 Dictionary::Create(GetBrowserLanguage()); |
| 111 } | 111 } |
| 112 | 112 |
| 113 CPluginClass::~CPluginClass() | 113 CPluginClass::~CPluginClass() |
| 114 { | 114 { |
| 115 delete m_tab; | 115 delete m_tab; |
| 116 } | 116 } |
| 117 | 117 |
| 118 | |
| 119 ///////////////////////////////////////////////////////////////////////////// | |
| 120 // Initialization | |
| 121 | |
| 122 HRESULT CPluginClass::FinalConstruct() | |
| 123 { | |
| 124 return S_OK; | |
| 125 } | |
| 126 | |
| 127 void CPluginClass::FinalRelease() | |
| 128 { | |
| 129 s_criticalSectionBrowser.Lock(); | |
| 130 { | |
| 131 m_webBrowser2.Release(); | |
| 132 } | |
| 133 s_criticalSectionBrowser.Unlock(); | |
| 134 } | |
| 135 | |
| 136 HWND CPluginClass::GetBrowserHWND() const | 118 HWND CPluginClass::GetBrowserHWND() const |
| 137 { | 119 { |
| 138 SHANDLE_PTR hBrowserWndHandle = NULL; | 120 if (!m_webBrowser2) |
| 139 | |
| 140 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | |
| 141 if (browser) | |
| 142 { | 121 { |
| 143 HRESULT hr = browser->get_HWND(&hBrowserWndHandle); | 122 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserHWND - Reached with m_webB
rowser2 == nullptr"); |
| 144 if (FAILED(hr)) | 123 return nullptr; |
| 145 { | |
| 146 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_BROWSER_WINDOW, "
Class::GetBrowserHWND - failed") | |
| 147 } | |
| 148 } | 124 } |
| 149 | 125 SHANDLE_PTR hBrowserWndHandle = 0; |
| 126 HRESULT hr = m_webBrowser2->get_HWND(&hBrowserWndHandle); |
| 127 if (FAILED(hr)) |
| 128 { |
| 129 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_BROWSER_WINDOW, "Cl
ass::GetBrowserHWND - failed"); |
| 130 return nullptr; |
| 131 } |
| 150 return (HWND)hBrowserWndHandle; | 132 return (HWND)hBrowserWndHandle; |
| 151 } | 133 } |
| 152 | 134 |
| 153 | 135 bool CPluginClass::IsRootBrowser(IWebBrowser2* otherBrowser) |
| 154 CComQIPtr<IWebBrowser2> CPluginClass::GetBrowser() const | |
| 155 { | 136 { |
| 156 CComQIPtr<IWebBrowser2> browser; | 137 return m_webBrowser2.IsEqualObject(otherBrowser); |
| 157 | |
| 158 s_criticalSectionBrowser.Lock(); | |
| 159 { | |
| 160 browser = m_webBrowser2; | |
| 161 } | |
| 162 s_criticalSectionBrowser.Unlock(); | |
| 163 | |
| 164 return browser; | |
| 165 } | 138 } |
| 166 | 139 |
| 167 | |
| 168 CComQIPtr<IWebBrowser2> CPluginClass::GetAsyncBrowser() | 140 CComQIPtr<IWebBrowser2> CPluginClass::GetAsyncBrowser() |
| 169 { | 141 { |
| 170 CComQIPtr<IWebBrowser2> browser; | 142 CComQIPtr<IWebBrowser2> browser; |
| 171 | 143 |
| 172 s_criticalSectionLocal.Lock(); | 144 s_criticalSectionLocal.Lock(); |
| 173 { | 145 { |
| 174 browser = s_asyncWebBrowser2; | 146 browser = s_asyncWebBrowser2; |
| 175 } | 147 } |
| 176 s_criticalSectionLocal.Unlock(); | 148 s_criticalSectionLocal.Unlock(); |
| 177 | 149 |
| 178 return browser; | 150 return browser; |
| 179 } | 151 } |
| 180 | 152 |
| 181 std::wstring CPluginClass::GetBrowserUrl() const | 153 std::wstring CPluginClass::GetBrowserUrl() const |
| 182 { | 154 { |
| 183 std::wstring url; | 155 std::wstring url; |
| 184 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 156 if (m_webBrowser2) |
| 185 if (browser) | |
| 186 { | 157 { |
| 187 CComBSTR bstrURL; | 158 CComBSTR bstrURL; |
| 188 if (SUCCEEDED(browser->get_LocationURL(&bstrURL)) && bstrURL) | 159 if (SUCCEEDED(m_webBrowser2->get_LocationURL(&bstrURL)) && bstrURL) |
| 189 { | 160 { |
| 190 url = std::wstring(bstrURL, SysStringLen(bstrURL)); | 161 url = std::wstring(bstrURL, SysStringLen(bstrURL)); |
| 191 } | 162 } |
| 192 } | 163 } |
| 193 else | 164 else |
| 194 { | 165 { |
| 166 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserUrl - Reached with m_webBr
owser2 == nullptr"); |
| 195 url = m_tab->GetDocumentUrl(); | 167 url = m_tab->GetDocumentUrl(); |
| 196 } | 168 } |
| 197 return url; | 169 return url; |
| 198 } | 170 } |
| 199 | 171 |
| 200 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 172 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
| 201 { | 173 { |
| 202 if (thisPtr == NULL) | 174 if (thisPtr == NULL) |
| 203 return 0; | 175 return 0; |
| 204 if (!((CPluginClass*)thisPtr)->InitObject()) | 176 if (!((CPluginClass*)thisPtr)->InitObject()) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 227 { | 199 { |
| 228 | 200 |
| 229 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
====================================") | 201 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
====================================") |
| 230 | 202 |
| 231 HRESULT hr = ::CoInitialize(NULL); | 203 HRESULT hr = ::CoInitialize(NULL); |
| 232 if (FAILED(hr)) | 204 if (FAILED(hr)) |
| 233 { | 205 { |
| 234 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); | 206 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); |
| 235 } | 207 } |
| 236 | 208 |
| 237 s_criticalSectionBrowser.Lock(); | 209 /* |
| 210 * We were instantiated as a BHO, so our site is always of type IWebBrowse
r2. |
| 211 */ |
| 212 m_webBrowser2 = ATL::CComQIPtr<IWebBrowser2>(unknownSite); |
| 213 if (!m_webBrowser2) |
| 238 { | 214 { |
| 239 m_webBrowser2 = unknownSite; | 215 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p
ointer to IWebBrowser2*"); |
| 240 } | 216 } |
| 241 s_criticalSectionBrowser.Unlock(); | |
| 242 | 217 |
| 243 //register the mimefilter | 218 //register the mimefilter |
| 244 //and only mimefilter | 219 //and only mimefilter |
| 245 //on some few computers the mimefilter does not get properly registered wh
en it is done on another thread | 220 //on some few computers the mimefilter does not get properly registered wh
en it is done on another thread |
| 246 | |
| 247 s_criticalSectionLocal.Lock(); | 221 s_criticalSectionLocal.Lock(); |
| 248 { | 222 { |
| 249 // Always register on startup, then check if we need to unregister in a
separate thread | 223 // Always register on startup, then check if we need to unregister in a
separate thread |
| 250 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 224 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 251 s_asyncWebBrowser2 = unknownSite; | 225 s_asyncWebBrowser2 = unknownSite; |
| 252 s_instances.insert(this); | 226 s_instances.insert(this); |
| 253 } | 227 } |
| 254 s_criticalSectionLocal.Unlock(); | 228 s_criticalSectionLocal.Unlock(); |
| 255 | 229 |
| 256 try | 230 try |
| 257 { | 231 { |
| 258 auto webBrowser = GetBrowser(); | 232 DEBUG_GENERAL("Loaded as BHO"); |
| 259 if (webBrowser) | 233 HRESULT hr = DispEventAdvise(m_webBrowser2); |
| 234 if (SUCCEEDED(hr)) |
| 260 { | 235 { |
| 261 DEBUG_GENERAL("Loaded as BHO"); | 236 m_isAdvised = true; |
| 262 HRESULT hr = DispEventAdvise(webBrowser); | 237 try |
| 263 if (SUCCEEDED(hr)) | |
| 264 { | 238 { |
| 265 m_isAdvised = true; | 239 std::thread startInitObjectThread(StartInitObject, this); |
| 266 try | 240 startInitObjectThread.detach(); // TODO: but actually we should wait
for the thread in the dtr. |
| 267 { | |
| 268 std::thread startInitObjectThread(StartInitObject, this); | |
| 269 startInitObjectThread.detach(); // TODO: but actually we should wa
it for the thread in the dtr. | |
| 270 } | |
| 271 catch (const std::system_error& ex) | |
| 272 { | |
| 273 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_
THREAD_CREATE_PROCESS, | |
| 274 "Class::Thread - Failed to create StartInitObject thread"); | |
| 275 } | |
| 276 } | 241 } |
| 277 else | 242 catch (const std::system_error& ex) |
| 278 { | 243 { |
| 279 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV
ICE, "Class::SetSite - Advise"); | 244 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
READ_CREATE_PROCESS, |
| 245 "Class::Thread - Failed to create StartInitObject thread"); |
| 280 } | 246 } |
| 281 } | 247 } |
| 248 else |
| 249 { |
| 250 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVIC
E, "Class::SetSite - Advise"); |
| 251 } |
| 282 } | 252 } |
| 283 catch (const std::runtime_error& ex) | 253 catch (const std::runtime_error& ex) |
| 284 { | 254 { |
| 285 DEBUG_EXCEPTION(ex); | 255 DEBUG_EXCEPTION(ex); |
| 286 Unadvise(); | 256 Unadvise(); |
| 287 } | 257 } |
| 288 } | 258 } |
| 289 else | 259 else |
| 290 { | 260 { |
| 291 Unadvise(); | 261 Unadvise(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 321 s_threadInstances.erase(it); | 291 s_threadInstances.erase(it); |
| 322 } | 292 } |
| 323 if (s_instances.empty()) | 293 if (s_instances.empty()) |
| 324 { | 294 { |
| 325 // TODO: Explicitly releasing a resource when a container becomes empt
y looks like a job better suited for shared_ptr | 295 // TODO: Explicitly releasing a resource when a container becomes empt
y looks like a job better suited for shared_ptr |
| 326 CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 296 CPluginClientFactory::ReleaseMimeFilterClientInstance(); |
| 327 } | 297 } |
| 328 } | 298 } |
| 329 s_criticalSectionLocal.Unlock(); | 299 s_criticalSectionLocal.Unlock(); |
| 330 | 300 |
| 331 // Release browser interface | 301 m_webBrowser2 = nullptr; |
| 332 s_criticalSectionBrowser.Lock(); | |
| 333 { | |
| 334 m_webBrowser2.Release(); | |
| 335 } | |
| 336 s_criticalSectionBrowser.Unlock(); | |
| 337 | 302 |
| 338 DEBUG_GENERAL("===========================================================
=====================\nNEW TAB UI - END\n=======================================
=========================================") | 303 DEBUG_GENERAL("===========================================================
=====================\nNEW TAB UI - END\n=======================================
=========================================") |
| 339 | 304 |
| 340 ::CoUninitialize(); | 305 ::CoUninitialize(); |
| 341 } | 306 } |
| 342 | 307 |
| 343 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | |
| 344 } | 308 } |
| 345 catch (...) | 309 catch (...) |
| 346 { | 310 { |
| 347 } | 311 } |
| 312 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); |
| 348 return S_OK; | 313 return S_OK; |
| 349 } | 314 } |
| 350 | 315 |
| 351 bool CPluginClass::IsStatusBarEnabled() | 316 bool CPluginClass::IsStatusBarEnabled() |
| 352 { | 317 { |
| 353 DEBUG_GENERAL("IsStatusBarEnabled start"); | 318 DEBUG_GENERAL("IsStatusBarEnabled start"); |
| 354 HKEY pHkey; | 319 HKEY pHkey; |
| 355 HKEY pHkeySub; | 320 HKEY pHkeySub; |
| 356 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); | 321 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); |
| 357 DWORD truth = 1; | 322 DWORD truth = 1; |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 return; | 448 return; |
| 484 } | 449 } |
| 485 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); | 450 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); |
| 486 | 451 |
| 487 // If webbrowser2 is equal to top level browser (as set in SetSite), we are | 452 // If webbrowser2 is equal to top level browser (as set in SetSite), we are |
| 488 // navigating new page | 453 // navigating new page |
| 489 CPluginClient* client = CPluginClient::GetInstance(); | 454 CPluginClient* client = CPluginClient::GetInstance(); |
| 490 if (url.find(L"javascript") == 0) | 455 if (url.find(L"javascript") == 0) |
| 491 { | 456 { |
| 492 } | 457 } |
| 493 else if (GetBrowser().IsEqualObject(webBrowser)) | 458 else if (IsRootBrowser(webBrowser)) |
| 494 { | 459 { |
| 495 m_tab->OnNavigate(url); | 460 m_tab->OnNavigate(url); |
| 496 DEBUG_GENERAL( | 461 DEBUG_GENERAL( |
| 497 L"========================================================================
========\n" | 462 L"========================================================================
========\n" |
| 498 L"Begin main navigation url:" + url + L"\n" | 463 L"Begin main navigation url:" + url + L"\n" |
| 499 L"========================================================================
========") | 464 L"========================================================================
========") |
| 500 | 465 |
| 501 #ifdef ENABLE_DEBUG_RESULT | 466 #ifdef ENABLE_DEBUG_RESULT |
| 502 CPluginDebug::DebugResultDomain(url); | 467 CPluginDebug::DebugResultDomain(url); |
| 503 #endif | 468 #endif |
| 504 UpdateStatusBar(); | 469 UpdateStatusBar(); |
| 505 } | 470 } |
| 506 else | 471 else |
| 507 { | 472 { |
| 508 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) | 473 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) |
| 509 m_tab->CacheFrame(url); | 474 m_tab->CacheFrame(url); |
| 510 } | 475 } |
| 511 } | 476 } |
| 512 catch (...) | 477 catch (...) |
| 513 { | 478 { |
| 514 } | 479 } |
| 515 } | 480 } |
| 516 | 481 |
| 517 // Entry point | 482 // Entry point |
| 518 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() | 483 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() |
| 519 { | 484 { |
| 520 try | 485 try |
| 521 { | 486 { |
| 487 if (!m_webBrowser2) |
| 488 { |
| 489 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with
m_webBrowser2 == nullptr"); |
| 490 return; |
| 491 } |
| 522 DEBUG_NAVI(L"Navi::Download Complete") | 492 DEBUG_NAVI(L"Navi::Download Complete") |
| 523 ATL::CComPtr<IWebBrowser2> browser = GetBrowser(); | 493 m_tab->OnDownloadComplete(m_webBrowser2); |
| 524 if (browser) | |
| 525 { | |
| 526 m_tab->OnDownloadComplete(browser); | |
| 527 } | |
| 528 } | 494 } |
| 529 catch (...) | 495 catch (...) |
| 530 { | 496 { |
| 531 } | 497 } |
| 532 } | 498 } |
| 533 | 499 |
| 534 // Entry point | 500 // Entry point |
| 535 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) | 501 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) |
| 536 { | 502 { |
| 537 try | 503 try |
| 538 { | 504 { |
| 539 DEBUG_NAVI(L"Navi::Document Complete"); | 505 DEBUG_NAVI(L"Navi::Document Complete"); |
| 540 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; | 506 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; |
| 541 if (!webBrowser2) | 507 if (!webBrowser2) |
| 542 { | 508 { |
| 543 return; | 509 return; |
| 544 } | 510 } |
| 545 std::wstring frameSrc = GetLocationUrl(*webBrowser2); | 511 std::wstring frameSrc = GetLocationUrl(*webBrowser2); |
| 546 bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2); | 512 m_tab->OnDocumentComplete(webBrowser2, frameSrc, IsRootBrowser(webBrowser2))
; |
| 547 m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser); | |
| 548 } | 513 } |
| 549 catch (...) | 514 catch (...) |
| 550 { | 515 { |
| 551 } | 516 } |
| 552 } | 517 } |
| 553 | 518 |
| 554 // Entry point | 519 // Entry point |
| 555 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) | 520 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) |
| 556 { | 521 { |
| 557 try | 522 try |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 { | 581 { |
| 617 Unadvise(); | 582 Unadvise(); |
| 618 } | 583 } |
| 619 catch (...) | 584 catch (...) |
| 620 { | 585 { |
| 621 } | 586 } |
| 622 } | 587 } |
| 623 | 588 |
| 624 bool CPluginClass::InitObject() | 589 bool CPluginClass::InitObject() |
| 625 { | 590 { |
| 626 DEBUG_GENERAL("InitObject"); | 591 DEBUG_GENERAL("InitObject - begin"); |
| 627 CPluginSettings* settings = CPluginSettings::GetInstance(); | 592 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 628 | 593 |
| 629 if (!settings->GetPluginEnabled()) | 594 if (!settings->GetPluginEnabled()) |
| 630 { | 595 { |
| 631 s_mimeFilter->Unregister(); | 596 s_mimeFilter->Unregister(); |
| 632 } | 597 } |
| 633 | 598 |
| 634 // Load theme module | 599 // Load theme module |
| 635 s_criticalSectionLocal.Lock(); | 600 s_criticalSectionLocal.Lock(); |
| 636 { | 601 { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 if (((m_hPaneWnd == NULL) || !IsStatusBarEnabled()) && isFirstRun) | 694 if (((m_hPaneWnd == NULL) || !IsStatusBarEnabled()) && isFirstRun) |
| 730 { | 695 { |
| 731 ShowStatusBar(); | 696 ShowStatusBar(); |
| 732 } | 697 } |
| 733 | 698 |
| 734 // Enable acceptable ads by default | 699 // Enable acceptable ads by default |
| 735 std::wstring aaUrl = CPluginClient::GetInstance()->GetPref(L"subscriptions_e
xceptionsurl", L""); | 700 std::wstring aaUrl = CPluginClient::GetInstance()->GetPref(L"subscriptions_e
xceptionsurl", L""); |
| 736 CPluginClient::GetInstance()->AddSubscription(aaUrl); | 701 CPluginClient::GetInstance()->AddSubscription(aaUrl); |
| 737 } | 702 } |
| 738 s_criticalSectionLocal.Unlock(); | 703 s_criticalSectionLocal.Unlock(); |
| 704 |
| 705 DEBUG_GENERAL("InitObject - end"); |
| 739 return true; | 706 return true; |
| 740 } | 707 } |
| 741 | 708 |
| 742 bool CPluginClass::CreateStatusBarPane() | 709 bool CPluginClass::CreateStatusBarPane() |
| 743 { | 710 { |
| 744 CriticalSection::Lock lock(m_csStatusBar); | 711 CriticalSection::Lock lock(m_csStatusBar); |
| 745 | 712 |
| 746 CPluginClient* client = CPluginClient::GetInstance(); | 713 CPluginClient* client = CPluginClient::GetInstance(); |
| 747 | 714 |
| 748 std::array<wchar_t, MAX_PATH> className; | 715 std::array<wchar_t, MAX_PATH> className; |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1617 } | 1584 } |
| 1618 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1585 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) |
| 1619 { | 1586 { |
| 1620 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1587 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); |
| 1621 } | 1588 } |
| 1622 } | 1589 } |
| 1623 | 1590 |
| 1624 | 1591 |
| 1625 void CPluginClass::Unadvise() | 1592 void CPluginClass::Unadvise() |
| 1626 { | 1593 { |
| 1594 if (!m_webBrowser2) |
| 1595 { |
| 1596 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::Unadvise - Reached with m_webBrowser
2 == nullptr"); |
| 1597 return; |
| 1598 } |
| 1627 s_criticalSectionLocal.Lock(); | 1599 s_criticalSectionLocal.Lock(); |
| 1628 { | 1600 { |
| 1629 if (m_isAdvised) | 1601 if (m_isAdvised) |
| 1630 { | 1602 { |
| 1631 HRESULT hr = DispEventUnadvise(GetBrowser()); | 1603 HRESULT hr = DispEventUnadvise(m_webBrowser2); |
| 1632 if (FAILED(hr)) | 1604 if (FAILED(hr)) |
| 1633 { | 1605 { |
| 1634 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
E, "Class::Unadvise - Unadvise"); | 1606 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
E, "Class::Unadvise - Unadvise"); |
| 1635 } | 1607 } |
| 1636 m_isAdvised = false; | 1608 m_isAdvised = false; |
| 1637 } | 1609 } |
| 1638 } | 1610 } |
| 1639 s_criticalSectionLocal.Unlock(); | 1611 s_criticalSectionLocal.Unlock(); |
| 1640 } | 1612 } |
| 1641 | 1613 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1661 s_criticalSectionLocal.Unlock(); | 1633 s_criticalSectionLocal.Unlock(); |
| 1662 | 1634 |
| 1663 return icon; | 1635 return icon; |
| 1664 } | 1636 } |
| 1665 | 1637 |
| 1666 ATOM CPluginClass::GetAtomPaneClass() | 1638 ATOM CPluginClass::GetAtomPaneClass() |
| 1667 { | 1639 { |
| 1668 return s_atomPaneClass; | 1640 return s_atomPaneClass; |
| 1669 } | 1641 } |
| 1670 | 1642 |
| 1671 HWND CPluginClass::GetTabHWND() const | |
| 1672 { | |
| 1673 std::array<wchar_t, MAX_PATH> className; | |
| 1674 // Get browser window and url | |
| 1675 HWND hBrowserWnd = GetBrowserHWND(); | |
| 1676 if (!hBrowserWnd) | |
| 1677 { | |
| 1678 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C
lass::GetTabWindow - No tab window") | |
| 1679 s_criticalSectionWindow.Unlock(); | |
| 1680 | |
| 1681 return false; | |
| 1682 } | |
| 1683 | |
| 1684 // Looking for a TabWindowClass window in IE7 | |
| 1685 | |
| 1686 HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | |
| 1687 while (hTabWnd) | |
| 1688 { | |
| 1689 className[0] = L'\0'; | |
| 1690 int classNameLength = GetClassNameW(hTabWnd, className.data(), className.siz
e()); | |
| 1691 | |
| 1692 if (classNameLength && (wcscmp(className.data(), L"TabWindowClass") == 0 ||
wcscmp(className.data(), L"Frame Tab") == 0)) | |
| 1693 { | |
| 1694 // IE8 support | |
| 1695 HWND hTabWnd2 = hTabWnd; | |
| 1696 if (wcscmp(className.data(), L"Frame Tab") == 0) | |
| 1697 { | |
| 1698 hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); | |
| 1699 } | |
| 1700 | |
| 1701 if (hTabWnd2) | |
| 1702 { | |
| 1703 DWORD nProcessId; | |
| 1704 ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); | |
| 1705 if (::GetCurrentProcessId() == nProcessId) | |
| 1706 { | |
| 1707 bool bExistingTab = false; | |
| 1708 s_criticalSectionLocal.Lock(); | |
| 1709 | |
| 1710 { | |
| 1711 for (auto instance : s_instances) | |
| 1712 { | |
| 1713 if (instance->m_hTabWnd == hTabWnd2) | |
| 1714 { | |
| 1715 bExistingTab = true; | |
| 1716 break; | |
| 1717 } | |
| 1718 } | |
| 1719 } | |
| 1720 | |
| 1721 if (!bExistingTab) | |
| 1722 { | |
| 1723 hBrowserWnd = hTabWnd2; | |
| 1724 hTabWnd = hTabWnd2; | |
| 1725 s_criticalSectionLocal.Unlock(); | |
| 1726 break; | |
| 1727 } | |
| 1728 s_criticalSectionLocal.Unlock(); | |
| 1729 | |
| 1730 } | |
| 1731 } | |
| 1732 } | |
| 1733 | |
| 1734 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | |
| 1735 } | |
| 1736 return hTabWnd; | |
| 1737 } | |
| OLD | NEW |