| LEFT | RIGHT |
| 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 return right - left; | 87 return right - left; |
| 88 } | 88 } |
| 89 }; | 89 }; |
| 90 } | 90 } |
| 91 | 91 |
| 92 CPluginClass::CPluginClass() | 92 CPluginClass::CPluginClass() |
| 93 { | 93 { |
| 94 //Use this line to debug memory leaks | 94 //Use this line to debug memory leaks |
| 95 // _CrtDumpMemoryLeaks(); | 95 // _CrtDumpMemoryLeaks(); |
| 96 | 96 |
| 97 m_isAdviced = false; | 97 m_isAdvised = false; |
| 98 m_nConnectionID = 0; | |
| 99 m_hTabWnd = NULL; | 98 m_hTabWnd = NULL; |
| 100 m_hStatusBarWnd = NULL; | 99 m_hStatusBarWnd = NULL; |
| 101 m_hPaneWnd = NULL; | 100 m_hPaneWnd = NULL; |
| 102 m_nPaneWidth = 0; | 101 m_nPaneWidth = 0; |
| 103 m_pWndProcStatus = NULL; | 102 m_pWndProcStatus = NULL; |
| 104 m_hTheme = NULL; | 103 m_hTheme = NULL; |
| 105 m_isInitializedOk = false; | 104 m_isInitializedOk = false; |
| 106 | 105 |
| 107 | 106 |
| 108 m_tab = new CPluginTab(this); | 107 m_tab = new CPluginTab(this); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 126 | 125 |
| 127 void CPluginClass::FinalRelease() | 126 void CPluginClass::FinalRelease() |
| 128 { | 127 { |
| 129 s_criticalSectionBrowser.Lock(); | 128 s_criticalSectionBrowser.Lock(); |
| 130 { | 129 { |
| 131 m_webBrowser2.Release(); | 130 m_webBrowser2.Release(); |
| 132 } | 131 } |
| 133 s_criticalSectionBrowser.Unlock(); | 132 s_criticalSectionBrowser.Unlock(); |
| 134 } | 133 } |
| 135 | 134 |
| 136 | |
| 137 // This method tries to get a 'connection point' from the stored browser, which
can be | |
| 138 // used to attach or detach from the stream of browser events | |
| 139 CComPtr<IConnectionPoint> CPluginClass::GetConnectionPoint() | |
| 140 { | |
| 141 CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> pContaine
r(GetBrowser()); | |
| 142 if (!pContainer) | |
| 143 { | |
| 144 return NULL; | |
| 145 } | |
| 146 | |
| 147 CComPtr<IConnectionPoint> pPoint; | |
| 148 HRESULT hr = pContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &pPoint)
; | |
| 149 if (FAILED(hr)) | |
| 150 { | |
| 151 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_FIND_CONNEC
TION_POINT, "Class::GetConnectionPoint - FindConnectionPoint") | |
| 152 return NULL; | |
| 153 } | |
| 154 | |
| 155 return pPoint; | |
| 156 } | |
| 157 | |
| 158 HWND CPluginClass::GetBrowserHWND() const | 135 HWND CPluginClass::GetBrowserHWND() const |
| 159 { | 136 { |
| 160 SHANDLE_PTR hBrowserWndHandle = NULL; | 137 SHANDLE_PTR hBrowserWndHandle = NULL; |
| 161 | 138 |
| 162 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 139 CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
| 163 if (browser) | 140 if (browser) |
| 164 { | 141 { |
| 165 HRESULT hr = browser->get_HWND(&hBrowserWndHandle); | 142 HRESULT hr = browser->get_HWND(&hBrowserWndHandle); |
| 166 if (FAILED(hr)) | 143 if (FAILED(hr)) |
| 167 { | 144 { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 } | 196 } |
| 220 return url; | 197 return url; |
| 221 } | 198 } |
| 222 | 199 |
| 223 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 200 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
| 224 { | 201 { |
| 225 if (thisPtr == NULL) | 202 if (thisPtr == NULL) |
| 226 return 0; | 203 return 0; |
| 227 if (!((CPluginClass*)thisPtr)->InitObject(true)) | 204 if (!((CPluginClass*)thisPtr)->InitObject(true)) |
| 228 { | 205 { |
| 229 ((CPluginClass*)thisPtr)->Unadvice(); | 206 ((CPluginClass*)thisPtr)->Unadvise(); |
| 230 } | 207 } |
| 231 | 208 |
| 232 return 0; | 209 return 0; |
| 233 } | 210 } |
| 234 | |
| 235 | |
| 236 | 211 |
| 237 // This gets called when a new browser window is created (which also triggers th
e | 212 // This gets called when a new browser window is created (which also triggers th
e |
| 238 // creation of this object). The pointer passed in should be to a IWebBrowser2 | 213 // creation of this object). The pointer passed in should be to a IWebBrowser2 |
| 239 // interface that represents the browser for the window. | 214 // interface that represents the browser for the window. |
| 240 // it is also called when a tab is closed, this unknownSite will be null | 215 // it is also called when a tab is closed, this unknownSite will be null |
| 241 // so we should handle that it is called this way several times during a session | 216 // so we should handle that it is called this way several times during a session |
| 242 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) | 217 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) |
| 243 { | 218 { |
| 244 CPluginSettings* settings = CPluginSettings::GetInstance(); | 219 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 245 | 220 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 271 // Always register on startup, then check if we need to unregister in a se
parate thread | 246 // Always register on startup, then check if we need to unregister in a se
parate thread |
| 272 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 247 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 273 s_asyncWebBrowser2 = unknownSite; | 248 s_asyncWebBrowser2 = unknownSite; |
| 274 s_instances.insert(this); | 249 s_instances.insert(this); |
| 275 } | 250 } |
| 276 s_criticalSectionLocal.Unlock(); | 251 s_criticalSectionLocal.Unlock(); |
| 277 | 252 |
| 278 try | 253 try |
| 279 { | 254 { |
| 280 // Check if loaded as BHO | 255 // Check if loaded as BHO |
| 281 if (GetBrowser()) | 256 auto webBrowser = GetBrowser(); |
| 257 if (webBrowser) |
| 282 { | 258 { |
| 283 DEBUG_GENERAL("Loaded as BHO"); | 259 DEBUG_GENERAL("Loaded as BHO"); |
| 284 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); | 260 HRESULT hr = DispEventAdvise(webBrowser); |
| 285 if (pPoint) | 261 if (SUCCEEDED(hr)) |
| 286 { | 262 { |
| 287 HRESULT hr = pPoint->Advise((IDispatch*)this, &m_nConnectionID); | 263 m_isAdvised = true; |
| 288 if (SUCCEEDED(hr)) | 264 try |
| 289 { | 265 { |
| 290 m_isAdviced = true; | 266 std::thread startInitObjectThread(StartInitObject, this); |
| 291 | 267 startInitObjectThread.detach(); // TODO: but actually we should wait
for the thread in the dtr. |
| 292 try | |
| 293 { | |
| 294 std::thread startInitObjectThread(StartInitObject, this); | |
| 295 startInitObjectThread.detach(); // TODO: but actually we should wa
it for the thread in the dtr. | |
| 296 } | |
| 297 catch (const std::system_error& ex) | |
| 298 { | |
| 299 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_
THREAD_CREATE_PROCESS, | |
| 300 "Class::Thread - Failed to create StartInitObject thread"); | |
| 301 } | |
| 302 } | 268 } |
| 303 else | 269 catch (const std::system_error& ex) |
| 304 { | 270 { |
| 305 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV
ICE, "Class::SetSite - Advice"); | 271 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
READ_CREATE_PROCESS, |
| 272 "Class::Thread - Failed to create StartInitObject thread"); |
| 306 } | 273 } |
| 274 } |
| 275 else |
| 276 { |
| 277 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVIC
E, "Class::SetSite - Advise"); |
| 307 } | 278 } |
| 308 } | 279 } |
| 309 else // Check if loaded as toolbar handler | 280 else // Check if loaded as toolbar handler |
| 310 { | 281 { |
| 311 DEBUG_GENERAL("Loaded as toolbar handler"); | 282 DEBUG_GENERAL("Loaded as toolbar handler"); |
| 312 CComPtr<IServiceProvider> pServiceProvider; | 283 CComPtr<IServiceProvider> pServiceProvider; |
| 313 | 284 |
| 314 HRESULT hr = unknownSite->QueryInterface(&pServiceProvider); | 285 HRESULT hr = unknownSite->QueryInterface(&pServiceProvider); |
| 315 if (SUCCEEDED(hr)) | 286 if (SUCCEEDED(hr)) |
| 316 { | 287 { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 336 } | 307 } |
| 337 else | 308 else |
| 338 { | 309 { |
| 339 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY
_SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)"); | 310 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY
_SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)"); |
| 340 } | 311 } |
| 341 } | 312 } |
| 342 } | 313 } |
| 343 catch (const std::runtime_error& ex) | 314 catch (const std::runtime_error& ex) |
| 344 { | 315 { |
| 345 DEBUG_EXCEPTION(ex); | 316 DEBUG_EXCEPTION(ex); |
| 346 Unadvice(); | 317 Unadvise(); |
| 347 } | 318 } |
| 348 } | 319 } |
| 349 else | 320 else |
| 350 { | 321 { |
| 351 // Unadvice | 322 Unadvise(); |
| 352 Unadvice(); | |
| 353 | 323 |
| 354 // Destroy window | 324 // Destroy window |
| 355 if (m_pWndProcStatus) | 325 if (m_pWndProcStatus) |
| 356 { | 326 { |
| 357 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWndP
rocStatus); | 327 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWndP
rocStatus); |
| 358 | 328 |
| 359 m_pWndProcStatus = NULL; | 329 m_pWndProcStatus = NULL; |
| 360 } | 330 } |
| 361 | 331 |
| 362 if (m_hPaneWnd) | 332 if (m_hPaneWnd) |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 } | 480 } |
| 511 } | 481 } |
| 512 else | 482 else |
| 513 { | 483 { |
| 514 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class
::Get statusbar state"); | 484 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class
::Get statusbar state"); |
| 515 } | 485 } |
| 516 } | 486 } |
| 517 DEBUG_GENERAL("ShowStatusBar end"); | 487 DEBUG_GENERAL("ShowStatusBar end"); |
| 518 } | 488 } |
| 519 | 489 |
| 520 /* | 490 // Entry point |
| 521 * #1163 This class is the implementation for method DISPID_BEFORENAVIGATE2 in C
PluginClass::Invoke. | 491 void STDMETHODCALLTYPE CPluginClass::OnBeforeNavigate2( |
| 522 * - It validates and convertes its own arguments, rather than unifying them in
the Invoke body. | 492 IDispatch* frameBrowserDisp /**< [in] */, |
| 523 * - It's declared void and not HRESULT, so DISPID_BEFORENAVIGATE2 can only retu
rn S_OK. | 493 VARIANT* urlVariant /**< [in] */, |
| 524 */ | 494 VARIANT* /**< [in] Flags*/, |
| 525 void CPluginClass::BeforeNavigate2(DISPPARAMS* pDispParams) | 495 VARIANT* /**< [in] TargetFrameName*/, |
| 526 { | 496 VARIANT* /**< [in] PostData*/, |
| 527 | 497 VARIANT* /**< [in] Headers*/, |
| 528 if (pDispParams->cArgs < 7) | 498 VARIANT_BOOL* /**< [in, out] Cancel*/) |
| 529 { | 499 { |
| 530 return; | 500 try |
| 531 } | 501 { |
| 532 //Register a mime filter if it's not registered yet | 502 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; |
| 533 if (s_mimeFilter == NULL) | 503 if (!webBrowser) |
| 534 { | 504 { |
| 535 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 505 return; |
| 536 } | 506 } |
| 537 | 507 if (!urlVariant || urlVariant->vt != VT_BSTR) |
| 538 // Get the IWebBrowser2 interface | 508 { |
| 539 CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> WebBrowser2Ptr; | 509 return; |
| 540 VARTYPE vt = pDispParams->rgvarg[6].vt; | 510 } |
| 541 if (vt == VT_DISPATCH) | 511 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); |
| 542 { | 512 UnescapeUrl(url); |
| 543 WebBrowser2Ptr = pDispParams->rgvarg[6].pdispVal; | 513 |
| 544 } | 514 //Register a mime filter if it's not registered yet |
| 545 else | 515 if (s_mimeFilter == nullptr) |
| 546 { | 516 { |
| 547 // Wrong type, return. | 517 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 548 return; | 518 } |
| 549 } | 519 // If webbrowser2 is equal to top level browser (as set in SetSite), we are |
| 550 | 520 // navigating new page |
| 551 // Get the URL | 521 CPluginClient* client = CPluginClient::GetInstance(); |
| 552 std::wstring url; | 522 if (url.find(L"javascript") == 0) |
| 553 const auto& arg = pDispParams->rgvarg[5]; | 523 { |
| 554 vt = arg.vt; | 524 } |
| 555 if (vt == (VT_BYREF | VT_VARIANT) && arg.pvarVal->vt == VT_BSTR) | 525 else if (GetBrowser().IsEqualObject(webBrowser)) |
| 556 { | 526 { |
| 557 BSTR b = arg.pvarVal->bstrVal; | 527 m_tab->OnNavigate(url); |
| 558 if (b) { | 528 DEBUG_GENERAL( |
| 559 url = std::wstring(b, SysStringLen(b)); | |
| 560 UnescapeUrl(url); | |
| 561 } | |
| 562 } | |
| 563 else | |
| 564 { | |
| 565 // Wrong type, return. | |
| 566 return; | |
| 567 } | |
| 568 | |
| 569 // If webbrowser2 is equal to top level browser (as set in SetSite), we are na
vigating new page | |
| 570 CPluginClient* client = CPluginClient::GetInstance(); | |
| 571 CString urlLegacy = ToCString(url); | |
| 572 if (urlLegacy.Find(L"javascript") == 0) | |
| 573 { | |
| 574 } | |
| 575 else if (GetBrowser().IsEqualObject(WebBrowser2Ptr)) | |
| 576 { | |
| 577 m_tab->OnNavigate(url); | |
| 578 | |
| 579 DEBUG_GENERAL( | |
| 580 L"========================================================================
========\n" | 529 L"========================================================================
========\n" |
| 581 L"Begin main navigation url:" + url + L"\n" | 530 L"Begin main navigation url:" + url + L"\n" |
| 582 L"========================================================================
========") | 531 L"========================================================================
========") |
| 583 | 532 |
| 584 #ifdef ENABLE_DEBUG_RESULT | 533 #ifdef ENABLE_DEBUG_RESULT |
| 585 CPluginDebug::DebugResultDomain(url); | 534 CPluginDebug::DebugResultDomain(url); |
| 586 #endif | 535 #endif |
| 587 | 536 UpdateStatusBar(); |
| 588 UpdateStatusBar(); | 537 } |
| 589 } | 538 else |
| 590 else | 539 { |
| 591 { | 540 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) |
| 592 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) | 541 m_tab->CacheFrame(url); |
| 593 m_tab->CacheFrame(url); | 542 } |
| 594 } | 543 } |
| 595 } | 544 catch (...) |
| 596 | 545 { |
| 597 /* | 546 EntryPointExceptionDefault("CPluginClass::OnBeforeNavigate2"); |
| 598 * #1163 implements behavior for method DISPID_WINDOWSTATECHANGED in CPluginClas
s::Invoke | 547 } |
| 599 * - should validate and convert arguments in Invoke, not here | 548 } |
| 600 * - does not validate number of arguments before indexing into 'rgvarg' | 549 |
| 601 * - does not validate type of argument before using its value | 550 // Entry point |
| 602 */ | 551 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() |
| 603 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) | |
| 604 { | |
| 605 DEBUG_GENERAL("Tab changed"); | |
| 606 bool newtabshown = pDispParams->rgvarg[1].intVal==3; | |
| 607 if (newtabshown) | |
| 608 { | |
| 609 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge
tCurrentThreadId()); | |
| 610 if (it == s_threadInstances.end()) | |
| 611 { | |
| 612 s_threadInstances[::GetCurrentThreadId()] = this; | |
| 613 if (!m_isInitializedOk) | |
| 614 { | |
| 615 m_isInitializedOk = true; | |
| 616 InitObject(true); | |
| 617 UpdateStatusBar(); | |
| 618 } | |
| 619 } | |
| 620 } | |
| 621 notificationMessage.Hide(); | |
| 622 DEBUG_GENERAL("Tab change end"); | |
| 623 return S_OK; | |
| 624 } | |
| 625 | |
| 626 // This gets called whenever there's a browser event | |
| 627 // ENTRY POINT | |
| 628 STDMETHODIMP CPluginClass::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, W
ORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo,
UINT* puArgErr) | |
| 629 { | 552 { |
| 630 try | 553 try |
| 631 { | 554 { |
| 632 WCHAR tmp[256]; | 555 DEBUG_NAVI(L"Navi::Download Complete") |
| 633 wsprintf(tmp, L"Invoke: %d\n", dispidMember); | 556 ATL::CComPtr<IWebBrowser2> browser = GetBrowser(); |
| 634 DEBUG_GENERAL(tmp); | 557 if (browser) |
| 635 switch (dispidMember) | 558 { |
| 636 { | 559 m_tab->OnDownloadComplete(browser); |
| 637 case DISPID_WINDOWSTATECHANGED: | 560 } |
| 638 { | 561 } |
| 639 // #1163 should validate and convert arguments here | 562 catch (...) |
| 640 return OnTabChanged(pDispParams, wFlags); | 563 { |
| 641 } | 564 EntryPointExceptionDefault("CPluginClass::OnDownloadComplete"); |
| 642 | 565 } |
| 643 case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE: | 566 } |
| 644 break; | 567 |
| 645 | 568 // Entry point |
| 646 case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK: | 569 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) |
| 647 break; | 570 { |
| 648 | 571 try |
| 649 case DISPID_EVMETH_ONLOAD: | 572 { |
| 650 DEBUG_NAVI("Navi::OnLoad") | 573 DEBUG_NAVI(L"Navi::Document Complete"); |
| 651 break; | 574 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; |
| 652 | 575 if (!webBrowser2) |
| 653 case DISPID_EVMETH_ONCHANGE: | 576 { |
| 654 break; | 577 return; |
| 655 | 578 } |
| 656 case DISPID_EVMETH_ONMOUSEDOWN: | 579 std::wstring frameSrc = GetLocationUrl(*webBrowser2); |
| 657 break; | 580 UnescapeUrl(frameSrc); |
| 658 | 581 bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2); |
| 659 case DISPID_EVMETH_ONMOUSEENTER: | 582 m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser); |
| 660 break; | 583 } |
| 661 | 584 catch (...) |
| 662 case DISPID_IHTMLIMGELEMENT_START: | 585 { |
| 663 break; | 586 EntryPointExceptionDefault("CPluginClass::OnDocumentComplete"); |
| 664 | 587 } |
| 665 case STDDISPID_XOBJ_ERRORUPDATE: | 588 } |
| 666 break; | 589 |
| 667 | 590 // Entry point |
| 668 case STDDISPID_XOBJ_ONPROPERTYCHANGE: | 591 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) |
| 669 break; | 592 { |
| 670 | 593 try |
| 671 case DISPID_READYSTATECHANGE: | 594 { |
| 672 DEBUG_NAVI("Navi::ReadyStateChange"); | 595 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); |
| 673 break; | 596 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL
ECMDIDF_WINDOWSTATE_ENABLED) |
| 674 | 597 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA
BLED); |
| 675 case DISPID_BEFORENAVIGATE: | 598 if (newtabshown) |
| 676 DEBUG_NAVI("Navi::BeforeNavigate"); | 599 { |
| 677 break; | 600 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(
GetCurrentThreadId()); |
| 678 | 601 if (it == s_threadInstances.end()) |
| 679 case DISPID_COMMANDSTATECHANGE: | 602 { |
| 680 if (m_hPaneWnd == NULL) | 603 s_threadInstances[::GetCurrentThreadId()] = this; |
| 681 { | 604 if (!m_isInitializedOk) |
| 682 CreateStatusBarPane(); | 605 { |
| 683 } | 606 m_isInitializedOk = true; |
| 684 else | 607 InitObject(true); |
| 685 { | 608 UpdateStatusBar(); |
| 609 } |
| 610 } |
| 611 } |
| 612 notificationMessage.Hide(); |
| 613 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); |
| 614 } |
| 615 catch (...) |
| 616 { |
| 617 EntryPointExceptionDefault("CPluginClass::OnWindowStateChanged"); |
| 618 } |
| 619 } |
| 620 |
| 621 // Entry point |
| 622 void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARI
ANT_BOOL /*enable*/) |
| 623 { |
| 624 try |
| 625 { |
| 626 if (m_hPaneWnd == NULL) |
| 627 { |
| 628 CreateStatusBarPane(); |
| 629 } |
| 630 else |
| 631 { |
| 686 if (AdblockPlus::IE::InstalledMajorVersion() > 6) | 632 if (AdblockPlus::IE::InstalledMajorVersion() > 6) |
| 687 { | 633 { |
| 688 RECT rect; | 634 RECT rect; |
| 689 //Get the RECT for the leftmost pane (the status text pane) | 635 //Get the RECT for the leftmost pane (the status text pane) |
| 690 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&
rect); | 636 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&re
ct); |
| 691 if (rectRes == TRUE) | 637 if (rectRes == TRUE) |
| 692 { | 638 { |
| 693 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, r
ect.bottom - rect.top, TRUE); | 639 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, rec
t.bottom - rect.top, TRUE); |
| 694 } | 640 } |
| 695 } | 641 } |
| 696 } | |
| 697 break; | |
| 698 | |
| 699 case DISPID_STATUSTEXTCHANGE: | |
| 700 break; | |
| 701 | |
| 702 case DISPID_BEFORENAVIGATE2: | |
| 703 { | |
| 704 // #1163 should validate and convert parameters here | |
| 705 BeforeNavigate2(pDispParams); | |
| 706 } | |
| 707 break; | |
| 708 | |
| 709 case DISPID_DOWNLOADBEGIN: | |
| 710 { | |
| 711 DEBUG_NAVI("Navi::Download Begin") | |
| 712 } | |
| 713 break; | |
| 714 | |
| 715 case DISPID_DOWNLOADCOMPLETE: | |
| 716 { | |
| 717 DEBUG_NAVI("Navi::Download Complete"); | |
| 718 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | |
| 719 if (browser) | |
| 720 { | |
| 721 m_tab->OnDownloadComplete(browser); | |
| 722 } | |
| 723 } | |
| 724 break; | |
| 725 | |
| 726 case DISPID_DOCUMENTCOMPLETE: | |
| 727 { | |
| 728 DEBUG_NAVI("Navi::Document Complete"); | |
| 729 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | |
| 730 if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == V
T_DISPATCH) | |
| 731 { | |
| 732 CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; | |
| 733 if (pBrowser) | |
| 734 { | |
| 735 CComBSTR bstrUrl; | |
| 736 if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && bstrUrl && ::S
ysStringLen(bstrUrl) > 0) | |
| 737 { | |
| 738 std::wstring url = std::wstring(bstrUrl, SysStringLen(bstrUrl)); | |
| 739 UnescapeUrl(url); | |
| 740 m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBro
wser)); | |
| 741 } | |
| 742 } | |
| 743 } | |
| 744 } | |
| 745 break; | |
| 746 | |
| 747 case DISPID_ONQUIT: | |
| 748 case DISPID_QUIT: | |
| 749 { | |
| 750 Unadvice(); | |
| 751 } | |
| 752 break; | |
| 753 | |
| 754 default: | |
| 755 { | |
| 756 CString did; | |
| 757 did.Format(L"DispId:%u", dispidMember); | |
| 758 | |
| 759 DEBUG_NAVI(L"Navi::Default " + did) | |
| 760 } | |
| 761 /* | |
| 762 * Ordinarily a method not dispatched should return DISP_E_MEMBERNOTFOUND. | |
| 763 * As a conservative initial change, we leave it behaving as before, | |
| 764 * which is to do nothing and return S_OK. | |
| 765 */ | |
| 766 // do nothing | |
| 767 break; | |
| 768 } | 642 } |
| 769 } | 643 } |
| 770 catch (...) | 644 catch (...) |
| 771 { | 645 { |
| 772 EntryPointExceptionDefault("CPluginClass::Invoke"); | 646 EntryPointExceptionDefault("CPluginClass::OnCommandStateChange"); |
| 773 return E_FAIL; | 647 } |
| 774 } | 648 } |
| 775 return S_OK; | 649 |
| 650 // Entry point |
| 651 void STDMETHODCALLTYPE CPluginClass::OnOnQuit() |
| 652 { |
| 653 try |
| 654 { |
| 655 Unadvise(); |
| 656 } |
| 657 catch (...) |
| 658 { |
| 659 EntryPointExceptionDefault("CPluginClass::OnOnQuit"); |
| 660 } |
| 776 } | 661 } |
| 777 | 662 |
| 778 bool CPluginClass::InitObject(bool bBHO) | 663 bool CPluginClass::InitObject(bool bBHO) |
| 779 { | 664 { |
| 780 DEBUG_GENERAL("InitObject"); | 665 DEBUG_GENERAL("InitObject"); |
| 781 CPluginSettings* settings = CPluginSettings::GetInstance(); | 666 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 782 | 667 |
| 783 if (!settings->GetPluginEnabled()) | 668 if (!settings->GetPluginEnabled()) |
| 784 { | 669 { |
| 785 s_mimeFilter->Unregister(); | 670 s_mimeFilter->Unregister(); |
| (...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1766 { | 1651 { |
| 1767 CreateStatusBarPane(); | 1652 CreateStatusBarPane(); |
| 1768 } | 1653 } |
| 1769 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1654 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) |
| 1770 { | 1655 { |
| 1771 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1656 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); |
| 1772 } | 1657 } |
| 1773 } | 1658 } |
| 1774 | 1659 |
| 1775 | 1660 |
| 1776 void CPluginClass::Unadvice() | 1661 void CPluginClass::Unadvise() |
| 1777 { | 1662 { |
| 1778 s_criticalSectionLocal.Lock(); | 1663 s_criticalSectionLocal.Lock(); |
| 1779 { | 1664 { |
| 1780 if (m_isAdviced) | 1665 if (m_isAdvised) |
| 1781 { | 1666 { |
| 1782 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); | 1667 HRESULT hr = DispEventUnadvise(GetBrowser()); |
| 1783 if (pPoint) | 1668 if (FAILED(hr)) |
| 1784 { | 1669 { |
| 1785 HRESULT hr = pPoint->Unadvise(m_nConnectionID); | 1670 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
E, "Class::Unadvise - Unadvise"); |
| 1786 if (FAILED(hr)) | 1671 } |
| 1787 { | 1672 m_isAdvised = false; |
| 1788 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADV
ICE, "Class::Unadvice - Unadvise"); | |
| 1789 } | |
| 1790 } | |
| 1791 | |
| 1792 m_isAdviced = false; | |
| 1793 } | 1673 } |
| 1794 } | 1674 } |
| 1795 s_criticalSectionLocal.Unlock(); | 1675 s_criticalSectionLocal.Unlock(); |
| 1796 } | 1676 } |
| 1797 | 1677 |
| 1798 HICON CPluginClass::GetIcon(int type) | 1678 HICON CPluginClass::GetIcon(int type) |
| 1799 { | 1679 { |
| 1800 HICON icon = NULL; | 1680 HICON icon = NULL; |
| 1801 | 1681 |
| 1802 s_criticalSectionLocal.Lock(); | 1682 s_criticalSectionLocal.Lock(); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 break; | 1762 break; |
| 1883 } | 1763 } |
| 1884 s_criticalSectionLocal.Unlock(); | 1764 s_criticalSectionLocal.Unlock(); |
| 1885 | 1765 |
| 1886 } | 1766 } |
| 1887 } | 1767 } |
| 1888 } | 1768 } |
| 1889 | 1769 |
| 1890 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 1770 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); |
| 1891 } | 1771 } |
| 1892 | |
| 1893 return hTabWnd; | 1772 return hTabWnd; |
| 1894 | 1773 } |
| 1895 } | |
| LEFT | RIGHT |