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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 CLOSETHEMEDATA pfnClose = NULL; | 53 CLOSETHEMEDATA pfnClose = NULL; |
54 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; | 54 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; |
55 OPENTHEMEDATA pfnOpenThemeData = NULL; | 55 OPENTHEMEDATA pfnOpenThemeData = NULL; |
56 | 56 |
57 ATOM CPluginClass::s_atomPaneClass = NULL; | 57 ATOM CPluginClass::s_atomPaneClass = NULL; |
58 HINSTANCE CPluginClass::s_hUxtheme = NULL; | 58 HINSTANCE CPluginClass::s_hUxtheme = NULL; |
59 std::set<CPluginClass*> CPluginClass::s_instances; | 59 std::set<CPluginClass*> CPluginClass::s_instances; |
60 std::map<DWORD, CPluginClass*> CPluginClass::s_threadInstances; | 60 std::map<DWORD, CPluginClass*> CPluginClass::s_threadInstances; |
61 | 61 |
62 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal; | 62 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal; |
63 CComAutoCriticalSection CPluginClass::s_criticalSectionBrowser; | |
64 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow; | 63 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow; |
65 | 64 |
66 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2; | 65 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2; |
67 | 66 |
68 /* | 67 /* |
69 * Without namespace declaration, the identifier "Rectangle" is ambiguous | 68 * Without namespace declaration, the identifier "Rectangle" is ambiguous |
70 * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85)
.aspx | 69 * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85)
.aspx |
71 */ | 70 */ |
72 namespace AdblockPlus | 71 namespace AdblockPlus |
73 { | 72 { |
(...skipping 10 matching lines...) Expand all Loading... |
84 } | 83 } |
85 | 84 |
86 int Width() const | 85 int Width() const |
87 { | 86 { |
88 return right - left; | 87 return right - left; |
89 } | 88 } |
90 }; | 89 }; |
91 } | 90 } |
92 | 91 |
93 CPluginClass::CPluginClass() | 92 CPluginClass::CPluginClass() |
| 93 : m_webBrowser2(nullptr) |
94 { | 94 { |
95 //Use this line to debug memory leaks | 95 //Use this line to debug memory leaks |
96 // _CrtDumpMemoryLeaks(); | 96 // _CrtDumpMemoryLeaks(); |
97 | 97 |
98 m_isAdvised = false; | 98 m_isAdvised = false; |
99 m_hTabWnd = NULL; | 99 m_hTabWnd = NULL; |
100 m_hStatusBarWnd = NULL; | 100 m_hStatusBarWnd = NULL; |
101 m_hPaneWnd = NULL; | 101 m_hPaneWnd = NULL; |
102 m_nPaneWidth = 0; | 102 m_nPaneWidth = 0; |
103 m_pWndProcStatus = NULL; | 103 m_pWndProcStatus = NULL; |
104 m_hTheme = NULL; | 104 m_hTheme = NULL; |
105 m_isInitializedOk = false; | 105 m_isInitializedOk = false; |
106 | 106 |
107 | 107 |
108 m_tab = new CPluginTab(this); | 108 m_tab = new CPluginTab(this); |
109 | 109 |
110 Dictionary::Create(GetBrowserLanguage()); | 110 Dictionary::Create(GetBrowserLanguage()); |
111 } | 111 } |
112 | 112 |
113 CPluginClass::~CPluginClass() | 113 CPluginClass::~CPluginClass() |
114 { | 114 { |
115 delete m_tab; | 115 delete m_tab; |
116 } | 116 } |
117 | 117 |
118 | |
119 ///////////////////////////////////////////////////////////////////////////// | |
120 // Initialization | |
121 | |
122 HRESULT CPluginClass::FinalConstruct() | |
123 { | |
124 return S_OK; | |
125 } | |
126 | |
127 void CPluginClass::FinalRelease() | |
128 { | |
129 s_criticalSectionBrowser.Lock(); | |
130 { | |
131 m_webBrowser2.Release(); | |
132 } | |
133 s_criticalSectionBrowser.Unlock(); | |
134 } | |
135 | |
136 HWND CPluginClass::GetBrowserHWND() const | 118 HWND CPluginClass::GetBrowserHWND() const |
137 { | 119 { |
138 SHANDLE_PTR hBrowserWndHandle = NULL; | 120 if (!m_webBrowser2) |
139 | |
140 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | |
141 if (browser) | |
142 { | 121 { |
143 HRESULT hr = browser->get_HWND(&hBrowserWndHandle); | 122 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserHWND - Reached with m_webB
rowser2 == nullptr"); |
144 if (FAILED(hr)) | 123 return nullptr; |
145 { | |
146 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_BROWSER_WINDOW, "
Class::GetBrowserHWND - failed") | |
147 } | |
148 } | 124 } |
149 | 125 SHANDLE_PTR hBrowserWndHandle; |
| 126 HRESULT hr = m_webBrowser2->get_HWND(&hBrowserWndHandle); |
| 127 if (FAILED(hr)) |
| 128 { |
| 129 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_BROWSER_WINDOW, "Cl
ass::GetBrowserHWND - failed") |
| 130 } |
150 return (HWND)hBrowserWndHandle; | 131 return (HWND)hBrowserWndHandle; |
151 } | 132 } |
152 | 133 |
153 | 134 bool CPluginClass::IsRootBrowser(IWebBrowser2* otherBrowser) |
154 CComQIPtr<IWebBrowser2> CPluginClass::GetBrowser() const | |
155 { | 135 { |
156 CComQIPtr<IWebBrowser2> browser; | 136 /* |
157 | 137 * The ownership overhead of 'CComPtr', which we don't need, is what we |
158 s_criticalSectionBrowser.Lock(); | 138 * pay for the convenience of using its member function 'IsEqualObject'. |
159 { | 139 */ |
160 browser = m_webBrowser2; | 140 CComPtr<IWebBrowser2> thisBrowser = m_webBrowser2; |
161 } | 141 return thisBrowser.IsEqualObject(otherBrowser); |
162 s_criticalSectionBrowser.Unlock(); | |
163 | |
164 return browser; | |
165 } | 142 } |
166 | 143 |
167 | |
168 CComQIPtr<IWebBrowser2> CPluginClass::GetAsyncBrowser() | 144 CComQIPtr<IWebBrowser2> CPluginClass::GetAsyncBrowser() |
169 { | 145 { |
170 CComQIPtr<IWebBrowser2> browser; | 146 CComQIPtr<IWebBrowser2> browser; |
171 | 147 |
172 s_criticalSectionLocal.Lock(); | 148 s_criticalSectionLocal.Lock(); |
173 { | 149 { |
174 browser = s_asyncWebBrowser2; | 150 browser = s_asyncWebBrowser2; |
175 } | 151 } |
176 s_criticalSectionLocal.Unlock(); | 152 s_criticalSectionLocal.Unlock(); |
177 | 153 |
178 return browser; | 154 return browser; |
179 } | 155 } |
180 | 156 |
181 std::wstring CPluginClass::GetBrowserUrl() const | 157 std::wstring CPluginClass::GetBrowserUrl() const |
182 { | 158 { |
183 std::wstring url; | 159 std::wstring url; |
184 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 160 if (m_webBrowser2) |
185 if (browser) | |
186 { | 161 { |
187 CComBSTR bstrURL; | 162 CComBSTR bstrURL; |
188 if (SUCCEEDED(browser->get_LocationURL(&bstrURL)) && bstrURL) | 163 if (SUCCEEDED(m_webBrowser2->get_LocationURL(&bstrURL)) && bstrURL) |
189 { | 164 { |
190 url = std::wstring(bstrURL, SysStringLen(bstrURL)); | 165 url = std::wstring(bstrURL, SysStringLen(bstrURL)); |
191 UnescapeUrl(url); | 166 UnescapeUrl(url); |
192 } | 167 } |
193 } | 168 } |
194 else | 169 else |
195 { | 170 { |
| 171 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::GetBrowserUrl - Reached with m_webBr
owser2 == nullptr"); |
196 url = m_tab->GetDocumentUrl(); | 172 url = m_tab->GetDocumentUrl(); |
197 } | 173 } |
198 return url; | 174 return url; |
199 } | 175 } |
200 | 176 |
201 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 177 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
202 { | 178 { |
203 if (thisPtr == NULL) | 179 if (thisPtr == NULL) |
204 return 0; | 180 return 0; |
205 if (!((CPluginClass*)thisPtr)->InitObject()) | 181 if (!((CPluginClass*)thisPtr)->InitObject()) |
(...skipping 22 matching lines...) Expand all Loading... |
228 { | 204 { |
229 | 205 |
230 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
====================================") | 206 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
====================================") |
231 | 207 |
232 HRESULT hr = ::CoInitialize(NULL); | 208 HRESULT hr = ::CoInitialize(NULL); |
233 if (FAILED(hr)) | 209 if (FAILED(hr)) |
234 { | 210 { |
235 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); | 211 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); |
236 } | 212 } |
237 | 213 |
238 s_criticalSectionBrowser.Lock(); | 214 /* |
| 215 * We were instantiated as a BHO, so our site is always of type IWebBrowse
r2. |
| 216 * We don't need to manage the lifetime of our site object, |
| 217 * but we do have to call QueryInterface to convert it. |
| 218 * QueryInterface calls AddRef, and the destructor of CComQIPtr ensures th
at we call Release. |
| 219 */ |
| 220 ATL::CComQIPtr<IWebBrowser2> b(unknownSite); |
| 221 if (!b) |
239 { | 222 { |
240 m_webBrowser2 = unknownSite; | 223 throw std::logic_error("CPluginClass::SetSite - Unable to convert site p
ointer to IWebBrowser2*"); |
241 } | 224 } |
242 s_criticalSectionBrowser.Unlock(); | 225 m_webBrowser2 = b; // implicitly calls (operator IWebBrowser2*) |
243 | 226 |
244 //register the mimefilter | 227 //register the mimefilter |
245 //and only mimefilter | 228 //and only mimefilter |
246 //on some few computers the mimefilter does not get properly registered wh
en it is done on another thread | 229 //on some few computers the mimefilter does not get properly registered wh
en it is done on another thread |
247 | 230 |
248 s_criticalSectionLocal.Lock(); | 231 s_criticalSectionLocal.Lock(); |
249 { | 232 { |
250 // Always register on startup, then check if we need to unregister in a
separate thread | 233 // Always register on startup, then check if we need to unregister in a
separate thread |
251 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 234 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
252 s_asyncWebBrowser2 = unknownSite; | 235 s_asyncWebBrowser2 = unknownSite; |
253 s_instances.insert(this); | 236 s_instances.insert(this); |
254 } | 237 } |
255 s_criticalSectionLocal.Unlock(); | 238 s_criticalSectionLocal.Unlock(); |
256 | 239 |
257 try | 240 try |
258 { | 241 { |
259 auto webBrowser = GetBrowser(); | 242 DEBUG_GENERAL("Loaded as BHO"); |
260 if (webBrowser) | 243 HRESULT hr = DispEventAdvise(m_webBrowser2); |
| 244 if (SUCCEEDED(hr)) |
261 { | 245 { |
262 DEBUG_GENERAL("Loaded as BHO"); | 246 m_isAdvised = true; |
263 HRESULT hr = DispEventAdvise(webBrowser); | 247 try |
264 if (SUCCEEDED(hr)) | |
265 { | 248 { |
266 m_isAdvised = true; | 249 std::thread startInitObjectThread(StartInitObject, this); |
267 try | 250 startInitObjectThread.detach(); // TODO: but actually we should wait
for the thread in the dtr. |
268 { | |
269 std::thread startInitObjectThread(StartInitObject, this); | |
270 startInitObjectThread.detach(); // TODO: but actually we should wa
it for the thread in the dtr. | |
271 } | |
272 catch (const std::system_error& ex) | |
273 { | |
274 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_
THREAD_CREATE_PROCESS, | |
275 "Class::Thread - Failed to create StartInitObject thread"); | |
276 } | |
277 } | 251 } |
278 else | 252 catch (const std::system_error& ex) |
279 { | 253 { |
280 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV
ICE, "Class::SetSite - Advise"); | 254 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
READ_CREATE_PROCESS, |
| 255 "Class::Thread - Failed to create StartInitObject thread"); |
281 } | 256 } |
282 } | 257 } |
| 258 else |
| 259 { |
| 260 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVIC
E, "Class::SetSite - Advise"); |
| 261 } |
283 } | 262 } |
284 catch (const std::runtime_error& ex) | 263 catch (const std::runtime_error& ex) |
285 { | 264 { |
286 DEBUG_EXCEPTION(ex); | 265 DEBUG_EXCEPTION(ex); |
287 Unadvise(); | 266 Unadvise(); |
288 } | 267 } |
289 } | 268 } |
290 else | 269 else |
291 { | 270 { |
292 Unadvise(); | 271 Unadvise(); |
(...skipping 29 matching lines...) Expand all Loading... |
322 s_threadInstances.erase(it); | 301 s_threadInstances.erase(it); |
323 } | 302 } |
324 if (s_instances.empty()) | 303 if (s_instances.empty()) |
325 { | 304 { |
326 // TODO: Explicitly releasing a resource when a container becomes empt
y looks like a job better suited for shared_ptr | 305 // TODO: Explicitly releasing a resource when a container becomes empt
y looks like a job better suited for shared_ptr |
327 CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 306 CPluginClientFactory::ReleaseMimeFilterClientInstance(); |
328 } | 307 } |
329 } | 308 } |
330 s_criticalSectionLocal.Unlock(); | 309 s_criticalSectionLocal.Unlock(); |
331 | 310 |
332 // Release browser interface | |
333 s_criticalSectionBrowser.Lock(); | |
334 { | |
335 m_webBrowser2.Release(); | |
336 } | |
337 s_criticalSectionBrowser.Unlock(); | |
338 | |
339 DEBUG_GENERAL("===========================================================
=====================\nNEW TAB UI - END\n=======================================
=========================================") | 311 DEBUG_GENERAL("===========================================================
=====================\nNEW TAB UI - END\n=======================================
=========================================") |
340 | 312 |
341 ::CoUninitialize(); | 313 ::CoUninitialize(); |
342 } | 314 } |
343 | 315 |
344 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | |
345 } | 316 } |
346 catch (...) | 317 catch (...) |
347 { | 318 { |
348 } | 319 } |
| 320 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); |
349 return S_OK; | 321 return S_OK; |
350 } | 322 } |
351 | 323 |
352 bool CPluginClass::IsStatusBarEnabled() | 324 bool CPluginClass::IsStatusBarEnabled() |
353 { | 325 { |
354 DEBUG_GENERAL("IsStatusBarEnabled start"); | 326 DEBUG_GENERAL("IsStatusBarEnabled start"); |
355 HKEY pHkey; | 327 HKEY pHkey; |
356 HKEY pHkeySub; | 328 HKEY pHkeySub; |
357 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); | 329 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); |
358 DWORD truth = 1; | 330 DWORD truth = 1; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 } | 457 } |
486 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); | 458 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); |
487 UnescapeUrl(url); | 459 UnescapeUrl(url); |
488 | 460 |
489 // If webbrowser2 is equal to top level browser (as set in SetSite), we are | 461 // If webbrowser2 is equal to top level browser (as set in SetSite), we are |
490 // navigating new page | 462 // navigating new page |
491 CPluginClient* client = CPluginClient::GetInstance(); | 463 CPluginClient* client = CPluginClient::GetInstance(); |
492 if (url.find(L"javascript") == 0) | 464 if (url.find(L"javascript") == 0) |
493 { | 465 { |
494 } | 466 } |
495 else if (GetBrowser().IsEqualObject(webBrowser)) | 467 else if (IsRootBrowser(webBrowser)) |
496 { | 468 { |
497 m_tab->OnNavigate(url); | 469 m_tab->OnNavigate(url); |
498 DEBUG_GENERAL( | 470 DEBUG_GENERAL( |
499 L"========================================================================
========\n" | 471 L"========================================================================
========\n" |
500 L"Begin main navigation url:" + url + L"\n" | 472 L"Begin main navigation url:" + url + L"\n" |
501 L"========================================================================
========") | 473 L"========================================================================
========") |
502 | 474 |
503 #ifdef ENABLE_DEBUG_RESULT | 475 #ifdef ENABLE_DEBUG_RESULT |
504 CPluginDebug::DebugResultDomain(url); | 476 CPluginDebug::DebugResultDomain(url); |
505 #endif | 477 #endif |
506 UpdateStatusBar(); | 478 UpdateStatusBar(); |
507 } | 479 } |
508 else | 480 else |
509 { | 481 { |
510 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) | 482 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) |
511 m_tab->CacheFrame(url); | 483 m_tab->CacheFrame(url); |
512 } | 484 } |
513 } | 485 } |
514 catch (...) | 486 catch (...) |
515 { | 487 { |
516 } | 488 } |
517 } | 489 } |
518 | 490 |
519 // Entry point | 491 // Entry point |
520 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() | 492 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() |
521 { | 493 { |
522 try | 494 try |
523 { | 495 { |
| 496 if (!m_webBrowser2) |
| 497 { |
| 498 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::OnDownloadComplete - Reached with
m_webBrowser2 == nullptr"); |
| 499 return; |
| 500 } |
524 DEBUG_NAVI(L"Navi::Download Complete") | 501 DEBUG_NAVI(L"Navi::Download Complete") |
525 ATL::CComPtr<IWebBrowser2> browser = GetBrowser(); | 502 m_tab->OnDownloadComplete(m_webBrowser2); |
526 if (browser) | |
527 { | |
528 m_tab->OnDownloadComplete(browser); | |
529 } | |
530 } | 503 } |
531 catch (...) | 504 catch (...) |
532 { | 505 { |
533 } | 506 } |
534 } | 507 } |
535 | 508 |
536 // Entry point | 509 // Entry point |
537 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) | 510 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) |
538 { | 511 { |
539 try | 512 try |
540 { | 513 { |
541 DEBUG_NAVI(L"Navi::Document Complete"); | 514 DEBUG_NAVI(L"Navi::Document Complete"); |
542 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; | 515 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; |
543 if (!webBrowser2) | 516 if (!webBrowser2) |
544 { | 517 { |
545 return; | 518 return; |
546 } | 519 } |
547 std::wstring frameSrc = GetLocationUrl(*webBrowser2); | 520 std::wstring frameSrc = GetLocationUrl(*webBrowser2); |
548 UnescapeUrl(frameSrc); | 521 UnescapeUrl(frameSrc); |
549 bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2); | 522 m_tab->OnDocumentComplete(webBrowser2, frameSrc, IsRootBrowser(webBrowser2))
; |
550 m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser); | |
551 } | 523 } |
552 catch (...) | 524 catch (...) |
553 { | 525 { |
554 } | 526 } |
555 } | 527 } |
556 | 528 |
557 // Entry point | 529 // Entry point |
558 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) | 530 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) |
559 { | 531 { |
560 try | 532 try |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 { | 591 { |
620 Unadvise(); | 592 Unadvise(); |
621 } | 593 } |
622 catch (...) | 594 catch (...) |
623 { | 595 { |
624 } | 596 } |
625 } | 597 } |
626 | 598 |
627 bool CPluginClass::InitObject() | 599 bool CPluginClass::InitObject() |
628 { | 600 { |
629 DEBUG_GENERAL("InitObject"); | 601 DEBUG_GENERAL("InitObject - begin"); |
630 CPluginSettings* settings = CPluginSettings::GetInstance(); | 602 CPluginSettings* settings = CPluginSettings::GetInstance(); |
631 | 603 |
632 if (!settings->GetPluginEnabled()) | 604 if (!settings->GetPluginEnabled()) |
633 { | 605 { |
634 s_mimeFilter->Unregister(); | 606 s_mimeFilter->Unregister(); |
635 } | 607 } |
636 | 608 |
637 // Load theme module | 609 // Load theme module |
638 s_criticalSectionLocal.Lock(); | 610 s_criticalSectionLocal.Lock(); |
639 { | 611 { |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 if (((m_hPaneWnd == NULL) || !IsStatusBarEnabled()) && isFirstRun) | 704 if (((m_hPaneWnd == NULL) || !IsStatusBarEnabled()) && isFirstRun) |
733 { | 705 { |
734 ShowStatusBar(); | 706 ShowStatusBar(); |
735 } | 707 } |
736 | 708 |
737 // Enable acceptable ads by default | 709 // Enable acceptable ads by default |
738 std::wstring aaUrl = CPluginClient::GetInstance()->GetPref(L"subscriptions_e
xceptionsurl", L""); | 710 std::wstring aaUrl = CPluginClient::GetInstance()->GetPref(L"subscriptions_e
xceptionsurl", L""); |
739 CPluginClient::GetInstance()->AddSubscription(aaUrl); | 711 CPluginClient::GetInstance()->AddSubscription(aaUrl); |
740 } | 712 } |
741 s_criticalSectionLocal.Unlock(); | 713 s_criticalSectionLocal.Unlock(); |
| 714 |
| 715 DEBUG_GENERAL("InitObject - end"); |
742 return true; | 716 return true; |
743 } | 717 } |
744 | 718 |
745 bool CPluginClass::CreateStatusBarPane() | 719 bool CPluginClass::CreateStatusBarPane() |
746 { | 720 { |
747 CriticalSection::Lock lock(m_csStatusBar); | 721 CriticalSection::Lock lock(m_csStatusBar); |
748 | 722 |
749 CPluginClient* client = CPluginClient::GetInstance(); | 723 CPluginClient* client = CPluginClient::GetInstance(); |
750 | 724 |
751 std::array<wchar_t, MAX_PATH> className; | 725 std::array<wchar_t, MAX_PATH> className; |
(...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1621 } | 1595 } |
1622 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1596 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) |
1623 { | 1597 { |
1624 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1598 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); |
1625 } | 1599 } |
1626 } | 1600 } |
1627 | 1601 |
1628 | 1602 |
1629 void CPluginClass::Unadvise() | 1603 void CPluginClass::Unadvise() |
1630 { | 1604 { |
| 1605 if (!m_webBrowser2) |
| 1606 { |
| 1607 DEBUG_ERROR_LOG(0, 0, 0, "CPluginClass::Unadvise - Reached with m_webBrowser
2 == nullptr"); |
| 1608 return; |
| 1609 } |
1631 s_criticalSectionLocal.Lock(); | 1610 s_criticalSectionLocal.Lock(); |
1632 { | 1611 { |
1633 if (m_isAdvised) | 1612 if (m_isAdvised) |
1634 { | 1613 { |
1635 HRESULT hr = DispEventUnadvise(GetBrowser()); | 1614 HRESULT hr = DispEventUnadvise(m_webBrowser2); |
1636 if (FAILED(hr)) | 1615 if (FAILED(hr)) |
1637 { | 1616 { |
1638 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
E, "Class::Unadvise - Unadvise"); | 1617 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
E, "Class::Unadvise - Unadvise"); |
1639 } | 1618 } |
1640 m_isAdvised = false; | 1619 m_isAdvised = false; |
1641 } | 1620 } |
1642 } | 1621 } |
1643 s_criticalSectionLocal.Unlock(); | 1622 s_criticalSectionLocal.Unlock(); |
1644 } | 1623 } |
1645 | 1624 |
(...skipping 19 matching lines...) Expand all Loading... |
1665 s_criticalSectionLocal.Unlock(); | 1644 s_criticalSectionLocal.Unlock(); |
1666 | 1645 |
1667 return icon; | 1646 return icon; |
1668 } | 1647 } |
1669 | 1648 |
1670 ATOM CPluginClass::GetAtomPaneClass() | 1649 ATOM CPluginClass::GetAtomPaneClass() |
1671 { | 1650 { |
1672 return s_atomPaneClass; | 1651 return s_atomPaneClass; |
1673 } | 1652 } |
1674 | 1653 |
1675 HWND CPluginClass::GetTabHWND() const | |
1676 { | |
1677 std::array<wchar_t, MAX_PATH> className; | |
1678 // Get browser window and url | |
1679 HWND hBrowserWnd = GetBrowserHWND(); | |
1680 if (!hBrowserWnd) | |
1681 { | |
1682 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C
lass::GetTabWindow - No tab window") | |
1683 s_criticalSectionWindow.Unlock(); | |
1684 | |
1685 return false; | |
1686 } | |
1687 | |
1688 // Looking for a TabWindowClass window in IE7 | |
1689 | |
1690 HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | |
1691 while (hTabWnd) | |
1692 { | |
1693 className[0] = L'\0'; | |
1694 int classNameLength = GetClassNameW(hTabWnd, className.data(), className.siz
e()); | |
1695 | |
1696 if (classNameLength && (wcscmp(className.data(), L"TabWindowClass") == 0 ||
wcscmp(className.data(), L"Frame Tab") == 0)) | |
1697 { | |
1698 // IE8 support | |
1699 HWND hTabWnd2 = hTabWnd; | |
1700 if (wcscmp(className.data(), L"Frame Tab") == 0) | |
1701 { | |
1702 hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); | |
1703 } | |
1704 | |
1705 if (hTabWnd2) | |
1706 { | |
1707 DWORD nProcessId; | |
1708 ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); | |
1709 if (::GetCurrentProcessId() == nProcessId) | |
1710 { | |
1711 bool bExistingTab = false; | |
1712 s_criticalSectionLocal.Lock(); | |
1713 | |
1714 { | |
1715 for (auto instance : s_instances) | |
1716 { | |
1717 if (instance->m_hTabWnd == hTabWnd2) | |
1718 { | |
1719 bExistingTab = true; | |
1720 break; | |
1721 } | |
1722 } | |
1723 } | |
1724 | |
1725 if (!bExistingTab) | |
1726 { | |
1727 hBrowserWnd = hTabWnd2; | |
1728 hTabWnd = hTabWnd2; | |
1729 s_criticalSectionLocal.Unlock(); | |
1730 break; | |
1731 } | |
1732 s_criticalSectionLocal.Unlock(); | |
1733 | |
1734 } | |
1735 } | |
1736 } | |
1737 | |
1738 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | |
1739 } | |
1740 return hTabWnd; | |
1741 } | |
OLD | NEW |