Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: src/plugin/PluginClass.cpp

Issue 6216090891845632: Issue #404 - Create common library shared between plugin/engine and installer (Closed)
Left Patch Set: Created Jan. 9, 2015, 8:07 p.m.
Right Patch Set: final check after rebase Created May 19, 2015, 3:36 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « src/engine/Main.cpp ('k') | src/plugin/PluginTabBase.cpp » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH
4 *
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
7 * published by the Free Software Foundation.
8 *
9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */
17
1 #include "PluginStdAfx.h" 18 #include "PluginStdAfx.h"
2 19
3 #include "PluginClass.h" 20 #include "PluginClass.h"
4 #include "PluginSettings.h" 21 #include "PluginSettings.h"
5 #include "PluginSystem.h" 22 #include "PluginSystem.h"
6 #include "PluginFilter.h" 23 #include "PluginFilter.h"
7 #include "PluginMimeFilterClient.h" 24 #include "PluginMimeFilterClient.h"
8 #include "PluginClient.h" 25 #include "PluginClient.h"
9 #include "PluginClientFactory.h" 26 #include "PluginClientFactory.h"
10 #include "PluginMutex.h" 27 #include "PluginMutex.h"
11 #include "sddl.h" 28 #include "sddl.h"
12 #include "PluginUtil.h" 29 #include "PluginUtil.h"
13 #include "PluginUserSettings.h" 30 #include "PluginUserSettings.h"
14 #include "../shared/Utils.h" 31 #include "../shared/Utils.h"
15 #include "../shared/Dictionary.h" 32 #include "../shared/Dictionary.h"
16 #include "IE_Version.h" 33 #include "IeVersion.h"
17 #include <thread> 34 #include <thread>
18 #include <array> 35 #include <array>
19 36
20 #ifdef DEBUG_HIDE_EL 37 #ifdef DEBUG_HIDE_EL
21 DWORD profileTime = 0; 38 DWORD profileTime = 0;
22 #endif 39 #endif
23 40
24 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); 41 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR);
25 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR ECT); 42 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR ECT);
26 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); 43 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE);
27 44
28 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL }; 45 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL };
29 DWORD CPluginClass::s_hIconTypes[ICON_MAX] = { IDI_ICON_DISABLED, IDI_ICON_ENABL ED, IDI_ICON_DEACTIVATED }; 46 DWORD CPluginClass::s_hIconTypes[ICON_MAX] = { IDI_ICON_DISABLED, IDI_ICON_ENABL ED, IDI_ICON_DEACTIVATED };
47 uint32_t iconHeight = 32;
48 uint32_t iconWidth = 32;
30 49
31 CPluginMimeFilterClient* CPluginClass::s_mimeFilter = NULL; 50 CPluginMimeFilterClient* CPluginClass::s_mimeFilter = NULL;
32 51
33 CLOSETHEMEDATA pfnClose = NULL; 52 CLOSETHEMEDATA pfnClose = NULL;
34 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; 53 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL;
35 OPENTHEMEDATA pfnOpenThemeData = NULL; 54 OPENTHEMEDATA pfnOpenThemeData = NULL;
36 55
37 ATOM CPluginClass::s_atomPaneClass = NULL; 56 ATOM CPluginClass::s_atomPaneClass = NULL;
38 HINSTANCE CPluginClass::s_hUxtheme = NULL; 57 HINSTANCE CPluginClass::s_hUxtheme = NULL;
39 std::set<CPluginClass*> CPluginClass::s_instances; 58 std::set<CPluginClass*> CPluginClass::s_instances;
(...skipping 28 matching lines...) Expand all
68 return right - left; 87 return right - left;
69 } 88 }
70 }; 89 };
71 } 90 }
72 91
73 CPluginClass::CPluginClass() 92 CPluginClass::CPluginClass()
74 { 93 {
75 //Use this line to debug memory leaks 94 //Use this line to debug memory leaks
76 // _CrtDumpMemoryLeaks(); 95 // _CrtDumpMemoryLeaks();
77 96
78 m_isAdviced = false; 97 m_isAdvised = false;
79 m_nConnectionID = 0;
80 m_hTabWnd = NULL; 98 m_hTabWnd = NULL;
81 m_hStatusBarWnd = NULL; 99 m_hStatusBarWnd = NULL;
82 m_hPaneWnd = NULL; 100 m_hPaneWnd = NULL;
83 m_nPaneWidth = 0; 101 m_nPaneWidth = 0;
84 m_pWndProcStatus = NULL; 102 m_pWndProcStatus = NULL;
85 m_hTheme = NULL; 103 m_hTheme = NULL;
86 m_isInitializedOk = false; 104 m_isInitializedOk = false;
87 105
88 106
89 m_tab = new CPluginTab(this); 107 m_tab = new CPluginTab(this);
(...skipping 17 matching lines...) Expand all
107 125
108 void CPluginClass::FinalRelease() 126 void CPluginClass::FinalRelease()
109 { 127 {
110 s_criticalSectionBrowser.Lock(); 128 s_criticalSectionBrowser.Lock();
111 { 129 {
112 m_webBrowser2.Release(); 130 m_webBrowser2.Release();
113 } 131 }
114 s_criticalSectionBrowser.Unlock(); 132 s_criticalSectionBrowser.Unlock();
115 } 133 }
116 134
117
118 // This method tries to get a 'connection point' from the stored browser, which can be
119 // used to attach or detach from the stream of browser events
120 CComPtr<IConnectionPoint> CPluginClass::GetConnectionPoint()
121 {
122 CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> pContaine r(GetBrowser());
123 if (!pContainer)
124 {
125 return NULL;
126 }
127
128 CComPtr<IConnectionPoint> pPoint;
129 HRESULT hr = pContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &pPoint) ;
130 if (FAILED(hr))
131 {
132 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_FIND_CONNEC TION_POINT, "Class::GetConnectionPoint - FindConnectionPoint")
133 return NULL;
134 }
135
136 return pPoint;
137 }
138
139 HWND CPluginClass::GetBrowserHWND() const 135 HWND CPluginClass::GetBrowserHWND() const
140 { 136 {
141 SHANDLE_PTR hBrowserWndHandle = NULL; 137 SHANDLE_PTR hBrowserWndHandle = NULL;
142 138
143 CComQIPtr<IWebBrowser2> browser = GetBrowser(); 139 CComQIPtr<IWebBrowser2> browser = GetBrowser();
144 if (browser) 140 if (browser)
145 { 141 {
146 HRESULT hr = browser->get_HWND(&hBrowserWndHandle); 142 HRESULT hr = browser->get_HWND(&hBrowserWndHandle);
147 if (FAILED(hr)) 143 if (FAILED(hr))
148 { 144 {
(...skipping 25 matching lines...) Expand all
174 170
175 s_criticalSectionLocal.Lock(); 171 s_criticalSectionLocal.Lock();
176 { 172 {
177 browser = s_asyncWebBrowser2; 173 browser = s_asyncWebBrowser2;
178 } 174 }
179 s_criticalSectionLocal.Unlock(); 175 s_criticalSectionLocal.Unlock();
180 176
181 return browser; 177 return browser;
182 } 178 }
183 179
184 CString CPluginClass::GetBrowserUrl() const 180 std::wstring CPluginClass::GetBrowserUrl() const
185 { 181 {
186 CString url; 182 std::wstring url;
187
188 CComQIPtr<IWebBrowser2> browser = GetBrowser(); 183 CComQIPtr<IWebBrowser2> browser = GetBrowser();
189 if (browser) 184 if (browser)
190 { 185 {
191 CComBSTR bstrURL; 186 CComBSTR bstrURL;
192 187 if (SUCCEEDED(browser->get_LocationURL(&bstrURL)) && bstrURL)
193 if (SUCCEEDED(browser->get_LocationURL(&bstrURL))) 188 {
194 { 189 url = std::wstring(bstrURL, SysStringLen(bstrURL));
195 url = bstrURL; 190 UnescapeUrl(url);
196 CPluginClient::UnescapeUrl(url);
197 } 191 }
198 } 192 }
199 else 193 else
200 { 194 {
201 url = m_tab->GetDocumentUrl(); 195 url = m_tab->GetDocumentUrl();
202 } 196 }
203
204 return url; 197 return url;
205 } 198 }
206 199
207 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) 200 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr)
208 { 201 {
209 if (thisPtr == NULL) 202 if (thisPtr == NULL)
210 return 0; 203 return 0;
211 if (!((CPluginClass*)thisPtr)->InitObject(true)) 204 if (!((CPluginClass*)thisPtr)->InitObject())
212 { 205 {
213 ((CPluginClass*)thisPtr)->Unadvice(); 206 ((CPluginClass*)thisPtr)->Unadvise();
214 } 207 }
215 208
216 return 0; 209 return 0;
217 } 210 }
218 211
219 212 /*
220 213 * IE calls this when it creates a new browser window or tab, immediately after it also
221 // This gets called when a new browser window is created (which also triggers th e 214 * creates the object. The argument 'unknownSite' in is the OLE "site" of the ob ject,
222 // creation of this object). The pointer passed in should be to a IWebBrowser2 215 * which is an IWebBrowser2 interface associated with the window/tab.
223 // interface that represents the browser for the window. 216 *
224 // it is also called when a tab is closed, this unknownSite will be null 217 * IE also ordinarily calls this again when its window/tab is closed, in which c ase
225 // so we should handle that it is called this way several times during a session 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 */
226 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) 222 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite)
227 { 223 {
228 CPluginSettings* settings = CPluginSettings::GetInstance(); 224 try
229 225 {
230 MULTIPLE_VERSIONS_CHECK(); 226 if (unknownSite)
231 227 {
232 if (unknownSite) 228
233 { 229 DEBUG_GENERAL(L"========================================================== ======================\nNEW TAB UI\n============================================ ====================================")
234 230
235 DEBUG_GENERAL(L"============================================================ ====================\nNEW TAB UI\n============================================== ==================================") 231 HRESULT hr = ::CoInitialize(NULL);
236 232 if (FAILED(hr))
237 HRESULT hr = ::CoInitialize(NULL); 233 {
238 if (FAILED(hr)) 234 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "Class::SetSite - CoInitialize");
239 { 235 }
240 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, " Class::SetSite - CoInitialize"); 236
241 } 237 s_criticalSectionBrowser.Lock();
242 238 {
243 s_criticalSectionBrowser.Lock(); 239 m_webBrowser2 = unknownSite;
244 { 240 }
245 m_webBrowser2 = unknownSite; 241 s_criticalSectionBrowser.Unlock();
246 } 242
247 s_criticalSectionBrowser.Unlock(); 243 //register the mimefilter
248 244 //and only mimefilter
249 //register the mimefilter 245 //on some few computers the mimefilter does not get properly registered wh en it is done on another thread
250 //and only mimefilter 246
251 //on some few computers the mimefilter does not get properly registered when it is done on another thread 247 s_criticalSectionLocal.Lock();
252 248 {
253 s_criticalSectionLocal.Lock(); 249 // Always register on startup, then check if we need to unregister in a separate thread
254 { 250 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
255 // Always register on startup, then check if we need to unregister in a se parate thread 251 s_asyncWebBrowser2 = unknownSite;
256 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); 252 s_instances.insert(this);
257 s_asyncWebBrowser2 = unknownSite; 253 }
258 s_instances.insert(this); 254 s_criticalSectionLocal.Unlock();
259 } 255
260 s_criticalSectionLocal.Unlock(); 256 try
261 257 {
262 try 258 auto webBrowser = GetBrowser();
263 { 259 if (webBrowser)
264 // Check if loaded as BHO 260 {
265 if (GetBrowser()) 261 DEBUG_GENERAL("Loaded as BHO");
266 { 262 HRESULT hr = DispEventAdvise(webBrowser);
267 DEBUG_GENERAL("Loaded as BHO");
268 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint();
269 if (pPoint)
270 {
271 HRESULT hr = pPoint->Advise((IDispatch*)this, &m_nConnectionID);
272 if (SUCCEEDED(hr)) 263 if (SUCCEEDED(hr))
273 { 264 {
274 m_isAdviced = true; 265 m_isAdvised = true;
275
276 try 266 try
277 { 267 {
278 std::thread startInitObjectThread(StartInitObject, this); 268 std::thread startInitObjectThread(StartInitObject, this);
279 startInitObjectThread.detach(); // TODO: but actually we should wa it for the thread in the dtr. 269 startInitObjectThread.detach(); // TODO: but actually we should wa it for the thread in the dtr.
280 } 270 }
281 catch (const std::system_error& ex) 271 catch (const std::system_error& ex)
282 { 272 {
283 auto errDescription = std::string("Class::Thread - Failed to creat e StartInitObject thread, ") + 273 DEBUG_SYSTEM_EXCEPTION(ex, PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_ THREAD_CREATE_PROCESS,
284 ex.code().message() + ex.what(); 274 "Class::Thread - Failed to create StartInitObject thread");
285 DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERR OR_MAIN_THREAD_CREATE_PROCESS, errDescription.c_str());
286 } 275 }
287 } 276 }
288 else 277 else
289 { 278 {
290 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV ICE, "Class::SetSite - Advice"); 279 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV ICE, "Class::SetSite - Advise");
291 } 280 }
292 } 281 }
293 } 282 }
294 else // Check if loaded as toolbar handler 283 catch (const std::runtime_error& ex)
295 { 284 {
296 DEBUG_GENERAL("Loaded as toolbar handler"); 285 DEBUG_EXCEPTION(ex);
297 CComPtr<IServiceProvider> pServiceProvider; 286 Unadvise();
298 287 }
299 HRESULT hr = unknownSite->QueryInterface(&pServiceProvider); 288 }
300 if (SUCCEEDED(hr)) 289 else
301 { 290 {
302 if (pServiceProvider) 291 Unadvise();
303 { 292
304 s_criticalSectionBrowser.Lock(); 293 // Destroy window
305 { 294 if (m_pWndProcStatus)
306 HRESULT hr = pServiceProvider->QueryService(IID_IWebBrowserApp, &m _webBrowser2); 295 {
307 if (SUCCEEDED(hr)) 296 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn dProcStatus);
308 { 297
309 if (m_webBrowser2) 298 m_pWndProcStatus = NULL;
310 { 299 }
311 InitObject(false); 300
312 } 301 if (m_hPaneWnd)
313 } 302 {
314 else 303 DestroyWindow(m_hPaneWnd);
315 { 304 m_hPaneWnd = NULL;
316 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE _QUERY_BROWSER, "Class::SetSite - QueryService (IID_IWebBrowserApp)"); 305 }
317 } 306
318 } 307 m_hTabWnd = NULL;
319 s_criticalSectionBrowser.Unlock(); 308 m_hStatusBarWnd = NULL;
320 } 309
321 } 310 // Remove instance from the list, shutdown threads
322 else 311 HANDLE hMainThread = NULL;
323 { 312 HANDLE hTabThread = NULL;
324 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY _SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)"); 313
325 } 314 s_criticalSectionLocal.Lock();
326 } 315 {
327 } 316 s_instances.erase(this);
328 catch (std::runtime_error e) 317
329 { 318 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::Ge tCurrentThreadId());
330 DEBUG_ERROR(e.what()); 319 if (it != s_threadInstances.end())
331 Unadvice(); 320 {
332 } 321 s_threadInstances.erase(it);
333 } 322 }
334 else 323 if (s_instances.empty())
335 { 324 {
336 // Unadvice 325 // TODO: Explicitly releasing a resource when a container becomes empt y looks like a job better suited for shared_ptr
337 Unadvice(); 326 CPluginClientFactory::ReleaseMimeFilterClientInstance();
338 327 }
339 // Destroy window 328 }
340 if (m_pWndProcStatus) 329 s_criticalSectionLocal.Unlock();
341 { 330
342 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWndP rocStatus); 331 // Release browser interface
343 332 s_criticalSectionBrowser.Lock();
344 m_pWndProcStatus = NULL; 333 {
345 } 334 m_webBrowser2.Release();
346 335 }
347 if (m_hPaneWnd) 336 s_criticalSectionBrowser.Unlock();
348 { 337
349 DestroyWindow(m_hPaneWnd); 338 DEBUG_GENERAL("=========================================================== =====================\nNEW TAB UI - END\n======================================= =========================================")
350 m_hPaneWnd = NULL; 339
351 } 340 ::CoUninitialize();
352 341 }
353 m_hTabWnd = NULL; 342
354 m_hStatusBarWnd = NULL; 343 IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite);
355 344 }
356 // Remove instance from the list, shutdown threads 345 catch (...)
357 HANDLE hMainThread = NULL; 346 {
358 HANDLE hTabThread = NULL; 347 }
359 348 return S_OK;
360 s_criticalSectionLocal.Lock();
361 {
362 s_instances.erase(this);
363
364 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetC urrentThreadId());
365 if (it != s_threadInstances.end())
366 {
367 s_threadInstances.erase(it);
368 }
369 if (s_instances.empty())
370 {
371 // TODO: Explicitly releasing a resource when a container becomes empty looks like a job better suited for shared_ptr
372 CPluginClientFactory::ReleaseMimeFilterClientInstance();
373 }
374 }
375 s_criticalSectionLocal.Unlock();
376
377 // Release browser interface
378 s_criticalSectionBrowser.Lock();
379 {
380 m_webBrowser2.Release();
381 }
382 s_criticalSectionBrowser.Unlock();
383
384 DEBUG_GENERAL("============================================================= ===================\nNEW TAB UI - END\n========================================= =======================================")
385
386 ::CoUninitialize();
387 }
388
389 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite);
390 } 349 }
391 350
392 bool CPluginClass::IsStatusBarEnabled() 351 bool CPluginClass::IsStatusBarEnabled()
393 { 352 {
394 DEBUG_GENERAL("IsStatusBarEnabled start"); 353 DEBUG_GENERAL("IsStatusBarEnabled start");
395 HKEY pHkey; 354 HKEY pHkey;
396 HKEY pHkeySub; 355 HKEY pHkeySub;
397 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); 356 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey);
398 DWORD truth = 1; 357 DWORD truth = 1;
399 DWORD truthSize = sizeof(truth); 358 DWORD truthSize = sizeof(truth);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 } 454 }
496 } 455 }
497 else 456 else
498 { 457 {
499 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");
500 } 459 }
501 } 460 }
502 DEBUG_GENERAL("ShowStatusBar end"); 461 DEBUG_GENERAL("ShowStatusBar end");
503 } 462 }
504 463
505 /* 464 // Entry point
506 * #1163 This class is the implementation for method DISPID_BEFORENAVIGATE2 in C PluginClass::Invoke. 465 void STDMETHODCALLTYPE CPluginClass::OnBeforeNavigate2(
507 * - It validates and convertes its own arguments, rather than unifying them in the Invoke body. 466 IDispatch* frameBrowserDisp /**< [in] */,
508 * - It's declared void and not HRESULT, so DISPID_BEFORENAVIGATE2 can only retu rn S_OK. 467 VARIANT* urlVariant /**< [in] */,
509 */ 468 VARIANT* /**< [in] Flags*/,
510 void CPluginClass::BeforeNavigate2(DISPPARAMS* pDispParams) 469 VARIANT* /**< [in] TargetFrameName*/,
511 { 470 VARIANT* /**< [in] PostData*/,
512 471 VARIANT* /**< [in] Headers*/,
513 if (pDispParams->cArgs < 7) 472 VARIANT_BOOL* /**< [in, out] Cancel*/)
514 { 473 {
515 return; 474 try
516 } 475 {
517 //Register a mime filter if it's not registered yet 476 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp;
518 if (s_mimeFilter == NULL) 477 if (!webBrowser)
519 { 478 {
520 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); 479 return;
521 } 480 }
522 481 if (!urlVariant || urlVariant->vt != VT_BSTR)
523 // Get the IWebBrowser2 interface 482 {
524 CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> WebBrowser2Ptr; 483 return;
525 VARTYPE vt = pDispParams->rgvarg[6].vt; 484 }
526 if (vt == VT_DISPATCH) 485 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal));
527 { 486 UnescapeUrl(url);
528 WebBrowser2Ptr = pDispParams->rgvarg[6].pdispVal; 487
529 } 488 //Register a mime filter if it's not registered yet
530 else 489 if (s_mimeFilter == nullptr)
531 { 490 {
532 // Wrong type, return. 491 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
533 return; 492 }
534 } 493 // If webbrowser2 is equal to top level browser (as set in SetSite), we are
535 494 // navigating new page
536 // Get the URL 495 CPluginClient* client = CPluginClient::GetInstance();
537 CString url; 496 if (url.find(L"javascript") == 0)
538 vt = pDispParams->rgvarg[5].vt; 497 {
539 if (vt == VT_BYREF + VT_VARIANT) 498 }
540 { 499 else if (GetBrowser().IsEqualObject(webBrowser))
541 url = pDispParams->rgvarg[5].pvarVal->bstrVal; 500 {
542 501 m_tab->OnNavigate(url);
543 CPluginClient::UnescapeUrl(url); 502 DEBUG_GENERAL(
544 } 503 L"======================================================================== ========\n"
545 else 504 L"Begin main navigation url:" + url + L"\n"
546 { 505 L"======================================================================== ========")
547 // Wrong type, return.
548 return;
549 }
550
551 // If webbrowser2 is equal to top level browser (as set in SetSite), we are na vigating new page
552 CPluginClient* client = CPluginClient::GetInstance();
553
554 if (url.Find(L"javascript") == 0)
555 {
556 }
557 else if (GetBrowser().IsEqualObject(WebBrowser2Ptr))
558 {
559 m_tab->OnNavigate(url);
560
561 DEBUG_GENERAL(L"============================================================ ====================\nBegin main navigation url:" + url + "\n=================== =============================================================")
562 506
563 #ifdef ENABLE_DEBUG_RESULT 507 #ifdef ENABLE_DEBUG_RESULT
564 CPluginDebug::DebugResultDomain(url); 508 CPluginDebug::DebugResultDomain(url);
565 #endif 509 #endif
566 510 UpdateStatusBar();
567 UpdateStatusBar(); 511 }
568 } 512 else
569 else 513 {
570 { 514 DEBUG_NAVI(L"Navi::Begin navigation url:" + url)
571 DEBUG_NAVI(L"Navi::Begin navigation url:" + url) 515 m_tab->CacheFrame(url);
572 m_tab->CacheFrame(url); 516 }
573 } 517 }
574 } 518 catch (...)
575 519 {
576 /* 520 }
577 * #1163 implements behavior for method DISPID_WINDOWSTATECHANGED in CPluginClas s::Invoke 521 }
578 * - should validate and convert arguments in Invoke, not here 522
579 * - does not validate number of arguments before indexing into 'rgvarg' 523 // Entry point
580 * - does not validate type of argument before using its value 524 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete()
581 */
582 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags)
583 {
584 DEBUG_GENERAL("Tab changed");
585 bool newtabshown = pDispParams->rgvarg[1].intVal==3;
586 if (newtabshown)
587 {
588 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge tCurrentThreadId());
589 if (it == s_threadInstances.end())
590 {
591 s_threadInstances[::GetCurrentThreadId()] = this;
592 if (!m_isInitializedOk)
593 {
594 m_isInitializedOk = true;
595 InitObject(true);
596 UpdateStatusBar();
597 }
598 }
599 }
600 notificationMessage.Hide();
601 DEBUG_GENERAL("Tab change end");
602 return S_OK;
603 }
604
605 // This gets called whenever there's a browser event
606 // ENTRY POINT
607 STDMETHODIMP CPluginClass::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, W ORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
608 { 525 {
609 try 526 try
610 { 527 {
611 WCHAR tmp[256]; 528 DEBUG_NAVI(L"Navi::Download Complete")
612 wsprintf(tmp, L"Invoke: %d\n", dispidMember); 529 ATL::CComPtr<IWebBrowser2> browser = GetBrowser();
613 DEBUG_GENERAL(tmp); 530 if (browser)
614 switch (dispidMember) 531 {
615 { 532 m_tab->OnDownloadComplete(browser);
616 case DISPID_WINDOWSTATECHANGED: 533 }
617 { 534 }
618 // #1163 should validate and convert arguments here 535 catch (...)
619 return OnTabChanged(pDispParams, wFlags); 536 {
620 } 537 }
621 538 }
622 case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE: 539
623 break; 540 // Entry point
624 541 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD isp, VARIANT* /*urlOrPidl*/)
625 case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK: 542 {
626 break; 543 try
627 544 {
628 case DISPID_EVMETH_ONLOAD: 545 DEBUG_NAVI(L"Navi::Document Complete");
629 DEBUG_NAVI("Navi::OnLoad") 546 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp;
630 break; 547 if (!webBrowser2)
631 548 {
632 case DISPID_EVMETH_ONCHANGE: 549 return;
633 break; 550 }
634 551 std::wstring frameSrc = GetLocationUrl(*webBrowser2);
635 case DISPID_EVMETH_ONMOUSEDOWN: 552 UnescapeUrl(frameSrc);
636 break; 553 bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2);
637 554 m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser);
638 case DISPID_EVMETH_ONMOUSEENTER: 555 }
639 break; 556 catch (...)
640 557 {
641 case DISPID_IHTMLIMGELEMENT_START: 558 }
642 break; 559 }
643 560
644 case STDDISPID_XOBJ_ERRORUPDATE: 561 // Entry point
645 break; 562 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u nsigned long validFlagsMask)
646 563 {
647 case STDDISPID_XOBJ_ONPROPERTYCHANGE: 564 try
648 break; 565 {
649 566 DEBUG_GENERAL(L"WindowStateChanged (check tab changed)");
650 case DISPID_READYSTATECHANGE: 567 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL ECMDIDF_WINDOWSTATE_ENABLED)
651 DEBUG_NAVI("Navi::ReadyStateChange"); 568 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENA BLED);
652 break; 569 if (newtabshown)
653 570 {
654 case DISPID_BEFORENAVIGATE: 571 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find( GetCurrentThreadId());
655 DEBUG_NAVI("Navi::BeforeNavigate"); 572 if (it == s_threadInstances.end())
656 break; 573 {
657 574 s_threadInstances[::GetCurrentThreadId()] = this;
658 case DISPID_COMMANDSTATECHANGE: 575 if (!m_isInitializedOk)
659 if (m_hPaneWnd == NULL) 576 {
660 { 577 m_isInitializedOk = true;
661 CreateStatusBarPane(); 578 InitObject();
662 } 579 UpdateStatusBar();
663 else 580 }
664 { 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 {
665 if (AdblockPlus::IE::InstalledMajorVersion() > 6) 602 if (AdblockPlus::IE::InstalledMajorVersion() > 6)
666 { 603 {
667 RECT rect; 604 RECT rect;
668 BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect); 605 //Get the RECT for the leftmost pane (the status text pane)
669 if (rectRes == TRUE) 606 BOOL rectRes = ::SendMessage(m_hStatusBarWnd, SB_GETRECT, 0, (LPARAM)&re ct);
670 { 607 if (rectRes == TRUE)
671 MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.botto m - rect.top, TRUE); 608 {
672 } 609 MoveWindow(m_hPaneWnd, rect.right - m_nPaneWidth, 0, m_nPaneWidth, rec t.bottom - rect.top, TRUE);
673 } 610 }
674 } 611 }
675 break; 612 }
676 613 }
677 case DISPID_STATUSTEXTCHANGE: 614 catch (...)
678 break; 615 {
679 616 }
680 case DISPID_BEFORENAVIGATE2: 617 }
681 { 618
682 // #1163 should validate and convert parameters here 619 // Entry point
683 BeforeNavigate2(pDispParams); 620 void STDMETHODCALLTYPE CPluginClass::OnOnQuit()
684 } 621 {
685 break; 622 try
686 623 {
687 case DISPID_DOWNLOADBEGIN: 624 Unadvise();
688 { 625 }
689 DEBUG_NAVI("Navi::Download Begin") 626 catch (...)
690 } 627 {
691 break; 628 }
692 629 }
693 case DISPID_DOWNLOADCOMPLETE: 630
694 { 631 bool CPluginClass::InitObject()
695 DEBUG_NAVI("Navi::Download Complete");
696 CComQIPtr<IWebBrowser2> browser = GetBrowser();
697 if (browser)
698 {
699 m_tab->OnDownloadComplete(browser);
700 }
701 }
702 break;
703
704 case DISPID_DOCUMENTCOMPLETE:
705 {
706 DEBUG_NAVI("Navi::Document Complete");
707 CComQIPtr<IWebBrowser2> browser = GetBrowser();
708 if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == V T_DISPATCH)
709 {
710 CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal;
711 if (pBrowser)
712 {
713 CString url;
714 CComBSTR bstrUrl;
715 if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && ::SysStringLen (bstrUrl) > 0)
716 {
717 url = bstrUrl;
718 CPluginClient::UnescapeUrl(url);
719 m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBro wser));
720 }
721 }
722 }
723 }
724 break;
725
726 case DISPID_ONQUIT:
727 case DISPID_QUIT:
728 {
729 Unadvice();
730 }
731 break;
732
733 default:
734 {
735 CString did;
736 did.Format(L"DispId:%u", dispidMember);
737
738 DEBUG_NAVI(L"Navi::Default " + did)
739 }
740 /*
741 * Ordinarily a method not dispatched should return DISP_E_MEMBERNOTFOUND.
742 * As a conservative initial change, we leave it behaving as before,
743 * which is to do nothing and return S_OK.
744 */
745 // do nothing
746 break;
747 }
748 }
749 catch(...)
750 {
751 DEBUG_GENERAL( "Caught unknown exception in CPluginClass::Invoke" );
752 return E_FAIL;
753 }
754 return S_OK;
755 }
756
757 bool CPluginClass::InitObject(bool bBHO)
758 { 632 {
759 DEBUG_GENERAL("InitObject"); 633 DEBUG_GENERAL("InitObject");
760 CPluginSettings* settings = CPluginSettings::GetInstance(); 634 CPluginSettings* settings = CPluginSettings::GetInstance();
761 635
762 if (!settings->GetPluginEnabled()) 636 if (!settings->GetPluginEnabled())
763 { 637 {
764 s_mimeFilter->Unregister(); 638 s_mimeFilter->Unregister();
765 } 639 }
766 640
767 // Load theme module 641 // Load theme module
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 698
825 if (!GetAtomPaneClass()) 699 if (!GetAtomPaneClass())
826 { 700 {
827 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");
828 return false; 702 return false;
829 } 703 }
830 } 704 }
831 705
832 int ieVersion = AdblockPlus::IE::InstalledMajorVersion(); 706 int ieVersion = AdblockPlus::IE::InstalledMajorVersion();
833 // Create status pane 707 // Create status pane
834 if (bBHO && ieVersion > 6 && !CreateStatusBarPane()) 708 if (ieVersion > 6 && !CreateStatusBarPane())
835 { 709 {
836 return false; 710 return false;
837 } 711 }
838 712
839 s_criticalSectionLocal.Lock(); 713 s_criticalSectionLocal.Lock();
840 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");
841 715
842 bool isFirstRun = CPluginClient::GetInstance()->IsFirstRun(); 716 bool isFirstRun = CPluginClient::GetInstance()->IsFirstRun();
843 CPluginClient::GetInstance()->SetPref(L"currentVersion", std::wstring(IEPLUGIN _VERSION)); 717 CPluginClient::GetInstance()->SetPref(L"currentVersion", std::wstring(IEPLUGIN _VERSION));
844 // This is the first time ABP was installed 718 // This is the first time ABP was installed
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_WIN, "Class ::CreateStatusBarPane - No status bar") 842 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_WIN, "Class ::CreateStatusBarPane - No status bar")
969 return true; 843 return true;
970 } 844 }
971 845
972 // Calculate pane height 846 // Calculate pane height
973 AdblockPlus::Rectangle rcStatusBar; 847 AdblockPlus::Rectangle rcStatusBar;
974 ::GetClientRect(hWndStatusBar, &rcStatusBar); 848 ::GetClientRect(hWndStatusBar, &rcStatusBar);
975 849
976 if (rcStatusBar.Height() > 0) 850 if (rcStatusBar.Height() > 0)
977 { 851 {
852 if (rcStatusBar.Height() < iconWidth)
853 {
854 iconWidth = 19;
855 iconHeight = 19;
856 }
857
978 #ifdef _DEBUG 858 #ifdef _DEBUG
979 m_nPaneWidth = 70; 859 m_nPaneWidth = 70;
980 #else 860 #else
981 m_nPaneWidth = min(rcStatusBar.Height(), 22); 861 m_nPaneWidth = min(rcStatusBar.Height(), iconWidth);
982 #endif 862 #endif
983 } 863 }
984 else 864 else
985 { 865 {
986 #ifdef _DEBUG 866 #ifdef _DEBUG
987 m_nPaneWidth = 70; 867 m_nPaneWidth = 70;
988 #else 868 #else
989 m_nPaneWidth = 22; 869 m_nPaneWidth = iconWidth;
990 #endif 870 #endif
991 } 871 }
992 // Create pane window 872 // Create pane window
993 HWND hWndNewPane = ::CreateWindowEx( 873 HWND hWndNewPane = ::CreateWindowEx(
994 NULL, 874 NULL,
995 MAKEINTATOM(GetAtomPaneClass()), 875 MAKEINTATOM(GetAtomPaneClass()),
996 L"", 876 L"",
997 WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 877 WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
998 rcStatusBar.Width() - 500,0,m_nPaneWidth,rcStatusBar.Height(), 878 rcStatusBar.Width() - 500, 0, m_nPaneWidth, rcStatusBar.Height(),
999 hWndStatusBar, 879 hWndStatusBar,
1000 (HMENU)3671, 880 (HMENU)3671,
1001 _Module.m_hInst, 881 _Module.m_hInst,
1002 NULL); 882 NULL);
1003 883
1004 if (!hWndNewPane) 884 if (!hWndNewPane)
1005 { 885 {
1006 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_CREATE_ST ATUSBAR_PANE, "Class::CreateStatusBarPane - CreateWindowEx") 886 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_CREATE_ST ATUSBAR_PANE, "Class::CreateStatusBarPane - CreateWindowEx")
1007 return false; 887 return false;
1008 } 888 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O LECMD prgCmds[], OLECMDTEXT* pCmdText) 1011 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O LECMD prgCmds[], OLECMDTEXT* pCmdText)
1132 { 1012 {
1133 if (cCmds == 0) return E_INVALIDARG; 1013 if (cCmds == 0) return E_INVALIDARG;
1134 if (prgCmds == 0) return E_POINTER; 1014 if (prgCmds == 0) return E_POINTER;
1135 1015
1136 prgCmds[0].cmdf = OLECMDF_ENABLED; 1016 prgCmds[0].cmdf = OLECMDF_ENABLED;
1137 1017
1138 return S_OK; 1018 return S_OK;
1139 } 1019 }
1140 1020
1141 HMENU CPluginClass::CreatePluginMenu(const CString& url) 1021 HMENU CPluginClass::CreatePluginMenu(const std::wstring& url)
1142 { 1022 {
1143 DEBUG_GENERAL("CreatePluginMenu"); 1023 DEBUG_GENERAL("CreatePluginMenu");
1144 HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance(); 1024 HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance();
1145 1025
1146 HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); 1026 HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
1147 1027
1148 HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0); 1028 HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0);
1149 1029
1150 SetMenuBar(hMenuTrackPopup, url); 1030 SetMenuBar(hMenuTrackPopup, url);
1151 1031
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 { 1119 {
1240 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_NAVIGATION, PLUGIN_ERROR_NAVIGATION _SETTINGS, "Navigation::Failed") 1120 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_NAVIGATION, PLUGIN_ERROR_NAVIGATION _SETTINGS, "Navigation::Failed")
1241 } 1121 }
1242 } 1122 }
1243 } 1123 }
1244 break; 1124 break;
1245 } 1125 }
1246 case ID_MENU_DISABLE_ON_SITE: 1126 case ID_MENU_DISABLE_ON_SITE:
1247 { 1127 {
1248 CPluginSettings* settings = CPluginSettings::GetInstance(); 1128 CPluginSettings* settings = CPluginSettings::GetInstance();
1249 CString urlString = GetTab()->GetDocumentUrl(); 1129 std::wstring urlString = GetTab()->GetDocumentUrl();
1250 if (client->IsWhitelistedUrl(to_wstring(urlString))) 1130 std::string filterText = client->GetWhitelistingFilter(urlString);
1251 { 1131 if (!filterText.empty())
1252 settings->RemoveWhiteListedDomain(to_CString(client->GetHostFromUrl(to_w string(urlString)))); 1132 {
1133 client->RemoveFilter(filterText);
1253 } 1134 }
1254 else 1135 else
1255 { 1136 {
1256 settings->AddWhiteListedDomain(to_CString(client->GetHostFromUrl(to_wstr ing(urlString)))); 1137 settings->AddWhiteListedDomain(ToCString(client->GetHostFromUrl(urlStrin g)));
1257 } 1138 }
1258 GetBrowser()->Refresh(); 1139 GetBrowser()->Refresh();
1259 } 1140 }
1260 default: 1141 default:
1261 break; 1142 break;
1262 } 1143 }
1263 1144
1264 // Invalidate and redraw the control 1145 // Invalidate and redraw the control
1265 UpdateStatusBar(); 1146 UpdateStatusBar();
1266 } 1147 }
1267 1148
1268 1149
1269 bool CPluginClass::SetMenuBar(HMENU hMenu, const CString& url) 1150 bool CPluginClass::SetMenuBar(HMENU hMenu, const std::wstring& url)
1270 { 1151 {
1271 DEBUG_GENERAL("SetMenuBar"); 1152 DEBUG_GENERAL("SetMenuBar");
1272 1153
1273 std::wstring ctext; 1154 std::wstring ctext;
1274 Dictionary* dictionary = Dictionary::GetInstance(); 1155 Dictionary* dictionary = Dictionary::GetInstance();
1275 1156
1276 MENUITEMINFOW fmii = {}; 1157 MENUITEMINFOW fmii = {};
1277 fmii.cbSize = sizeof(fmii); 1158 fmii.cbSize = sizeof(fmii);
1278 1159
1279 MENUITEMINFOW miiSep = {}; 1160 MENUITEMINFOW miiSep = {};
1280 miiSep.cbSize = sizeof(miiSep); 1161 miiSep.cbSize = sizeof(miiSep);
1281 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; 1162 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE;
1282 miiSep.fType = MFT_SEPARATOR; 1163 miiSep.fType = MFT_SEPARATOR;
1283 1164
1284 CPluginClient* client = CPluginClient::GetInstance(); 1165 CPluginClient* client = CPluginClient::GetInstance();
1285 CPluginSettings* settings = CPluginSettings::GetInstance(); 1166 CPluginSettings* settings = CPluginSettings::GetInstance();
1286 { 1167 {
1287 ctext = dictionary->Lookup("menu", "menu-disable-on-site"); 1168 ctext = dictionary->Lookup("menu", "menu-disable-on-site");
1288 // Is domain in white list? 1169 // Is domain in white list?
1289 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(to_wstring(url))); 1170 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(url));
1290 if (client->IsWhitelistedUrl(to_wstring(GetTab()->GetDocumentUrl()))) 1171 if (client->IsWhitelistedUrl(GetTab()->GetDocumentUrl()))
1291 { 1172 {
1292 fmii.fState = MFS_CHECKED | MFS_ENABLED; 1173 fmii.fState = MFS_CHECKED | MFS_ENABLED;
1293 } 1174 }
1294 else 1175 else
1295 { 1176 {
1296 fmii.fState = MFS_UNCHECKED | MFS_ENABLED; 1177 fmii.fState = MFS_UNCHECKED | MFS_ENABLED;
1297 } 1178 }
1298 fmii.fMask = MIIM_STRING | MIIM_STATE; 1179 fmii.fMask = MIIM_STRING | MIIM_STATE;
1299 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); 1180 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str());
1300 fmii.cch = static_cast<UINT>(ctext.size()); 1181 fmii.cch = static_cast<UINT>(ctext.size());
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 } 1375 }
1495 1376
1496 LRESULT result = CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wPara m, lParam); 1377 LRESULT result = CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wPara m, lParam);
1497 1378
1498 1379
1499 return result; 1380 return result;
1500 1381
1501 } 1382 }
1502 1383
1503 1384
1504 HICON CPluginClass::GetStatusBarIcon(const CString& url) 1385 HICON CPluginClass::GetStatusBarIcon(const std::wstring& url)
1505 { 1386 {
1506 // use the disable icon as defualt, if the client doesn't exists 1387 // use the disable icon as defualt, if the client doesn't exists
1507 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); 1388 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED);
1508 1389
1509 CPluginTab* tab = GetTab(::GetCurrentThreadId()); 1390 CPluginTab* tab = GetTab(::GetCurrentThreadId());
1510 if (tab) 1391 if (tab)
1511 { 1392 {
1512 CPluginClient* client = CPluginClient::GetInstance(); 1393 CPluginClient* client = CPluginClient::GetInstance();
1513 if (CPluginSettings::GetInstance()->IsPluginEnabled()) 1394 if (CPluginSettings::GetInstance()->IsPluginEnabled())
1514 { 1395 {
1515 if (client->IsWhitelistedUrl(ToWstring(url))) 1396 if (client->IsWhitelistedUrl(url))
1516 { 1397 {
1517 hIcon = GetIcon(ICON_PLUGIN_DISABLED); 1398 hIcon = GetIcon(ICON_PLUGIN_DISABLED);
1518 } 1399 }
1519 else 1400 else
1520 { 1401 {
1521 CPluginSettings* settings = CPluginSettings::GetInstance(); 1402 CPluginSettings* settings = CPluginSettings::GetInstance();
1522 hIcon = GetIcon(ICON_PLUGIN_ENABLED); 1403 hIcon = GetIcon(ICON_PLUGIN_ENABLED);
1523 } 1404 }
1524 } 1405 }
1525 } 1406 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1594 } 1475 }
1595 } 1476 }
1596 } 1477 }
1597 } 1478 }
1598 1479
1599 // Draw icon 1480 // Draw icon
1600 if (CPluginClient::GetInstance()) 1481 if (CPluginClient::GetInstance())
1601 { 1482 {
1602 HICON hIcon = GetStatusBarIcon(pClass->GetTab()->GetDocumentUrl()); 1483 HICON hIcon = GetStatusBarIcon(pClass->GetTab()->GetDocumentUrl());
1603 1484
1604 int offx = (rcClient.Height() - 16)/2 + nDrawEdge; 1485 int offx = nDrawEdge;
1605 if (hIcon) 1486 if (hIcon)
1606 { 1487 {
1607 ::DrawIconEx(hDC, offx, (rcClient.Height() - 16)/2 + 2, hIcon, 16, 16, NULL, NULL, DI_NORMAL); 1488 //Get the RECT for the leftmost pane (the status text pane)
1608 offx += 22; 1489 RECT rect;
1490 BOOL rectRes = ::SendMessage(pClass->m_hStatusBarWnd, SB_GETRECT, 0, ( LPARAM)&rect);
1491 ::DrawIconEx(hDC, 0, rect.bottom - rect.top - iconHeight, hIcon, iconW idth, iconHeight, NULL, NULL, DI_NORMAL);
1492 offx += iconWidth;
1609 } 1493 }
1610 #ifdef _DEBUG 1494 #ifdef _DEBUG
1611 // Display version 1495 // Display version
1612 HFONT hFont = (HFONT)::SendMessage(pClass->m_hStatusBarWnd, WM_GETFONT, 0, 0); 1496 HFONT hFont = (HFONT)::SendMessage(pClass->m_hStatusBarWnd, WM_GETFONT, 0, 0);
1613 HGDIOBJ hOldFont = ::SelectObject(hDC,hFont); 1497 HGDIOBJ hOldFont = ::SelectObject(hDC,hFont);
1614 1498
1615 AdblockPlus::Rectangle rcText = rcClient; 1499 AdblockPlus::Rectangle rcText = rcClient;
1616 rcText.left += offx; 1500 rcText.left += offx;
1617 ::SetBkMode(hDC, TRANSPARENT); 1501 ::SetBkMode(hDC, TRANSPARENT);
1618 ::DrawTextW(hDC, IEPLUGIN_VERSION, -1, &rcText, DT_WORD_ELLIPSIS|DT_LEFT |DT_SINGLELINE|DT_VCENTER); 1502 ::DrawTextW(hDC, IEPLUGIN_VERSION, -1, &rcText, DT_WORD_ELLIPSIS|DT_LEFT |DT_SINGLELINE|DT_VCENTER);
1619 1503
1620 ::SelectObject(hDC, hOldFont); 1504 ::SelectObject(hDC, hOldFont);
1621 #endif // _DEBUG 1505 #endif // _DEBUG
1622 } 1506 }
1623 1507
1624 // Done! 1508 // Done!
1625 EndPaint(hWnd, &ps); 1509 EndPaint(hWnd, &ps);
1626 1510
1627 return 0; 1511 return 0;
1628 } 1512 }
1629 1513
1630 case WM_LBUTTONUP: 1514 case WM_LBUTTONUP:
1631 case WM_RBUTTONUP: 1515 case WM_RBUTTONUP:
1632 { 1516 {
1633 CString strURL = pClass->GetBrowserUrl(); 1517 std::wstring url = pClass->GetBrowserUrl();
1634 if (strURL != pClass->GetTab()->GetDocumentUrl()) 1518 if (url != pClass->GetTab()->GetDocumentUrl())
1635 { 1519 {
1636 pClass->GetTab()->SetDocumentUrl(strURL); 1520 pClass->GetTab()->SetDocumentUrl(url);
1637 } 1521 }
1638 1522
1639 // Create menu 1523 // Create menu
1640 HMENU hMenu = pClass->CreatePluginMenu(strURL); 1524 HMENU hMenu = pClass->CreatePluginMenu(url);
1641 if (!hMenu) 1525 if (!hMenu)
1642 { 1526 {
1643 return 0; 1527 return 0;
1644 } 1528 }
1645 1529
1646 // Display menu 1530 // Display menu
1647 POINT pt; 1531 POINT pt;
1648 ::GetCursorPos(&pt); 1532 ::GetCursorPos(&pt);
1649 1533
1650 RECT rc; 1534 RECT rc;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1736 { 1620 {
1737 CreateStatusBarPane(); 1621 CreateStatusBarPane();
1738 } 1622 }
1739 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) 1623 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE))
1740 { 1624 {
1741 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar"); 1625 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID ATE_STATUSBAR, "Class::Invalidate statusbar");
1742 } 1626 }
1743 } 1627 }
1744 1628
1745 1629
1746 void CPluginClass::Unadvice() 1630 void CPluginClass::Unadvise()
1747 { 1631 {
1748 s_criticalSectionLocal.Lock(); 1632 s_criticalSectionLocal.Lock();
1749 { 1633 {
1750 if (m_isAdviced) 1634 if (m_isAdvised)
1751 { 1635 {
1752 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); 1636 HRESULT hr = DispEventUnadvise(GetBrowser());
1753 if (pPoint) 1637 if (FAILED(hr))
1754 { 1638 {
1755 HRESULT hr = pPoint->Unadvise(m_nConnectionID); 1639 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS E, "Class::Unadvise - Unadvise");
1756 if (FAILED(hr)) 1640 }
1757 { 1641 m_isAdvised = false;
1758 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADV ICE, "Class::Unadvice - Unadvise");
1759 }
1760 }
1761
1762 m_isAdviced = false;
1763 } 1642 }
1764 } 1643 }
1765 s_criticalSectionLocal.Unlock(); 1644 s_criticalSectionLocal.Unlock();
1766 } 1645 }
1767 1646
1768 HICON CPluginClass::GetIcon(int type) 1647 HICON CPluginClass::GetIcon(int type)
1769 { 1648 {
1770 HICON icon = NULL; 1649 HICON icon = NULL;
1771 1650
1772 s_criticalSectionLocal.Lock(); 1651 s_criticalSectionLocal.Lock();
1773 { 1652 {
1774 if (!s_hIcons[type]) 1653 if (!s_hIcons[type])
1775 { 1654 {
1776 s_hIcons[type] = ::LoadIcon(_Module.m_hInst, MAKEINTRESOURCE(s_hIconTypes[ type])); 1655 std::wstring imageToLoad = L"#";
1656 imageToLoad += std::to_wstring(s_hIconTypes[type]);
1657 s_hIcons[type] = (HICON)::LoadImage(_Module.m_hInst, imageToLoad.c_str(), IMAGE_ICON, iconWidth, iconHeight, LR_SHARED);
1777 if (!s_hIcons[type]) 1658 if (!s_hIcons[type])
1778 { 1659 {
1779 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_ ICON, "Class::GetIcon - LoadIcon") 1660 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_LOAD_ ICON, "Class::GetIcon - LoadIcon");
1780 } 1661 }
1781 } 1662 }
1782 1663
1783 icon = s_hIcons[type]; 1664 icon = s_hIcons[type];
1784 } 1665 }
1785 s_criticalSectionLocal.Unlock(); 1666 s_criticalSectionLocal.Unlock();
1786 1667
1787 return icon; 1668 return icon;
1788 } 1669 }
1789 1670
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1850 break; 1731 break;
1851 } 1732 }
1852 s_criticalSectionLocal.Unlock(); 1733 s_criticalSectionLocal.Unlock();
1853 1734
1854 } 1735 }
1855 } 1736 }
1856 } 1737 }
1857 1738
1858 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); 1739 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT);
1859 } 1740 }
1860
1861 return hTabWnd; 1741 return hTabWnd;
1862 1742 }
1863 }
LEFTRIGHT

Powered by Google App Engine
This is Rietveld