| 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 } | 83 } |
| 84 | 84 |
| 85 int Width() const | 85 int Width() const |
| 86 { | 86 { |
| 87 return right - left; | 87 return right - left; |
| 88 } | 88 } |
| 89 }; | 89 }; |
| 90 } | 90 } |
| 91 | 91 |
| 92 CPluginClass::CPluginClass() | 92 CPluginClass::CPluginClass() |
| 93 : m_webBrowser2(nullptr) | 93 : m_webBrowser2(nullptr), |
| 94 detachedInitializationFailed(false) |
| 94 { | 95 { |
| 95 DEBUG_GENERAL([this]() -> std::wstring | 96 DEBUG_GENERAL([this]() -> std::wstring |
| 96 { | 97 { |
| 97 std::wstring s = L"CPluginClass::<constructor>, this = "; | 98 std::wstring s = L"CPluginClass::<constructor>, this = "; |
| 98 s += ToHexLiteral(this); | 99 s += ToHexLiteral(this); |
| 99 return s; | 100 return s; |
| 100 }()); | 101 }()); |
| 101 | 102 |
| 102 //Use this line to debug memory leaks | 103 //Use this line to debug memory leaks |
| 103 // _CrtDumpMemoryLeaks(); | 104 // _CrtDumpMemoryLeaks(); |
| 104 | 105 |
| 105 m_isAdvised = false; | |
| 106 m_hTabWnd = NULL; | 106 m_hTabWnd = NULL; |
| 107 m_hStatusBarWnd = NULL; | 107 m_hStatusBarWnd = NULL; |
| 108 m_hPaneWnd = NULL; | 108 m_hPaneWnd = NULL; |
| 109 m_nPaneWidth = 0; | 109 m_nPaneWidth = 0; |
| 110 m_pWndProcStatus = NULL; | 110 m_pWndProcStatus = NULL; |
| 111 m_hTheme = NULL; | 111 m_hTheme = NULL; |
| 112 m_isInitializedOk = false; | 112 m_isInitializedOk = false; |
| 113 | 113 |
| 114 | 114 |
| 115 m_tab = new CPluginTab(); | 115 m_tab = new CPluginTab(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserUrl - Reached with m_webBr
owser2 == nullptr"); | 180 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserUrl - Reached with m_webBr
owser2 == nullptr"); |
| 181 url = m_tab->GetDocumentUrl(); | 181 url = m_tab->GetDocumentUrl(); |
| 182 } | 182 } |
| 183 return url; | 183 return url; |
| 184 } | 184 } |
| 185 | 185 |
| 186 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 186 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
| 187 { | 187 { |
| 188 if (thisPtr == NULL) | 188 if (thisPtr == NULL) |
| 189 return 0; | 189 return 0; |
| 190 if (!((CPluginClass*)thisPtr)->InitObject()) | 190 auto self = static_cast<CPluginClass*>(thisPtr); |
| 191 if (!self->InitObject()) |
| 191 { | 192 { |
| 192 ((CPluginClass*)thisPtr)->Unadvise(); | 193 self->detachedInitializationFailed = true; |
| 193 } | 194 } |
| 194 | |
| 195 return 0; | 195 return 0; |
| 196 } | 196 } |
| 197 | 197 |
| 198 /* | 198 /* |
| 199 * IE calls this when it creates a new browser window or tab, immediately after
it also | 199 * IE calls this when it creates a new browser window or tab, immediately after
it also |
| 200 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob
ject, | 200 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob
ject, |
| 201 * which is an IWebBrowser2 interface associated with the window/tab. | 201 * which is an IWebBrowser2 interface associated with the window/tab. |
| 202 * | 202 * |
| 203 * IE also ordinarily calls this again when its window/tab is closed, in which c
ase | 203 * IE also ordinarily calls this again when its window/tab is closed, in which c
ase |
| 204 * 'unknownSite' will be null. Extraordinarily, this is sometimes _not_ called w
hen IE | 204 * 'unknownSite' will be null. Extraordinarily, this is sometimes _not_ called w
hen IE |
| 205 * is shutting down. Thus 'SetSite(nullptr)' has some similarities with a destru
ctor, | 205 * is shutting down. Thus 'SetSite(nullptr)' has some similarities with a destru
ctor, |
| 206 * but it is not a proper substitute for one. | 206 * but it is not a proper substitute for one. |
| 207 */ | 207 */ |
| 208 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) | 208 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) |
| 209 { | 209 { |
| 210 try | 210 try |
| 211 { | 211 { |
| 212 if (unknownSite) | 212 if (unknownSite) |
| 213 { | 213 { |
| 214 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
===================================="); | 214 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
===================================="); |
| 215 | 215 |
| 216 HRESULT hr = ::CoInitialize(NULL); | 216 HRESULT hr = ::CoInitialize(NULL); |
| 217 if (FAILED(hr)) | 217 if (FAILED(hr)) |
| 218 { | 218 { |
| 219 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); | 219 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); |
| 220 } | 220 } |
| 221 | |
| 222 /* | 221 /* |
| 223 * We were instantiated as a BHO, so our site is always of type IWebBrowse
r2. | 222 * We were instantiated as a BHO, so our site is always of type IWebBrowse
r2. |
| 224 */ | 223 */ |
| 225 m_webBrowser2 = ATL::CComQIPtr<IWebBrowser2>(unknownSite); | 224 m_webBrowser2 = ATL::CComQIPtr<IWebBrowser2>(unknownSite); |
| 226 if (!m_webBrowser2) | 225 if (!m_webBrowser2) |
| 227 { | 226 { |
| 228 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p
ointer to IWebBrowser2*"); | 227 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p
ointer to IWebBrowser2*"); |
| 229 } | 228 } |
| 230 DEBUG_GENERAL([this]() -> std::wstring | 229 DEBUG_GENERAL([this]() -> std::wstring |
| 231 { | 230 { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 242 { | 241 { |
| 243 // Always register on startup, then check if we need to unregister in a
separate thread | 242 // Always register on startup, then check if we need to unregister in a
separate thread |
| 244 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 243 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 245 s_asyncWebBrowser2 = unknownSite; | 244 s_asyncWebBrowser2 = unknownSite; |
| 246 s_instances.insert(this); | 245 s_instances.insert(this); |
| 247 } | 246 } |
| 248 s_criticalSectionLocal.Unlock(); | 247 s_criticalSectionLocal.Unlock(); |
| 249 | 248 |
| 250 try | 249 try |
| 251 { | 250 { |
| 252 HRESULT hr = DispEventAdvise(m_webBrowser2); | 251 std::thread startInitObjectThread(StartInitObject, this); |
| 253 if (SUCCEEDED(hr)) | 252 startInitObjectThread.detach(); // TODO: but actually we should wait for
the thread in the dtr. |
| 254 { | |
| 255 m_isAdvised = true; | |
| 256 try | |
| 257 { | |
| 258 std::thread startInitObjectThread(StartInitObject, this); | |
| 259 startInitObjectThread.detach(); // TODO: but actually we should wait
for the thread in the dtr. | |
| 260 } | |
| 261 catch (const std::system_error& ex) | |
| 262 { | |
| 263 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
READ_CREATE_PROCESS, | |
| 264 "Class::Thread - Failed to create StartInitObject thread"); | |
| 265 } | |
| 266 } | |
| 267 else | |
| 268 { | |
| 269 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVIC
E, "Class::SetSite - Advise"); | |
| 270 } | |
| 271 } | 253 } |
| 272 catch (const std::runtime_error& ex) | 254 catch (const std::system_error& ex) |
| 273 { | 255 { |
| 274 DEBUG_EXCEPTION(ex); | 256 detachedInitializationFailed = true; |
| 275 Unadvise(); | 257 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_THREAD
_CREATE_PROCESS, |
| 258 "Class::Thread - Failed to create StartInitObject thread"); |
| 276 } | 259 } |
| 260 |
| 261 // Start events last to alleviate issues with deferred evaluation |
| 262 browserEvents.Start(this, m_webBrowser2); |
| 277 } | 263 } |
| 278 else | 264 else |
| 279 { | 265 { |
| 266 browserEvents.Stop(); |
| 280 DEBUG_GENERAL([this]() -> std::wstring | 267 DEBUG_GENERAL([this]() -> std::wstring |
| 281 { | 268 { |
| 282 std::wstringstream ss; | 269 std::wstringstream ss; |
| 283 ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this); | 270 ss << L"CPluginClass::SetSite, this = " << ToHexLiteral(this); |
| 284 ss << L", browser = nullptr"; | 271 ss << L", browser = nullptr"; |
| 285 return ss.str(); | 272 return ss.str(); |
| 286 }()); | 273 }()); |
| 287 | 274 |
| 288 Unadvise(); | |
| 289 | 275 |
| 290 // Destroy window | 276 // Destroy window |
| 291 if (m_pWndProcStatus) | 277 if (m_pWndProcStatus) |
| 292 { | 278 { |
| 293 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn
dProcStatus); | 279 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn
dProcStatus); |
| 294 | 280 |
| 295 m_pWndProcStatus = NULL; | 281 m_pWndProcStatus = NULL; |
| 296 } | 282 } |
| 297 | 283 |
| 298 if (m_hPaneWnd) | 284 if (m_hPaneWnd) |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 IDispatch* frameBrowserDisp /**< [in] */, | 444 IDispatch* frameBrowserDisp /**< [in] */, |
| 459 VARIANT* urlVariant /**< [in] */, | 445 VARIANT* urlVariant /**< [in] */, |
| 460 VARIANT* /**< [in] Flags*/, | 446 VARIANT* /**< [in] Flags*/, |
| 461 VARIANT* /**< [in] TargetFrameName*/, | 447 VARIANT* /**< [in] TargetFrameName*/, |
| 462 VARIANT* /**< [in] PostData*/, | 448 VARIANT* /**< [in] PostData*/, |
| 463 VARIANT* /**< [in] Headers*/, | 449 VARIANT* /**< [in] Headers*/, |
| 464 VARIANT_BOOL* /**< [in, out] Cancel*/) | 450 VARIANT_BOOL* /**< [in, out] Cancel*/) |
| 465 { | 451 { |
| 466 try | 452 try |
| 467 { | 453 { |
| 454 if (detachedInitializationFailed) return; |
| 455 |
| 468 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; | 456 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; |
| 469 if (!webBrowser) | 457 if (!webBrowser) |
| 470 { | 458 { |
| 471 return; | 459 return; |
| 472 } | 460 } |
| 473 if (!urlVariant || urlVariant->vt != VT_BSTR) | 461 if (!urlVariant || urlVariant->vt != VT_BSTR) |
| 474 { | 462 { |
| 475 return; | 463 return; |
| 476 } | 464 } |
| 477 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); | 465 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 502 } | 490 } |
| 503 } | 491 } |
| 504 catch (...) | 492 catch (...) |
| 505 { | 493 { |
| 506 } | 494 } |
| 507 } | 495 } |
| 508 | 496 |
| 509 // Entry point | 497 // Entry point |
| 510 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() | 498 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() |
| 511 { | 499 { |
| 500 if (detachedInitializationFailed) return; |
| 512 try | 501 try |
| 513 { | 502 { |
| 514 if (!m_webBrowser2) | 503 if (!m_webBrowser2) |
| 515 { | 504 { |
| 516 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with
m_webBrowser2 == nullptr"); | 505 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with
m_webBrowser2 == nullptr"); |
| 517 return; | 506 return; |
| 518 } | 507 } |
| 519 DEBUG_NAVI(L"Navi::Download Complete") | 508 DEBUG_NAVI(L"Navi::Download Complete") |
| 520 m_tab->OnDownloadComplete(m_webBrowser2); | 509 m_tab->OnDownloadComplete(m_webBrowser2); |
| 521 } | 510 } |
| 522 catch (...) | 511 catch (...) |
| 523 { | 512 { |
| 524 } | 513 } |
| 525 } | 514 } |
| 526 | 515 |
| 527 // Entry point | 516 // Entry point |
| 528 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) | 517 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) |
| 529 { | 518 { |
| 519 if (detachedInitializationFailed) return; |
| 530 try | 520 try |
| 531 { | 521 { |
| 532 DEBUG_NAVI(L"Navi::Document Complete"); | 522 DEBUG_NAVI(L"Navi::Document Complete"); |
| 533 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; | 523 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; |
| 534 if (!webBrowser2) | 524 if (!webBrowser2) |
| 535 { | 525 { |
| 536 return; | 526 return; |
| 537 } | 527 } |
| 538 std::wstring frameSrc = GetLocationUrl(*webBrowser2); | 528 std::wstring frameSrc = GetLocationUrl(*webBrowser2); |
| 539 m_tab->OnDocumentComplete(webBrowser2, frameSrc, IsRootBrowser(webBrowser2))
; | 529 m_tab->OnDocumentComplete(webBrowser2, frameSrc, IsRootBrowser(webBrowser2))
; |
| 540 } | 530 } |
| 541 catch (...) | 531 catch (...) |
| 542 { | 532 { |
| 543 } | 533 } |
| 544 } | 534 } |
| 545 | 535 |
| 546 // Entry point | 536 // Entry point |
| 547 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) | 537 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) |
| 548 { | 538 { |
| 539 if (detachedInitializationFailed) return; |
| 549 try | 540 try |
| 550 { | 541 { |
| 551 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); | 542 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); |
| 552 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL
ECMDIDF_WINDOWSTATE_ENABLED) | 543 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL
ECMDIDF_WINDOWSTATE_ENABLED) |
| 553 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA
BLED); | 544 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA
BLED); |
| 554 if (newtabshown) | 545 if (newtabshown) |
| 555 { | 546 { |
| 556 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(
GetCurrentThreadId()); | 547 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(
GetCurrentThreadId()); |
| 557 if (it == s_threadInstances.end()) | 548 if (it == s_threadInstances.end()) |
| 558 { | 549 { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 569 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); | 560 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); |
| 570 } | 561 } |
| 571 catch (...) | 562 catch (...) |
| 572 { | 563 { |
| 573 } | 564 } |
| 574 } | 565 } |
| 575 | 566 |
| 576 // Entry point | 567 // Entry point |
| 577 void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARI
ANT_BOOL /*enable*/) | 568 void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARI
ANT_BOOL /*enable*/) |
| 578 { | 569 { |
| 570 if (detachedInitializationFailed) return; |
| 579 try | 571 try |
| 580 { | 572 { |
| 581 if (m_hPaneWnd == NULL) | 573 if (m_hPaneWnd == NULL) |
| 582 { | 574 { |
| 583 CreateStatusBarPane(); | 575 CreateStatusBarPane(); |
| 584 } | 576 } |
| 585 else | 577 else |
| 586 { | 578 { |
| 587 if (AdblockPlus::IE::InstalledMajorVersion() > 6) | 579 if (AdblockPlus::IE::InstalledMajorVersion() > 6) |
| 588 { | 580 { |
| 589 RECT rect; | 581 RECT rect; |
| 590 //Get the RECT for the leftmost pane (the status text pane) | 582 //Get the RECT for the leftmost pane (the status text pane) |
| 591 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&re
ct); | 583 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&re
ct); |
| 592 if (rectRes == TRUE) | 584 if (rectRes == TRUE) |
| 593 { | 585 { |
| 594 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, rec
t.bottom - rect.top, TRUE); | 586 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, rec
t.bottom - rect.top, TRUE); |
| 595 } | 587 } |
| 596 } | 588 } |
| 597 } | 589 } |
| 598 } | 590 } |
| 599 catch (...) | 591 catch (...) |
| 600 { | 592 { |
| 601 } | 593 } |
| 602 } | 594 } |
| 603 | 595 |
| 604 // Entry point | |
| 605 void STDMETHODCALLTYPE CPluginClass::OnOnQuit() | |
| 606 { | |
| 607 try | |
| 608 { | |
| 609 Unadvise(); | |
| 610 } | |
| 611 catch (...) | |
| 612 { | |
| 613 } | |
| 614 } | |
| 615 | |
| 616 bool CPluginClass::InitObject() | 596 bool CPluginClass::InitObject() |
| 617 { | 597 { |
| 618 DEBUG_GENERAL("InitObject - begin"); | 598 DEBUG_GENERAL("InitObject - begin"); |
| 619 CPluginSettings* settings = CPluginSettings::GetInstance(); | 599 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 620 | 600 |
| 621 if (!settings->GetPluginEnabled()) | 601 if (!settings->GetPluginEnabled()) |
| 622 { | 602 { |
| 623 s_mimeFilter->Unregister(); | 603 s_mimeFilter->Unregister(); |
| 624 } | 604 } |
| 625 | 605 |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 994 } | 974 } |
| 995 } | 975 } |
| 996 s_criticalSectionLocal.Unlock(); | 976 s_criticalSectionLocal.Unlock(); |
| 997 | 977 |
| 998 return tab; | 978 return tab; |
| 999 } | 979 } |
| 1000 | 980 |
| 1001 // Entry point | 981 // Entry point |
| 1002 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
LECMD prgCmds[], OLECMDTEXT* pCmdText) | 982 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
LECMD prgCmds[], OLECMDTEXT* pCmdText) |
| 1003 { | 983 { |
| 984 if (detachedInitializationFailed) return S_OK; |
| 1004 try | 985 try |
| 1005 { | 986 { |
| 1006 if (cCmds == 0) return E_INVALIDARG; | 987 if (cCmds == 0) return E_INVALIDARG; |
| 1007 if (prgCmds == 0) return E_POINTER; | 988 if (prgCmds == 0) return E_POINTER; |
| 1008 | 989 |
| 1009 prgCmds[0].cmdf = OLECMDF_ENABLED; | 990 prgCmds[0].cmdf = OLECMDF_ENABLED; |
| 1010 } | 991 } |
| 1011 catch (...) | 992 catch (...) |
| 1012 { | 993 { |
| 1013 DEBUG_GENERAL(L"CPluginClass::QueryStatus - exception"); | 994 DEBUG_GENERAL(L"CPluginClass::QueryStatus - exception"); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); | 1191 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); |
| 1211 fmii.cch = static_cast<UINT>(ctext.size()); | 1192 fmii.cch = static_cast<UINT>(ctext.size()); |
| 1212 ::SetMenuItemInfoW(hMenu, ID_MENU_SETTINGS, FALSE, &fmii); | 1193 ::SetMenuItemInfoW(hMenu, ID_MENU_SETTINGS, FALSE, &fmii); |
| 1213 | 1194 |
| 1214 return true; | 1195 return true; |
| 1215 } | 1196 } |
| 1216 | 1197 |
| 1217 // Entry point | 1198 // Entry point |
| 1218 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V
ARIANTARG*) | 1199 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V
ARIANTARG*) |
| 1219 { | 1200 { |
| 1201 if (detachedInitializationFailed) return S_OK; |
| 1220 try | 1202 try |
| 1221 { | 1203 { |
| 1222 HWND hBrowserWnd = GetBrowserHWND(); | 1204 HWND hBrowserWnd = GetBrowserHWND(); |
| 1223 if (!hBrowserWnd) | 1205 if (!hBrowserWnd) |
| 1224 { | 1206 { |
| 1225 return E_FAIL; | 1207 return E_FAIL; |
| 1226 } | 1208 } |
| 1227 | 1209 |
| 1228 // Create menu | 1210 // Create menu |
| 1229 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); | 1211 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1635 if (m_hPaneWnd == NULL) | 1617 if (m_hPaneWnd == NULL) |
| 1636 { | 1618 { |
| 1637 CreateStatusBarPane(); | 1619 CreateStatusBarPane(); |
| 1638 } | 1620 } |
| 1639 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1621 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) |
| 1640 { | 1622 { |
| 1641 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1623 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); |
| 1642 } | 1624 } |
| 1643 } | 1625 } |
| 1644 | 1626 |
| 1645 | |
| 1646 void CPluginClass::Unadvise() | |
| 1647 { | |
| 1648 if (!m_webBrowser2) | |
| 1649 { | |
| 1650 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::Unadvise - Reached with m_webBrowser
2 == nullptr"); | |
| 1651 return; | |
| 1652 } | |
| 1653 s_criticalSectionLocal.Lock(); | |
| 1654 { | |
| 1655 if (m_isAdvised) | |
| 1656 { | |
| 1657 HRESULT hr = DispEventUnadvise(m_webBrowser2); | |
| 1658 if (FAILED(hr)) | |
| 1659 { | |
| 1660 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
E, "Class::Unadvise - Unadvise"); | |
| 1661 } | |
| 1662 m_isAdvised = false; | |
| 1663 } | |
| 1664 } | |
| 1665 s_criticalSectionLocal.Unlock(); | |
| 1666 } | |
| 1667 | |
| 1668 HICON CPluginClass::GetIcon(int type) | 1627 HICON CPluginClass::GetIcon(int type) |
| 1669 { | 1628 { |
| 1670 HICON icon = NULL; | 1629 HICON icon = NULL; |
| 1671 | 1630 |
| 1672 s_criticalSectionLocal.Lock(); | 1631 s_criticalSectionLocal.Lock(); |
| 1673 { | 1632 { |
| 1674 if (!s_hIcons[type]) | 1633 if (!s_hIcons[type]) |
| 1675 { | 1634 { |
| 1676 std::wstring imageToLoad = L"#"; | 1635 std::wstring imageToLoad = L"#"; |
| 1677 imageToLoad += std::to_wstring(s_hIconTypes[type]); | 1636 imageToLoad += std::to_wstring(s_hIconTypes[type]); |
| 1678 s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(),
IMAGE_ICON, iconWidth, iconHeight, LR_SHARED); | 1637 s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(),
IMAGE_ICON, iconWidth, iconHeight, LR_SHARED); |
| 1679 if (!s_hIcons[type]) | 1638 if (!s_hIcons[type]) |
| 1680 { | 1639 { |
| 1681 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_
ICON, "Class::GetIcon - LoadIcon"); | 1640 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_
ICON, "Class::GetIcon - LoadIcon"); |
| 1682 } | 1641 } |
| 1683 } | 1642 } |
| 1684 | 1643 |
| 1685 icon = s_hIcons[type]; | 1644 icon = s_hIcons[type]; |
| 1686 } | 1645 } |
| 1687 s_criticalSectionLocal.Unlock(); | 1646 s_criticalSectionLocal.Unlock(); |
| 1688 | 1647 |
| 1689 return icon; | 1648 return icon; |
| 1690 } | 1649 } |
| 1691 | 1650 |
| 1692 ATOM CPluginClass::GetAtomPaneClass() | 1651 ATOM CPluginClass::GetAtomPaneClass() |
| 1693 { | 1652 { |
| 1694 return s_atomPaneClass; | 1653 return s_atomPaneClass; |
| 1695 } | 1654 } |
| 1696 | 1655 |
| OLD | NEW |