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 |