| 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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 { | 194 { |
| 195 url = m_tab->GetDocumentUrl(); | 195 url = m_tab->GetDocumentUrl(); |
| 196 } | 196 } |
| 197 return url; | 197 return url; |
| 198 } | 198 } |
| 199 | 199 |
| 200 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 200 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
| 201 { | 201 { |
| 202 if (thisPtr == NULL) | 202 if (thisPtr == NULL) |
| 203 return 0; | 203 return 0; |
| 204 if (!((CPluginClass*)thisPtr)->InitObject(true)) | 204 if (!((CPluginClass*)thisPtr)->InitObject()) |
| 205 { | 205 { |
| 206 ((CPluginClass*)thisPtr)->Unadvise(); | 206 ((CPluginClass*)thisPtr)->Unadvise(); |
| 207 } | 207 } |
| 208 | 208 |
| 209 return 0; | 209 return 0; |
| 210 } | 210 } |
| 211 | 211 |
| 212 // This gets called when a new browser window is created (which also triggers th
e | 212 /* |
| 213 // creation of this object). The pointer passed in should be to a IWebBrowser2 | 213 * IE calls this when it creates a new browser window or tab, immediately after
it also |
| 214 // interface that represents the browser for the window. | 214 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob
ject, |
| 215 // it is also called when a tab is closed, this unknownSite will be null | 215 * which is an IWebBrowser2 interface associated with the window/tab. |
| 216 // so we should handle that it is called this way several times during a session | 216 * |
| 217 * IE also ordinarily calls this again when its window/tab is closed, in which c
ase |
| 218 * 'unknownSite' will be null. Extraordinarily, this is sometimes _not_ called w
hen IE |
| 219 * is shutting down. Thus 'SetSite(nullptr)' has some similarities with a destru
ctor, |
| 220 * but it is not a proper substitute for one. |
| 221 */ |
| 217 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) | 222 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) |
| 218 { | 223 { |
| 219 CPluginSettings* settings = CPluginSettings::GetInstance(); | 224 try |
| 225 { |
| 226 if (unknownSite) |
| 227 { |
| 220 | 228 |
| 221 MULTIPLE_VERSIONS_CHECK(); | 229 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
====================================") |
| 222 | 230 |
| 223 if (unknownSite) | 231 HRESULT hr = ::CoInitialize(NULL); |
| 224 { | 232 if (FAILED(hr)) |
| 233 { |
| 234 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); |
| 235 } |
| 225 | 236 |
| 226 DEBUG_GENERAL(L"============================================================
====================\nNEW TAB UI\n==============================================
==================================") | 237 s_criticalSectionBrowser.Lock(); |
| 238 { |
| 239 m_webBrowser2 = unknownSite; |
| 240 } |
| 241 s_criticalSectionBrowser.Unlock(); |
| 227 | 242 |
| 228 HRESULT hr = ::CoInitialize(NULL); | 243 //register the mimefilter |
| 229 if (FAILED(hr)) | 244 //and only mimefilter |
| 245 //on some few computers the mimefilter does not get properly registered wh
en it is done on another thread |
| 246 |
| 247 s_criticalSectionLocal.Lock(); |
| 248 { |
| 249 // Always register on startup, then check if we need to unregister in a
separate thread |
| 250 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 251 s_asyncWebBrowser2 = unknownSite; |
| 252 s_instances.insert(this); |
| 253 } |
| 254 s_criticalSectionLocal.Unlock(); |
| 255 |
| 256 try |
| 257 { |
| 258 auto webBrowser = GetBrowser(); |
| 259 if (webBrowser) |
| 260 { |
| 261 DEBUG_GENERAL("Loaded as BHO"); |
| 262 HRESULT hr = DispEventAdvise(webBrowser); |
| 263 if (SUCCEEDED(hr)) |
| 264 { |
| 265 m_isAdvised = true; |
| 266 try |
| 267 { |
| 268 std::thread startInitObjectThread(StartInitObject, this); |
| 269 startInitObjectThread.detach(); // TODO: but actually we should wa
it for the thread in the dtr. |
| 270 } |
| 271 catch (const std::system_error& ex) |
| 272 { |
| 273 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_
THREAD_CREATE_PROCESS, |
| 274 "Class::Thread - Failed to create StartInitObject thread"); |
| 275 } |
| 276 } |
| 277 else |
| 278 { |
| 279 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV
ICE, "Class::SetSite - Advise"); |
| 280 } |
| 281 } |
| 282 } |
| 283 catch (const std::runtime_error& ex) |
| 284 { |
| 285 DEBUG_EXCEPTION(ex); |
| 286 Unadvise(); |
| 287 } |
| 288 } |
| 289 else |
| 230 { | 290 { |
| 231 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "
Class::SetSite - CoInitialize"); | 291 Unadvise(); |
| 292 |
| 293 // Destroy window |
| 294 if (m_pWndProcStatus) |
| 295 { |
| 296 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn
dProcStatus); |
| 297 |
| 298 m_pWndProcStatus = NULL; |
| 299 } |
| 300 |
| 301 if (m_hPaneWnd) |
| 302 { |
| 303 DestroyWindow(m_hPaneWnd); |
| 304 m_hPaneWnd = NULL; |
| 305 } |
| 306 |
| 307 m_hTabWnd = NULL; |
| 308 m_hStatusBarWnd = NULL; |
| 309 |
| 310 // Remove instance from the list, shutdown threads |
| 311 HANDLE hMainThread = NULL; |
| 312 HANDLE hTabThread = NULL; |
| 313 |
| 314 s_criticalSectionLocal.Lock(); |
| 315 { |
| 316 s_instances.erase(this); |
| 317 |
| 318 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::Ge
tCurrentThreadId()); |
| 319 if (it != s_threadInstances.end()) |
| 320 { |
| 321 s_threadInstances.erase(it); |
| 322 } |
| 323 if (s_instances.empty()) |
| 324 { |
| 325 // TODO: Explicitly releasing a resource when a container becomes empt
y looks like a job better suited for shared_ptr |
| 326 CPluginClientFactory::ReleaseMimeFilterClientInstance(); |
| 327 } |
| 328 } |
| 329 s_criticalSectionLocal.Unlock(); |
| 330 |
| 331 // Release browser interface |
| 332 s_criticalSectionBrowser.Lock(); |
| 333 { |
| 334 m_webBrowser2.Release(); |
| 335 } |
| 336 s_criticalSectionBrowser.Unlock(); |
| 337 |
| 338 DEBUG_GENERAL("===========================================================
=====================\nNEW TAB UI - END\n=======================================
=========================================") |
| 339 |
| 340 ::CoUninitialize(); |
| 232 } | 341 } |
| 233 | 342 |
| 234 s_criticalSectionBrowser.Lock(); | 343 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); |
| 235 { | |
| 236 m_webBrowser2 = unknownSite; | |
| 237 } | |
| 238 s_criticalSectionBrowser.Unlock(); | |
| 239 | |
| 240 //register the mimefilter | |
| 241 //and only mimefilter | |
| 242 //on some few computers the mimefilter does not get properly registered when
it is done on another thread | |
| 243 | |
| 244 s_criticalSectionLocal.Lock(); | |
| 245 { | |
| 246 // Always register on startup, then check if we need to unregister in a se
parate thread | |
| 247 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | |
| 248 s_asyncWebBrowser2 = unknownSite; | |
| 249 s_instances.insert(this); | |
| 250 } | |
| 251 s_criticalSectionLocal.Unlock(); | |
| 252 | |
| 253 try | |
| 254 { | |
| 255 // Check if loaded as BHO | |
| 256 auto webBrowser = GetBrowser(); | |
| 257 if (webBrowser) | |
| 258 { | |
| 259 DEBUG_GENERAL("Loaded as BHO"); | |
| 260 HRESULT hr = DispEventAdvise(webBrowser); | |
| 261 if (SUCCEEDED(hr)) | |
| 262 { | |
| 263 m_isAdvised = true; | |
| 264 try | |
| 265 { | |
| 266 std::thread startInitObjectThread(StartInitObject, this); | |
| 267 startInitObjectThread.detach(); // TODO: but actually we should wait
for the thread in the dtr. | |
| 268 } | |
| 269 catch (const std::system_error& ex) | |
| 270 { | |
| 271 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
READ_CREATE_PROCESS, | |
| 272 "Class::Thread - Failed to create StartInitObject thread"); | |
| 273 } | |
| 274 } | |
| 275 else | |
| 276 { | |
| 277 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVIC
E, "Class::SetSite - Advise"); | |
| 278 } | |
| 279 } | |
| 280 else // Check if loaded as toolbar handler | |
| 281 { | |
| 282 DEBUG_GENERAL("Loaded as toolbar handler"); | |
| 283 CComPtr<IServiceProvider> pServiceProvider; | |
| 284 | |
| 285 HRESULT hr = unknownSite->QueryInterface(&pServiceProvider); | |
| 286 if (SUCCEEDED(hr)) | |
| 287 { | |
| 288 if (pServiceProvider) | |
| 289 { | |
| 290 s_criticalSectionBrowser.Lock(); | |
| 291 { | |
| 292 HRESULT hr = pServiceProvider->QueryService(IID_IWebBrowserApp, &m
_webBrowser2); | |
| 293 if (SUCCEEDED(hr)) | |
| 294 { | |
| 295 if (m_webBrowser2) | |
| 296 { | |
| 297 InitObject(false); | |
| 298 } | |
| 299 } | |
| 300 else | |
| 301 { | |
| 302 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE
_QUERY_BROWSER, "Class::SetSite - QueryService (IID_IWebBrowserApp)"); | |
| 303 } | |
| 304 } | |
| 305 s_criticalSectionBrowser.Unlock(); | |
| 306 } | |
| 307 } | |
| 308 else | |
| 309 { | |
| 310 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY
_SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)"); | |
| 311 } | |
| 312 } | |
| 313 } | |
| 314 catch (const std::runtime_error& ex) | |
| 315 { | |
| 316 DEBUG_EXCEPTION(ex); | |
| 317 Unadvise(); | |
| 318 } | |
| 319 } | 344 } |
| 320 else | 345 catch (...) |
| 321 { | 346 { |
| 322 Unadvise(); | |
| 323 | |
| 324 // Destroy window | |
| 325 if (m_pWndProcStatus) | |
| 326 { | |
| 327 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWndP
rocStatus); | |
| 328 | |
| 329 m_pWndProcStatus = NULL; | |
| 330 } | |
| 331 | |
| 332 if (m_hPaneWnd) | |
| 333 { | |
| 334 DestroyWindow(m_hPaneWnd); | |
| 335 m_hPaneWnd = NULL; | |
| 336 } | |
| 337 | |
| 338 m_hTabWnd = NULL; | |
| 339 m_hStatusBarWnd = NULL; | |
| 340 | |
| 341 // Remove instance from the list, shutdown threads | |
| 342 HANDLE hMainThread = NULL; | |
| 343 HANDLE hTabThread = NULL; | |
| 344 | |
| 345 s_criticalSectionLocal.Lock(); | |
| 346 { | |
| 347 s_instances.erase(this); | |
| 348 | |
| 349 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetC
urrentThreadId()); | |
| 350 if (it != s_threadInstances.end()) | |
| 351 { | |
| 352 s_threadInstances.erase(it); | |
| 353 } | |
| 354 if (s_instances.empty()) | |
| 355 { | |
| 356 // TODO: Explicitly releasing a resource when a container becomes empty
looks like a job better suited for shared_ptr | |
| 357 CPluginClientFactory::ReleaseMimeFilterClientInstance(); | |
| 358 } | |
| 359 } | |
| 360 s_criticalSectionLocal.Unlock(); | |
| 361 | |
| 362 // Release browser interface | |
| 363 s_criticalSectionBrowser.Lock(); | |
| 364 { | |
| 365 m_webBrowser2.Release(); | |
| 366 } | |
| 367 s_criticalSectionBrowser.Unlock(); | |
| 368 | |
| 369 DEBUG_GENERAL("=============================================================
===================\nNEW TAB UI - END\n=========================================
=======================================") | |
| 370 | |
| 371 ::CoUninitialize(); | |
| 372 } | 347 } |
| 373 | 348 return S_OK; |
| 374 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | |
| 375 } | 349 } |
| 376 | 350 |
| 377 bool CPluginClass::IsStatusBarEnabled() | 351 bool CPluginClass::IsStatusBarEnabled() |
| 378 { | 352 { |
| 379 DEBUG_GENERAL("IsStatusBarEnabled start"); | 353 DEBUG_GENERAL("IsStatusBarEnabled start"); |
| 380 HKEY pHkey; | 354 HKEY pHkey; |
| 381 HKEY pHkeySub; | 355 HKEY pHkeySub; |
| 382 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); | 356 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); |
| 383 DWORD truth = 1; | 357 DWORD truth = 1; |
| 384 DWORD truthSize = sizeof(truth); | 358 DWORD truthSize = sizeof(truth); |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA
BLED); | 568 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA
BLED); |
| 595 if (newtabshown) | 569 if (newtabshown) |
| 596 { | 570 { |
| 597 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(
GetCurrentThreadId()); | 571 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(
GetCurrentThreadId()); |
| 598 if (it == s_threadInstances.end()) | 572 if (it == s_threadInstances.end()) |
| 599 { | 573 { |
| 600 s_threadInstances[::GetCurrentThreadId()] = this; | 574 s_threadInstances[::GetCurrentThreadId()] = this; |
| 601 if (!m_isInitializedOk) | 575 if (!m_isInitializedOk) |
| 602 { | 576 { |
| 603 m_isInitializedOk = true; | 577 m_isInitializedOk = true; |
| 604 InitObject(true); | 578 InitObject(); |
| 605 UpdateStatusBar(); | 579 UpdateStatusBar(); |
| 606 } | 580 } |
| 607 } | 581 } |
| 608 } | 582 } |
| 609 notificationMessage.Hide(); | 583 notificationMessage.Hide(); |
| 610 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); | 584 DEBUG_GENERAL(L"WindowStateChanged (check tab changed) end"); |
| 611 } | 585 } |
| 612 catch (...) | 586 catch (...) |
| 613 { | 587 { |
| 614 } | 588 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 { | 621 { |
| 648 try | 622 try |
| 649 { | 623 { |
| 650 Unadvise(); | 624 Unadvise(); |
| 651 } | 625 } |
| 652 catch (...) | 626 catch (...) |
| 653 { | 627 { |
| 654 } | 628 } |
| 655 } | 629 } |
| 656 | 630 |
| 657 bool CPluginClass::InitObject(bool bBHO) | 631 bool CPluginClass::InitObject() |
| 658 { | 632 { |
| 659 DEBUG_GENERAL("InitObject"); | 633 DEBUG_GENERAL("InitObject"); |
| 660 CPluginSettings* settings = CPluginSettings::GetInstance(); | 634 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 661 | 635 |
| 662 if (!settings->GetPluginEnabled()) | 636 if (!settings->GetPluginEnabled()) |
| 663 { | 637 { |
| 664 s_mimeFilter->Unregister(); | 638 s_mimeFilter->Unregister(); |
| 665 } | 639 } |
| 666 | 640 |
| 667 // Load theme module | 641 // Load theme module |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 | 698 |
| 725 if (!GetAtomPaneClass()) | 699 if (!GetAtomPaneClass()) |
| 726 { | 700 { |
| 727 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"); |
| 728 return false; | 702 return false; |
| 729 } | 703 } |
| 730 } | 704 } |
| 731 | 705 |
| 732 int ieVersion = AdblockPlus::IE::InstalledMajorVersion(); | 706 int ieVersion = AdblockPlus::IE::InstalledMajorVersion(); |
| 733 // Create status pane | 707 // Create status pane |
| 734 if (bBHO && ieVersion > 6 && !CreateStatusBarPane()) | 708 if (ieVersion > 6 && !CreateStatusBarPane()) |
| 735 { | 709 { |
| 736 return false; | 710 return false; |
| 737 } | 711 } |
| 738 | 712 |
| 739 s_criticalSectionLocal.Lock(); | 713 s_criticalSectionLocal.Lock(); |
| 740 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"); |
| 741 | 715 |
| 742 bool isFirstRun = CPluginClient::GetInstance()->IsFirstRun(); | 716 bool isFirstRun = CPluginClient::GetInstance()->IsFirstRun(); |
| 743 CPluginClient::GetInstance()->SetPref(L"currentVersion", std::wstring(IEPLUGIN
_VERSION)); | 717 CPluginClient::GetInstance()->SetPref(L"currentVersion", std::wstring(IEPLUGIN
_VERSION)); |
| 744 // This is the first time ABP was installed | 718 // This is the first time ABP was installed |
| (...skipping 1013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1758 s_criticalSectionLocal.Unlock(); | 1732 s_criticalSectionLocal.Unlock(); |
| 1759 | 1733 |
| 1760 } | 1734 } |
| 1761 } | 1735 } |
| 1762 } | 1736 } |
| 1763 | 1737 |
| 1764 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 1738 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); |
| 1765 } | 1739 } |
| 1766 return hTabWnd; | 1740 return hTabWnd; |
| 1767 } | 1741 } |
| OLD | NEW |