| Left: | ||
| Right: |
| 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 event last, after everything is ready to go | |
|
sergei
2016/01/06 08:41:57
This comment is confusing because not everything i
Eric
2016/01/07 16:24:47
Reworded.
| |
| 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; | |
|
sergei
2016/01/06 08:41:57
Basically all these checks in each method are indi
sergei
2016/01/06 08:41:57
it would be better to use some method `bool IsInit
Eric
2016/01/07 16:24:47
Something is definitely wrong with the design. It'
Eric
2016/01/07 16:24:48
I don't disagree in principle, but that change is
sergei
2016/02/04 13:45:49
Acknowledged.
| |
| 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 | 981 |
| 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; | |
| 1004 if (cCmds == 0) return E_INVALIDARG; | 985 if (cCmds == 0) return E_INVALIDARG; |
| 1005 if (prgCmds == 0) return E_POINTER; | 986 if (prgCmds == 0) return E_POINTER; |
| 1006 | 987 |
| 1007 prgCmds[0].cmdf = OLECMDF_ENABLED; | 988 prgCmds[0].cmdf = OLECMDF_ENABLED; |
| 1008 | 989 |
| 1009 return S_OK; | 990 return S_OK; |
| 1010 } | 991 } |
| 1011 | 992 |
| 1012 HMENU CPluginClass::CreatePluginMenu(const std::wstring& url) | 993 HMENU CPluginClass::CreatePluginMenu(const std::wstring& url) |
| 1013 { | 994 { |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1203 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); | 1184 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); |
| 1204 fmii.cch = static_cast<UINT>(ctext.size()); | 1185 fmii.cch = static_cast<UINT>(ctext.size()); |
| 1205 ::SetMenuItemInfoW(hMenu, ID_MENU_SETTINGS, FALSE, &fmii); | 1186 ::SetMenuItemInfoW(hMenu, ID_MENU_SETTINGS, FALSE, &fmii); |
| 1206 | 1187 |
| 1207 return true; | 1188 return true; |
| 1208 } | 1189 } |
| 1209 | 1190 |
| 1210 | 1191 |
| 1211 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V ARIANTARG*) | 1192 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V ARIANTARG*) |
| 1212 { | 1193 { |
| 1194 if (detachedInitializationFailed) return; | |
| 1213 HWND hBrowserWnd = GetBrowserHWND(); | 1195 HWND hBrowserWnd = GetBrowserHWND(); |
| 1214 if (!hBrowserWnd) | 1196 if (!hBrowserWnd) |
| 1215 { | 1197 { |
| 1216 return E_FAIL; | 1198 return E_FAIL; |
| 1217 } | 1199 } |
| 1218 | 1200 |
| 1219 // Create menu | 1201 // Create menu |
| 1220 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); | 1202 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); |
| 1221 if (!hMenu) | 1203 if (!hMenu) |
| 1222 { | 1204 { |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1608 if (m_hPaneWnd == NULL) | 1590 if (m_hPaneWnd == NULL) |
| 1609 { | 1591 { |
| 1610 CreateStatusBarPane(); | 1592 CreateStatusBarPane(); |
| 1611 } | 1593 } |
| 1612 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1594 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) |
| 1613 { | 1595 { |
| 1614 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1596 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar"); |
| 1615 } | 1597 } |
| 1616 } | 1598 } |
| 1617 | 1599 |
| 1618 | |
| 1619 void CPluginClass::Unadvise() | |
| 1620 { | |
| 1621 if (!m_webBrowser2) | |
| 1622 { | |
| 1623 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::Unadvise - Reached with m_webBrowser 2 == nullptr"); | |
| 1624 return; | |
| 1625 } | |
| 1626 s_criticalSectionLocal.Lock(); | |
| 1627 { | |
| 1628 if (m_isAdvised) | |
| 1629 { | |
| 1630 HRESULT hr = DispEventUnadvise(m_webBrowser2); | |
| 1631 if (FAILED(hr)) | |
| 1632 { | |
| 1633 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS E, "Class::Unadvise - Unadvise"); | |
| 1634 } | |
| 1635 m_isAdvised = false; | |
| 1636 } | |
| 1637 } | |
| 1638 s_criticalSectionLocal.Unlock(); | |
| 1639 } | |
| 1640 | |
| 1641 HICON CPluginClass::GetIcon(int type) | 1600 HICON CPluginClass::GetIcon(int type) |
| 1642 { | 1601 { |
| 1643 HICON icon = NULL; | 1602 HICON icon = NULL; |
| 1644 | 1603 |
| 1645 s_criticalSectionLocal.Lock(); | 1604 s_criticalSectionLocal.Lock(); |
| 1646 { | 1605 { |
| 1647 if (!s_hIcons[type]) | 1606 if (!s_hIcons[type]) |
| 1648 { | 1607 { |
| 1649 std::wstring imageToLoad = L"#"; | 1608 std::wstring imageToLoad = L"#"; |
| 1650 imageToLoad += std::to_wstring(s_hIconTypes[type]); | 1609 imageToLoad += std::to_wstring(s_hIconTypes[type]); |
| 1651 s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(), IMAGE_ICON, iconWidth, iconHeight, LR_SHARED); | 1610 s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(), IMAGE_ICON, iconWidth, iconHeight, LR_SHARED); |
| 1652 if (!s_hIcons[type]) | 1611 if (!s_hIcons[type]) |
| 1653 { | 1612 { |
| 1654 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_ ICON, "Class::GetIcon - LoadIcon"); | 1613 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_ ICON, "Class::GetIcon - LoadIcon"); |
| 1655 } | 1614 } |
| 1656 } | 1615 } |
| 1657 | 1616 |
| 1658 icon = s_hIcons[type]; | 1617 icon = s_hIcons[type]; |
| 1659 } | 1618 } |
| 1660 s_criticalSectionLocal.Unlock(); | 1619 s_criticalSectionLocal.Unlock(); |
| 1661 | 1620 |
| 1662 return icon; | 1621 return icon; |
| 1663 } | 1622 } |
| 1664 | 1623 |
| 1665 ATOM CPluginClass::GetAtomPaneClass() | 1624 ATOM CPluginClass::GetAtomPaneClass() |
| 1666 { | 1625 { |
| 1667 return s_atomPaneClass; | 1626 return s_atomPaneClass; |
| 1668 } | 1627 } |
| 1669 | 1628 |
| OLD | NEW |