| Left: | ||
| Right: |
| 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 12 matching lines...) Expand all Loading... | |
| 121 | 120 |
| 122 HRESULT CPluginClass::FinalConstruct() | 121 HRESULT CPluginClass::FinalConstruct() |
| 123 { | 122 { |
| 124 return S_OK; | 123 return S_OK; |
| 125 } | 124 } |
| 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(); |
|
Eric
2015/03/06 15:58:04
Explicit 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 { | 194 { |
| 218 url = m_tab->GetDocumentUrl(); | 195 url = m_tab->GetDocumentUrl(); |
| 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()) |
| 228 { | 205 { |
| 229 ((CPluginClass*)thisPtr)->Unadvice(); | 206 ((CPluginClass*)thisPtr)->Unadvise(); |
| 230 } | 207 } |
| 231 | 208 |
| 232 return 0; | 209 return 0; |
| 233 } | 210 } |
| 234 | |
| 235 | 211 |
| 236 /* | 212 /* |
| 237 * IE calls this when it creates a new browser window or tab, immediately after it also | 213 * IE calls this when it creates a new browser window or tab, immediately after it also |
| 238 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob ject, | 214 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob ject, |
| 239 * which is an IWebBrowser2 interface associated with the window/tab. | 215 * which is an IWebBrowser2 interface associated with the window/tab. |
| 240 * | 216 * |
| 241 * IE also ordinarily calls this again when its window/tab is closed, in which c ase | 217 * IE also ordinarily calls this again when its window/tab is closed, in which c ase |
| 242 * 'unknownSite' will be null. Extraordinarily, this is sometimes _not_ called w hen IE | 218 * 'unknownSite' will be null. Extraordinarily, this is sometimes _not_ called w hen IE |
| 243 * is shutting down. Thus 'SetSite(nullptr)' has some similarities with a destru ctor, | 219 * is shutting down. Thus 'SetSite(nullptr)' has some similarities with a destru ctor, |
| 244 * but it is not a proper substitute for one. | 220 * but it is not a proper substitute for one. |
|
sergei
2015/03/09 10:23:50
I'm not sure that we need this comment except the
Eric
2015/03/09 13:31:29
I was just rewriting the comment, mostly, with the
Oleksandr
2015/03/10 08:38:26
I am pretty sure it _is_ called every time when IE
Oleksandr
2015/03/10 08:42:04
https://msdn.microsoft.com/en-us/library/bb250489(
| |
| 245 */ | 221 */ |
|
sergei
2015/03/30 11:26:23
This comment
| |
| 246 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) | 222 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) |
| 247 { | 223 { |
| 248 try | 224 try |
| 249 { | 225 { |
| 250 if (unknownSite) | 226 if (unknownSite) |
| 251 { | 227 { |
| 252 | 228 |
| 253 DEBUG_GENERAL(L"========================================================== ======================\nNEW TAB UI\n============================================ ====================================") | 229 DEBUG_GENERAL(L"========================================================== ======================\nNEW TAB UI\n============================================ ====================================") |
| 254 | 230 |
| 255 HRESULT hr = ::CoInitialize(NULL); | 231 HRESULT hr = ::CoInitialize(NULL); |
| 256 if (FAILED(hr)) | 232 if (FAILED(hr)) |
| 257 { | 233 { |
| 258 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "Class::SetSite - CoInitialize"); | 234 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "Class::SetSite - CoInitialize"); |
| 259 } | 235 } |
| 260 | 236 |
| 261 s_criticalSectionBrowser.Lock(); | 237 s_criticalSectionBrowser.Lock(); |
| 262 { | 238 { |
| 263 m_webBrowser2 = unknownSite; | 239 m_webBrowser2 = unknownSite; |
|
Eric
2015/03/06 15:58:04
Assigned to m_webBrowser2 here, declared as CComQI
sergei
2015/03/06 16:07:19
Here `AddRef` is called.
| |
| 264 } | 240 } |
| 265 s_criticalSectionBrowser.Unlock(); | 241 s_criticalSectionBrowser.Unlock(); |
| 266 | 242 |
| 267 //register the mimefilter | 243 //register the mimefilter |
| 268 //and only mimefilter | 244 //and only mimefilter |
| 269 //on some few computers the mimefilter does not get properly registered wh en it is done on another thread | 245 //on some few computers the mimefilter does not get properly registered wh en it is done on another thread |
| 270 | 246 |
| 271 s_criticalSectionLocal.Lock(); | 247 s_criticalSectionLocal.Lock(); |
| 272 { | 248 { |
| 273 // Always register on startup, then check if we need to unregister in a separate thread | 249 // Always register on startup, then check if we need to unregister in a separate thread |
| 274 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 250 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 275 s_asyncWebBrowser2 = unknownSite; | 251 s_asyncWebBrowser2 = unknownSite; |
| 276 s_instances.insert(this); | 252 s_instances.insert(this); |
| 277 } | 253 } |
| 278 s_criticalSectionLocal.Unlock(); | 254 s_criticalSectionLocal.Unlock(); |
| 279 | 255 |
| 280 try | 256 try |
| 281 { | 257 { |
| 282 // Check if loaded as BHO | 258 auto webBrowser = GetBrowser(); |
| 283 if (GetBrowser()) | 259 if (webBrowser) |
|
sergei
2015/03/09 10:23:50
We don't need this comment now.
Eric
2015/03/09 13:31:29
We don't need this particular comment, but we'll n
Eric
2015/03/17 10:41:07
Done.
| |
| 284 { | 260 { |
| 285 DEBUG_GENERAL("Loaded as BHO"); | 261 DEBUG_GENERAL("Loaded as BHO"); |
| 286 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); | 262 HRESULT hr = DispEventAdvise(webBrowser); |
| 287 if (pPoint) | 263 if (SUCCEEDED(hr)) |
| 288 { | 264 { |
| 289 HRESULT hr = pPoint->Advise((IDispatch*)this, &m_nConnectionID); | 265 m_isAdvised = true; |
| 290 if (SUCCEEDED(hr)) | 266 try |
| 291 { | 267 { |
| 292 m_isAdviced = true; | 268 std::thread startInitObjectThread(StartInitObject, this); |
| 293 | 269 startInitObjectThread.detach(); // TODO: but actually we should wa it for the thread in the dtr. |
| 294 try | |
| 295 { | |
| 296 std::thread startInitObjectThread(StartInitObject, this); | |
| 297 startInitObjectThread.detach(); // TODO: but actually we should wait for the thread in the dtr. | |
| 298 } | |
| 299 catch (const std::system_error& ex) | |
| 300 { | |
| 301 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAI N_THREAD_CREATE_PROCESS, | |
| 302 "Class::Thread - Failed to create StartInitObject thread"); | |
| 303 } | |
| 304 } | 270 } |
| 305 else | 271 catch (const std::system_error& ex) |
| 306 { | 272 { |
| 307 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_A DVICE, "Class::SetSite - Advice"); | 273 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_ THREAD_CREATE_PROCESS, |
| 274 "Class::Thread - Failed to create StartInitObject thread"); | |
| 308 } | 275 } |
| 309 } | 276 } |
| 277 else | |
| 278 { | |
| 279 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV ICE, "Class::SetSite - Advise"); | |
| 280 } | |
| 310 } | 281 } |
| 311 } | 282 } |
| 312 catch (const std::runtime_error& ex) | 283 catch (const std::runtime_error& ex) |
| 313 { | 284 { |
| 314 DEBUG_EXCEPTION(ex); | 285 DEBUG_EXCEPTION(ex); |
| 315 Unadvice(); | 286 Unadvise(); |
| 316 } | 287 } |
| 317 } | 288 } |
| 318 else | 289 else |
| 319 { | 290 { |
| 320 // Unadvice | 291 Unadvise(); |
| 321 Unadvice(); | |
| 322 | 292 |
| 323 // Destroy window | 293 // Destroy window |
| 324 if (m_pWndProcStatus) | 294 if (m_pWndProcStatus) |
| 325 { | 295 { |
| 326 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn dProcStatus); | 296 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn dProcStatus); |
| 327 | 297 |
| 328 m_pWndProcStatus = NULL; | 298 m_pWndProcStatus = NULL; |
| 329 } | 299 } |
| 330 | 300 |
| 331 if (m_hPaneWnd) | 301 if (m_hPaneWnd) |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 354 { | 324 { |
| 355 // TODO: Explicitly releasing a resource when a container becomes empt y looks like a job better suited for shared_ptr | 325 // TODO: Explicitly releasing a resource when a container becomes empt y looks like a job better suited for shared_ptr |
| 356 CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 326 CPluginClientFactory::ReleaseMimeFilterClientInstance(); |
| 357 } | 327 } |
| 358 } | 328 } |
| 359 s_criticalSectionLocal.Unlock(); | 329 s_criticalSectionLocal.Unlock(); |
| 360 | 330 |
| 361 // Release browser interface | 331 // Release browser interface |
| 362 s_criticalSectionBrowser.Lock(); | 332 s_criticalSectionBrowser.Lock(); |
| 363 { | 333 { |
| 364 m_webBrowser2.Release(); | 334 m_webBrowser2.Release(); |
|
Eric
2015/03/06 15:58:04
Explicit release here.
sergei
2015/03/06 16:07:19
So, since `AddRef` is called and `m_webBrowser2` i
Eric
2015/03/06 16:27:22
Calling 'Release' through 'CComPtr' apparently als
| |
| 365 } | 335 } |
| 366 s_criticalSectionBrowser.Unlock(); | 336 s_criticalSectionBrowser.Unlock(); |
| 367 | 337 |
| 368 DEBUG_GENERAL("=========================================================== =====================\nNEW TAB UI - END\n======================================= =========================================") | 338 DEBUG_GENERAL("=========================================================== =====================\nNEW TAB UI - END\n======================================= =========================================") |
| 369 | 339 |
| 370 ::CoUninitialize(); | 340 ::CoUninitialize(); |
| 371 } | 341 } |
| 372 | 342 |
| 373 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | 343 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); |
| 374 } | 344 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 484 } | 454 } |
| 485 } | 455 } |
| 486 else | 456 else |
| 487 { | 457 { |
| 488 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class ::Get statusbar state"); | 458 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class ::Get statusbar state"); |
| 489 } | 459 } |
| 490 } | 460 } |
| 491 DEBUG_GENERAL("ShowStatusBar end"); | 461 DEBUG_GENERAL("ShowStatusBar end"); |
| 492 } | 462 } |
| 493 | 463 |
| 494 /* | 464 // Entry point |
| 495 * #1163 This class is the implementation for method DISPID_BEFORENAVIGATE2 in C PluginClass::Invoke. | 465 void STDMETHODCALLTYPE CPluginClass::OnBeforeNavigate2( |
| 496 * - It validates and convertes its own arguments, rather than unifying them in the Invoke body. | 466 IDispatch* frameBrowserDisp /**< [in] */, |
| 497 * - It's declared void and not HRESULT, so DISPID_BEFORENAVIGATE2 can only retu rn S_OK. | 467 VARIANT* urlVariant /**< [in] */, |
| 498 */ | 468 VARIANT* /**< [in] Flags*/, |
| 499 void CPluginClass::BeforeNavigate2(DISPPARAMS* pDispParams) | 469 VARIANT* /**< [in] TargetFrameName*/, |
| 500 { | 470 VARIANT* /**< [in] PostData*/, |
| 501 | 471 VARIANT* /**< [in] Headers*/, |
| 502 if (pDispParams->cArgs < 7) | 472 VARIANT_BOOL* /**< [in, out] Cancel*/) |
| 503 { | 473 { |
| 504 return; | 474 try |
| 505 } | 475 { |
| 506 //Register a mime filter if it's not registered yet | 476 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; |
| 507 if (s_mimeFilter == NULL) | 477 if (!webBrowser) |
| 508 { | 478 { |
| 509 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 479 return; |
| 510 } | 480 } |
| 511 | 481 if (!urlVariant || urlVariant->vt != VT_BSTR) |
| 512 // Get the IWebBrowser2 interface | 482 { |
| 513 CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> WebBrowser2Ptr; | 483 return; |
| 514 VARTYPE vt = pDispParams->rgvarg[6].vt; | 484 } |
| 515 if (vt == VT_DISPATCH) | 485 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); |
| 516 { | 486 UnescapeUrl(url); |
| 517 WebBrowser2Ptr = pDispParams->rgvarg[6].pdispVal; | 487 |
| 518 } | 488 //Register a mime filter if it's not registered yet |
| 519 else | 489 if (s_mimeFilter == nullptr) |
| 520 { | 490 { |
| 521 // Wrong type, return. | 491 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 522 return; | 492 } |
| 523 } | 493 // If webbrowser2 is equal to top level browser (as set in SetSite), we are |
| 524 | 494 // navigating new page |
| 525 // Get the URL | 495 CPluginClient* client = CPluginClient::GetInstance(); |
| 526 std::wstring url; | 496 if (url.find(L"javascript") == 0) |
| 527 const auto& arg = pDispParams->rgvarg[5]; | 497 { |
| 528 vt = arg.vt; | 498 } |
| 529 if (vt == (VT_BYREF | VT_VARIANT) && arg.pvarVal->vt == VT_BSTR) | 499 else if (GetBrowser().IsEqualObject(webBrowser)) |
| 530 { | 500 { |
| 531 BSTR b = arg.pvarVal->bstrVal; | 501 m_tab->OnNavigate(url); |
| 532 if (b) { | 502 DEBUG_GENERAL( |
| 533 url = std::wstring(b, SysStringLen(b)); | |
| 534 UnescapeUrl(url); | |
| 535 } | |
| 536 } | |
| 537 else | |
| 538 { | |
| 539 // Wrong type, return. | |
| 540 return; | |
| 541 } | |
| 542 | |
| 543 // If webbrowser2 is equal to top level browser (as set in SetSite), we are na vigating new page | |
| 544 CPluginClient* client = CPluginClient::GetInstance(); | |
| 545 CString urlLegacy = ToCString(url); | |
| 546 if (urlLegacy.Find(L"javascript") == 0) | |
| 547 { | |
| 548 } | |
| 549 else if (GetBrowser().IsEqualObject(WebBrowser2Ptr)) | |
| 550 { | |
| 551 m_tab->OnNavigate(url); | |
| 552 | |
| 553 DEBUG_GENERAL( | |
| 554 L"======================================================================== ========\n" | 503 L"======================================================================== ========\n" |
| 555 L"Begin main navigation url:" + url + L"\n" | 504 L"Begin main navigation url:" + url + L"\n" |
| 556 L"======================================================================== ========") | 505 L"======================================================================== ========") |
| 557 | 506 |
| 558 #ifdef ENABLE_DEBUG_RESULT | 507 #ifdef ENABLE_DEBUG_RESULT |
| 559 CPluginDebug::DebugResultDomain(url); | 508 CPluginDebug::DebugResultDomain(url); |
| 560 #endif | 509 #endif |
| 561 | 510 UpdateStatusBar(); |
| 562 UpdateStatusBar(); | 511 } |
| 563 } | 512 else |
| 564 else | 513 { |
| 565 { | 514 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) |
| 566 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) | 515 m_tab->CacheFrame(url); |
| 567 m_tab->CacheFrame(url); | 516 } |
| 568 } | 517 } |
| 569 } | 518 catch (...) |
| 570 | 519 { |
| 571 /* | 520 } |
| 572 * #1163 implements behavior for method DISPID_WINDOWSTATECHANGED in CPluginClas s::Invoke | 521 } |
| 573 * - should validate and convert arguments in Invoke, not here | 522 |
| 574 * - does not validate number of arguments before indexing into 'rgvarg' | 523 // Entry point |
| 575 * - does not validate type of argument before using its value | 524 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() |
| 576 */ | |
| 577 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) | |
| 578 { | |
| 579 DEBUG_GENERAL("Tab changed"); | |
| 580 bool newtabshown = pDispParams->rgvarg[1].intVal==3; | |
| 581 if (newtabshown) | |
| 582 { | |
| 583 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge tCurrentThreadId()); | |
| 584 if (it == s_threadInstances.end()) | |
| 585 { | |
| 586 s_threadInstances[::GetCurrentThreadId()] = this; | |
| 587 if (!m_isInitializedOk) | |
| 588 { | |
| 589 m_isInitializedOk = true; | |
| 590 InitObject(true); | |
| 591 UpdateStatusBar(); | |
| 592 } | |
| 593 } | |
| 594 } | |
| 595 notificationMessage.Hide(); | |
| 596 DEBUG_GENERAL("Tab change end"); | |
| 597 return S_OK; | |
| 598 } | |
| 599 | |
| 600 // This gets called whenever there's a browser event | |
| 601 // ENTRY POINT | |
| 602 STDMETHODIMP CPluginClass::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, W ORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) | |
| 603 { | 525 { |
| 604 try | 526 try |
| 605 { | 527 { |
| 606 WCHAR tmp[256]; | 528 DEBUG_NAVI(L"Navi::Download Complete") |
| 607 wsprintf(tmp, L"Invoke: %d\n", dispidMember); | 529 ATL::CComPtr<IWebBrowser2> browser = GetBrowser(); |
| 608 DEBUG_GENERAL(tmp); | 530 if (browser) |
| 609 switch (dispidMember) | 531 { |
| 610 { | 532 m_tab->OnDownloadComplete(browser); |
| 611 case DISPID_WINDOWSTATECHANGED: | 533 } |
| 612 { | 534 } |
| 613 // #1163 should validate and convert arguments here | 535 catch (...) |
| 614 return OnTabChanged(pDispParams, wFlags); | 536 { |
| 615 } | 537 } |
| 616 | 538 } |
| 617 case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE: | 539 |
| 618 break; | 540 // Entry point |
| 619 | 541 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD isp, VARIANT* /*urlOrPidl*/) |
| 620 case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK: | 542 { |
| 621 break; | 543 try |
| 622 | 544 { |
| 623 case DISPID_EVMETH_ONLOAD: | 545 DEBUG_NAVI(L"Navi::Document Complete"); |
| 624 DEBUG_NAVI("Navi::OnLoad") | 546 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; |
| 625 break; | 547 if (!webBrowser2) |
| 626 | 548 { |
| 627 case DISPID_EVMETH_ONCHANGE: | 549 return; |
| 628 break; | 550 } |
| 629 | 551 std::wstring frameSrc = GetLocationUrl(*webBrowser2); |
| 630 case DISPID_EVMETH_ONMOUSEDOWN: | 552 UnescapeUrl(frameSrc); |
| 631 break; | 553 bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2); |
| 632 | 554 m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser); |
| 633 case DISPID_EVMETH_ONMOUSEENTER: | 555 } |
| 634 break; | 556 catch (...) |
| 635 | 557 { |
| 636 case DISPID_IHTMLIMGELEMENT_START: | 558 } |
| 637 break; | 559 } |
| 638 | 560 |
| 639 case STDDISPID_XOBJ_ERRORUPDATE: | 561 // Entry point |
| 640 break; | 562 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u nsigned long validFlagsMask) |
| 641 | 563 { |
| 642 case STDDISPID_XOBJ_ONPROPERTYCHANGE: | 564 try |
| 643 break; | 565 { |
| 644 | 566 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)"); |
| 645 case DISPID_READYSTATECHANGE: | 567 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL ECMDIDF_WINDOWSTATE_ENABLED) |
| 646 DEBUG_NAVI("Navi::ReadyStateChange"); | 568 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA BLED); |
| 647 break; | 569 if (newtabshown) |
| 648 | 570 { |
| 649 case DISPID_BEFORENAVIGATE: | 571 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find( GetCurrentThreadId()); |
| 650 DEBUG_NAVI("Navi::BeforeNavigate"); | 572 if (it == s_threadInstances.end()) |
| 651 break; | 573 { |
| 652 | 574 s_threadInstances[::GetCurrentThreadId()] = this; |
| 653 case DISPID_COMMANDSTATECHANGE: | 575 if (!m_isInitializedOk) |
| 654 if (m_hPaneWnd == NULL) | 576 { |
| 655 { | 577 m_isInitializedOk = true; |
| 656 CreateStatusBarPane(); | 578 InitObject(); |
| 657 } | 579 UpdateStatusBar(); |
| 658 else | 580 } |
| 659 { | 581 } |
| 582 } | |
| 583 notificationMessage.Hide(); | |
| 584 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); | |
| 585 } | |
| 586 catch (...) | |
| 587 { | |
| 588 } | |
| 589 } | |
| 590 | |
| 591 // Entry point | |
| 592 void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARI ANT_BOOL /*enable*/) | |
| 593 { | |
| 594 try | |
| 595 { | |
| 596 if (m_hPaneWnd == NULL) | |
| 597 { | |
| 598 CreateStatusBarPane(); | |
| 599 } | |
| 600 else | |
| 601 { | |
| 660 if (AdblockPlus::IE::InstalledMajorVersion() > 6) | 602 if (AdblockPlus::IE::InstalledMajorVersion() > 6) |
| 661 { | 603 { |
| 662 RECT rect; | 604 RECT rect; |
| 663 //Get the RECT for the leftmost pane (the status text pane) | 605 //Get the RECT for the leftmost pane (the status text pane) |
| 664 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)& rect); | 606 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&re ct); |
| 665 if (rectRes == TRUE) | 607 if (rectRes == TRUE) |
| 666 { | 608 { |
| 667 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, r ect.bottom - rect.top, TRUE); | 609 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, rec t.bottom - rect.top, TRUE); |
| 668 } | 610 } |
| 669 } | 611 } |
| 670 } | 612 } |
| 671 break; | 613 } |
| 672 | 614 catch (...) |
| 673 case DISPID_STATUSTEXTCHANGE: | 615 { |
| 674 break; | 616 } |
| 675 | 617 } |
| 676 case DISPID_BEFORENAVIGATE2: | 618 |
| 677 { | 619 // Entry point |
| 678 // #1163 should validate and convert parameters here | 620 void STDMETHODCALLTYPE CPluginClass::OnOnQuit() |
| 679 BeforeNavigate2(pDispParams); | 621 { |
| 680 } | 622 try |
| 681 break; | 623 { |
| 682 | 624 Unadvise(); |
| 683 case DISPID_DOWNLOADBEGIN: | 625 } |
| 684 { | 626 catch (...) |
| 685 DEBUG_NAVI("Navi::Download Begin") | 627 { |
| 686 } | 628 } |
| 687 break; | 629 } |
| 688 | 630 |
| 689 case DISPID_DOWNLOADCOMPLETE: | 631 bool CPluginClass::InitObject() |
| 690 { | |
| 691 DEBUG_NAVI("Navi::Download Complete"); | |
| 692 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | |
| 693 if (browser) | |
| 694 { | |
| 695 m_tab->OnDownloadComplete(browser); | |
| 696 } | |
| 697 } | |
| 698 break; | |
| 699 | |
| 700 case DISPID_DOCUMENTCOMPLETE: | |
| 701 { | |
| 702 DEBUG_NAVI("Navi::Document Complete"); | |
| 703 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | |
| 704 if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == V T_DISPATCH) | |
| 705 { | |
| 706 CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; | |
| 707 if (pBrowser) | |
| 708 { | |
| 709 CComBSTR bstrUrl; | |
| 710 if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && bstrUrl && ::S ysStringLen(bstrUrl) > 0) | |
| 711 { | |
| 712 std::wstring url = std::wstring(bstrUrl, SysStringLen(bstrUrl)); | |
| 713 UnescapeUrl(url); | |
| 714 m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBro wser)); | |
| 715 } | |
| 716 } | |
| 717 } | |
| 718 } | |
| 719 break; | |
| 720 | |
| 721 case DISPID_ONQUIT: | |
| 722 case DISPID_QUIT: | |
| 723 { | |
| 724 Unadvice(); | |
| 725 } | |
| 726 break; | |
| 727 | |
| 728 default: | |
| 729 { | |
| 730 CString did; | |
| 731 did.Format(L"DispId:%u", dispidMember); | |
| 732 | |
| 733 DEBUG_NAVI(L"Navi::Default " + did) | |
| 734 } | |
| 735 /* | |
| 736 * Ordinarily a method not dispatched should return DISP_E_MEMBERNOTFOUND. | |
| 737 * As a conservative initial change, we leave it behaving as before, | |
| 738 * which is to do nothing and return S_OK. | |
| 739 */ | |
| 740 // do nothing | |
| 741 break; | |
| 742 } | |
| 743 } | |
| 744 catch(...) | |
| 745 { | |
| 746 DEBUG_GENERAL( "Caught unknown exception in CPluginClass::Invoke" ); | |
| 747 return E_FAIL; | |
| 748 } | |
| 749 return S_OK; | |
| 750 } | |
| 751 | |
| 752 bool CPluginClass::InitObject(bool bBHO) | |
| 753 { | 632 { |
| 754 DEBUG_GENERAL("InitObject"); | 633 DEBUG_GENERAL("InitObject"); |
| 755 CPluginSettings* settings = CPluginSettings::GetInstance(); | 634 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 756 | 635 |
| 757 if (!settings->GetPluginEnabled()) | 636 if (!settings->GetPluginEnabled()) |
| 758 { | 637 { |
| 759 s_mimeFilter->Unregister(); | 638 s_mimeFilter->Unregister(); |
| 760 } | 639 } |
| 761 | 640 |
| 762 // Load theme module | 641 // Load theme module |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 819 | 698 |
| 820 if (!GetAtomPaneClass()) | 699 if (!GetAtomPaneClass()) |
| 821 { | 700 { |
| 822 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_REGISTE R_PANE_CLASS, "Class::InitObject - RegisterClassEx"); | 701 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_REGISTE R_PANE_CLASS, "Class::InitObject - RegisterClassEx"); |
| 823 return false; | 702 return false; |
| 824 } | 703 } |
| 825 } | 704 } |
| 826 | 705 |
| 827 int ieVersion = AdblockPlus::IE::InstalledMajorVersion(); | 706 int ieVersion = AdblockPlus::IE::InstalledMajorVersion(); |
| 828 // Create status pane | 707 // Create status pane |
| 829 if (bBHO && ieVersion > 6 && !CreateStatusBarPane()) | 708 if (ieVersion > 6 && !CreateStatusBarPane()) |
| 830 { | 709 { |
| 831 return false; | 710 return false; |
| 832 } | 711 } |
| 833 | 712 |
| 834 s_criticalSectionLocal.Lock(); | 713 s_criticalSectionLocal.Lock(); |
| 835 int versionCompRes = CPluginClient::GetInstance()->CompareVersions(CPluginClie nt::GetInstance()->GetPref(L"currentVersion", L"0.0"), L"1.2"); | 714 int versionCompRes = CPluginClient::GetInstance()->CompareVersions(CPluginClie nt::GetInstance()->GetPref(L"currentVersion", L"0.0"), L"1.2"); |
| 836 | 715 |
| 837 bool isFirstRun = CPluginClient::GetInstance()->IsFirstRun(); | 716 bool isFirstRun = CPluginClient::GetInstance()->IsFirstRun(); |
| 838 CPluginClient::GetInstance()->SetPref(L"currentVersion", std::wstring(IEPLUGIN _VERSION)); | 717 CPluginClient::GetInstance()->SetPref(L"currentVersion", std::wstring(IEPLUGIN _VERSION)); |
| 839 // This is the first time ABP was installed | 718 // This is the first time ABP was installed |
| (...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1740 { | 1619 { |
| 1741 CreateStatusBarPane(); | 1620 CreateStatusBarPane(); |
| 1742 } | 1621 } |
| 1743 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1622 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) |
| 1744 { | 1623 { |
| 1745 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1624 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar"); |
| 1746 } | 1625 } |
| 1747 } | 1626 } |
| 1748 | 1627 |
| 1749 | 1628 |
| 1750 void CPluginClass::Unadvice() | 1629 void CPluginClass::Unadvise() |
| 1751 { | 1630 { |
| 1752 s_criticalSectionLocal.Lock(); | 1631 s_criticalSectionLocal.Lock(); |
| 1753 { | 1632 { |
| 1754 if (m_isAdviced) | 1633 if (m_isAdvised) |
| 1755 { | 1634 { |
| 1756 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); | 1635 HRESULT hr = DispEventUnadvise(GetBrowser()); |
| 1757 if (pPoint) | 1636 if (FAILED(hr)) |
| 1758 { | 1637 { |
| 1759 HRESULT hr = pPoint->Unadvise(m_nConnectionID); | 1638 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS E, "Class::Unadvise - Unadvise"); |
| 1760 if (FAILED(hr)) | 1639 } |
| 1761 { | 1640 m_isAdvised = false; |
| 1762 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADV ICE, "Class::Unadvice - Unadvise"); | |
| 1763 } | |
| 1764 } | |
| 1765 | |
| 1766 m_isAdviced = false; | |
| 1767 } | 1641 } |
| 1768 } | 1642 } |
| 1769 s_criticalSectionLocal.Unlock(); | 1643 s_criticalSectionLocal.Unlock(); |
| 1770 } | 1644 } |
| 1771 | 1645 |
| 1772 HICON CPluginClass::GetIcon(int type) | 1646 HICON CPluginClass::GetIcon(int type) |
| 1773 { | 1647 { |
| 1774 HICON icon = NULL; | 1648 HICON icon = NULL; |
| 1775 | 1649 |
| 1776 s_criticalSectionLocal.Lock(); | 1650 s_criticalSectionLocal.Lock(); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1856 break; | 1730 break; |
| 1857 } | 1731 } |
| 1858 s_criticalSectionLocal.Unlock(); | 1732 s_criticalSectionLocal.Unlock(); |
| 1859 | 1733 |
| 1860 } | 1734 } |
| 1861 } | 1735 } |
| 1862 } | 1736 } |
| 1863 | 1737 |
| 1864 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 1738 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); |
| 1865 } | 1739 } |
| 1866 | |
| 1867 return hTabWnd; | 1740 return hTabWnd; |
| 1868 | 1741 } |
| 1869 } | |
| LEFT | RIGHT |