| LEFT | RIGHT |
| 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" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 return right - left; | 85 return right - left; |
| 69 } | 86 } |
| 70 }; | 87 }; |
| 71 } | 88 } |
| 72 | 89 |
| 73 CPluginClass::CPluginClass() | 90 CPluginClass::CPluginClass() |
| 74 { | 91 { |
| 75 //Use this line to debug memory leaks | 92 //Use this line to debug memory leaks |
| 76 // _CrtDumpMemoryLeaks(); | 93 // _CrtDumpMemoryLeaks(); |
| 77 | 94 |
| 78 m_isAdvised = false; | 95 m_isAdviced = false; |
| 96 m_nConnectionID = 0; |
| 79 m_hTabWnd = NULL; | 97 m_hTabWnd = NULL; |
| 80 m_hStatusBarWnd = NULL; | 98 m_hStatusBarWnd = NULL; |
| 81 m_hPaneWnd = NULL; | 99 m_hPaneWnd = NULL; |
| 82 m_nPaneWidth = 0; | 100 m_nPaneWidth = 0; |
| 83 m_pWndProcStatus = NULL; | 101 m_pWndProcStatus = NULL; |
| 84 m_hTheme = NULL; | 102 m_hTheme = NULL; |
| 85 m_isInitializedOk = false; | 103 m_isInitializedOk = false; |
| 86 | 104 |
| 87 | 105 |
| 88 m_tab = new CPluginTab(this); | 106 m_tab = new CPluginTab(this); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 106 | 124 |
| 107 void CPluginClass::FinalRelease() | 125 void CPluginClass::FinalRelease() |
| 108 { | 126 { |
| 109 s_criticalSectionBrowser.Lock(); | 127 s_criticalSectionBrowser.Lock(); |
| 110 { | 128 { |
| 111 m_webBrowser2.Release(); | 129 m_webBrowser2.Release(); |
| 112 } | 130 } |
| 113 s_criticalSectionBrowser.Unlock(); | 131 s_criticalSectionBrowser.Unlock(); |
| 114 } | 132 } |
| 115 | 133 |
| 134 |
| 135 // This method tries to get a 'connection point' from the stored browser, which
can be |
| 136 // used to attach or detach from the stream of browser events |
| 137 CComPtr<IConnectionPoint> CPluginClass::GetConnectionPoint() |
| 138 { |
| 139 CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> pContaine
r(GetBrowser()); |
| 140 if (!pContainer) |
| 141 { |
| 142 return NULL; |
| 143 } |
| 144 |
| 145 CComPtr<IConnectionPoint> pPoint; |
| 146 HRESULT hr = pContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &pPoint)
; |
| 147 if (FAILED(hr)) |
| 148 { |
| 149 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_FIND_CONNEC
TION_POINT, "Class::GetConnectionPoint - FindConnectionPoint") |
| 150 return NULL; |
| 151 } |
| 152 |
| 153 return pPoint; |
| 154 } |
| 155 |
| 116 HWND CPluginClass::GetBrowserHWND() const | 156 HWND CPluginClass::GetBrowserHWND() const |
| 117 { | 157 { |
| 118 SHANDLE_PTR hBrowserWndHandle = NULL; | 158 SHANDLE_PTR hBrowserWndHandle = NULL; |
| 119 | 159 |
| 120 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 160 CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
| 121 if (browser) | 161 if (browser) |
| 122 { | 162 { |
| 123 HRESULT hr = browser->get_HWND(&hBrowserWndHandle); | 163 HRESULT hr = browser->get_HWND(&hBrowserWndHandle); |
| 124 if (FAILED(hr)) | 164 if (FAILED(hr)) |
| 125 { | 165 { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 151 | 191 |
| 152 s_criticalSectionLocal.Lock(); | 192 s_criticalSectionLocal.Lock(); |
| 153 { | 193 { |
| 154 browser = s_asyncWebBrowser2; | 194 browser = s_asyncWebBrowser2; |
| 155 } | 195 } |
| 156 s_criticalSectionLocal.Unlock(); | 196 s_criticalSectionLocal.Unlock(); |
| 157 | 197 |
| 158 return browser; | 198 return browser; |
| 159 } | 199 } |
| 160 | 200 |
| 161 CString CPluginClass::GetBrowserUrl() const | 201 std::wstring CPluginClass::GetBrowserUrl() const |
| 162 { | 202 { |
| 163 CString url; | 203 std::wstring url; |
| 164 | |
| 165 CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 204 CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
| 166 if (browser) | 205 if (browser) |
| 167 { | 206 { |
| 168 CComBSTR bstrURL; | 207 CComBSTR bstrURL; |
| 169 | 208 if (SUCCEEDED(browser->get_LocationURL(&bstrURL)) && bstrURL) |
| 170 if (SUCCEEDED(browser->get_LocationURL(&bstrURL))) | 209 { |
| 171 { | 210 url = std::wstring(bstrURL, SysStringLen(bstrURL)); |
| 172 url = bstrURL; | 211 UnescapeUrl(url); |
| 173 CPluginClient::UnescapeUrl(url); | |
| 174 } | 212 } |
| 175 } | 213 } |
| 176 else | 214 else |
| 177 { | 215 { |
| 178 url = m_tab->GetDocumentUrl(); | 216 url = m_tab->GetDocumentUrl(); |
| 179 } | 217 } |
| 180 | |
| 181 return url; | 218 return url; |
| 182 } | 219 } |
| 183 | 220 |
| 184 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) | 221 DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr) |
| 185 { | 222 { |
| 186 if (thisPtr == NULL) | 223 if (thisPtr == NULL) |
| 187 return 0; | 224 return 0; |
| 188 if (!((CPluginClass*)thisPtr)->InitObject(true)) | 225 if (!((CPluginClass*)thisPtr)->InitObject(true)) |
| 189 { | 226 { |
| 190 ((CPluginClass*)thisPtr)->Unadvise(); | 227 ((CPluginClass*)thisPtr)->Unadvice(); |
| 191 } | 228 } |
| 192 | 229 |
| 193 return 0; | 230 return 0; |
| 194 } | 231 } |
| 195 | 232 |
| 196 | 233 |
| 197 | 234 |
| 198 // This gets called when a new browser window is created (which also triggers th
e | 235 // This gets called when a new browser window is created (which also triggers th
e |
| 199 // creation of this object). The pointer passed in should be to a IWebBrowser2 | 236 // creation of this object). The pointer passed in should be to a IWebBrowser2 |
| 200 // interface that represents the browser for the window. | 237 // interface that represents the browser for the window. |
| 201 // it is also called when a tab is closed, this unknownSite will be null | 238 // it is also called when a tab is closed, this unknownSite will be null |
| 202 // so we should handle that it is called this way several times during a session | 239 // so we should handle that it is called this way several times during a session |
| 203 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) | 240 STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) |
| 204 { | 241 { |
| 205 return EntryPointWithHResult([&]()->HRESULT | 242 return EntryPointWithHResult([&]()->HRESULT |
| 206 { | 243 { |
| 207 CPluginSettings* settings = CPluginSettings::GetInstance(); | 244 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 208 | 245 |
| 209 MULTIPLE_VERSIONS_CHECK(); | 246 MULTIPLE_VERSIONS_CHECK(); |
| 210 | 247 |
| 211 if (unknownSite) | 248 if (unknownSite) |
| 212 { | 249 { |
| 213 | 250 |
| 214 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
====================================") | 251 DEBUG_GENERAL(L"==========================================================
======================\nNEW TAB UI\n============================================
====================================") |
| 215 | 252 |
| 216 HRESULT hr = ::CoInitialize(NULL); | 253 HRESULT hr = ::CoInitialize(NULL); |
| 217 if (FAILED(hr)) | 254 if (FAILED(hr)) |
| 218 { | 255 { |
| 219 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); | 256 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT,
"Class::SetSite - CoInitialize"); |
| 220 } | 257 } |
| 221 | 258 |
| 222 s_criticalSectionBrowser.Lock(); | 259 s_criticalSectionBrowser.Lock(); |
| 223 { | 260 { |
| 224 m_webBrowser2 = unknownSite; | 261 m_webBrowser2 = unknownSite; |
| 225 } | 262 } |
| 226 s_criticalSectionBrowser.Unlock(); | 263 s_criticalSectionBrowser.Unlock(); |
| 227 | 264 |
| 228 //register the mimefilter | 265 //register the mimefilter |
| 229 //and only mimefilter | 266 //and only mimefilter |
| 230 //on some few computers the mimefilter does not get properly registered wh
en it is done on another thread | 267 //on some few computers the mimefilter does not get properly registered wh
en it is done on another thread |
| 231 | 268 |
| 232 s_criticalSectionLocal.Lock(); | 269 s_criticalSectionLocal.Lock(); |
| 233 { | 270 { |
| 234 // Always register on startup, then check if we need to unregister in a
separate thread | 271 // Always register on startup, then check if we need to unregister in a
separate thread |
| 235 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 272 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 236 s_asyncWebBrowser2 = unknownSite; | 273 s_asyncWebBrowser2 = unknownSite; |
| 237 s_instances.insert(this); | 274 s_instances.insert(this); |
| 238 } | 275 } |
| 239 s_criticalSectionLocal.Unlock(); | 276 s_criticalSectionLocal.Unlock(); |
| 240 | 277 |
| 241 try | 278 try |
| 242 { | 279 { |
| 243 // Check if loaded as BHO | 280 // Check if loaded as BHO |
| 244 auto webBrowser = GetBrowser(); | 281 if (GetBrowser()) |
| 245 if (webBrowser) | |
| 246 { | 282 { |
| 247 DEBUG_GENERAL("Loaded as BHO"); | 283 DEBUG_GENERAL("Loaded as BHO"); |
| 248 HRESULT hr = DispEventAdvise(webBrowser); | 284 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); |
| 249 if (SUCCEEDED(hr)) | 285 if (pPoint) |
| 250 { | 286 { |
| 251 m_isAdvised = true; | 287 HRESULT hr = pPoint->Advise((IDispatch*)this, &m_nConnectionID); |
| 252 try | 288 if (SUCCEEDED(hr)) |
| 253 { | 289 { |
| 254 std::thread startInitObjectThread(StartInitObject, this); | 290 m_isAdviced = true; |
| 255 startInitObjectThread.detach(); // TODO: but actually we should wa
it for the thread in the dtr. | 291 |
| 292 try |
| 293 { |
| 294 std::thread startInitObjectThread(StartInitObject, this); |
| 295 startInitObjectThread.detach(); // TODO: but actually we should
wait for the thread in the dtr. |
| 296 } |
| 297 catch (const std::system_error& ex) |
| 298 { |
| 299 auto errDescription = std::string("Class::Thread - Failed to cre
ate StartInitObject thread, ") + |
| 300 ex.code().message() + ex.what(); |
| 301 DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_E
RROR_MAIN_THREAD_CREATE_PROCESS, errDescription.c_str()); |
| 302 } |
| 256 } | 303 } |
| 257 catch (const std::system_error& ex) | 304 else |
| 258 { | 305 { |
| 259 auto errDescription = std::string("Class::Thread - Failed to creat
e StartInitObject thread, ") + | 306 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_A
DVICE, "Class::SetSite - Advice"); |
| 260 ex.code().message() + ex.what(); | |
| 261 DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERR
OR_MAIN_THREAD_CREATE_PROCESS, errDescription.c_str()); | |
| 262 } | 307 } |
| 263 } | 308 } |
| 264 else | |
| 265 { | |
| 266 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADV
ICE, "Class::SetSite - Advice"); | |
| 267 } | |
| 268 } | 309 } |
| 269 else // Check if loaded as toolbar handler | 310 else // Check if loaded as toolbar handler |
| 270 { | 311 { |
| 271 DEBUG_GENERAL("Loaded as toolbar handler"); | 312 DEBUG_GENERAL("Loaded as toolbar handler"); |
| 272 CComPtr<IServiceProvider> pServiceProvider; | 313 CComPtr<IServiceProvider> pServiceProvider; |
| 273 | 314 |
| 274 HRESULT hr = unknownSite->QueryInterface(&pServiceProvider); | 315 HRESULT hr = unknownSite->QueryInterface(&pServiceProvider); |
| 275 if (SUCCEEDED(hr)) | 316 if (SUCCEEDED(hr)) |
| 276 { | 317 { |
| 277 if (pServiceProvider) | 318 if (pServiceProvider) |
| 278 { | 319 { |
| 279 s_criticalSectionBrowser.Lock(); | 320 s_criticalSectionBrowser.Lock(); |
| 280 { | 321 { |
| 281 HRESULT hr = pServiceProvider->QueryService(IID_IWebBrowserApp,
&m_webBrowser2); | 322 HRESULT hr = pServiceProvider->QueryService(IID_IWebBrowserApp,
&m_webBrowser2); |
| 282 if (SUCCEEDED(hr)) | 323 if (SUCCEEDED(hr)) |
| 283 { | 324 { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 296 } | 337 } |
| 297 else | 338 else |
| 298 { | 339 { |
| 299 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUE
RY_SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)"); | 340 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUE
RY_SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)"); |
| 300 } | 341 } |
| 301 } | 342 } |
| 302 } | 343 } |
| 303 catch (std::runtime_error e) | 344 catch (std::runtime_error e) |
| 304 { | 345 { |
| 305 DEBUG_ERROR(e.what()); | 346 DEBUG_ERROR(e.what()); |
| 306 Unadvise(); | 347 Unadvice(); |
| 307 } | 348 } |
| 308 } | 349 } |
| 309 else | 350 else |
| 310 { | 351 { |
| 311 Unadvise(); | 352 // Unadvice |
| 312 | 353 Unadvice(); |
| 354 |
| 313 // Destroy window | 355 // Destroy window |
| 314 if (m_pWndProcStatus) | 356 if (m_pWndProcStatus) |
| 315 { | 357 { |
| 316 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn
dProcStatus); | 358 ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWn
dProcStatus); |
| 317 | 359 |
| 318 m_pWndProcStatus = NULL; | 360 m_pWndProcStatus = NULL; |
| 319 } | 361 } |
| 320 | 362 |
| 321 if (m_hPaneWnd) | 363 if (m_hPaneWnd) |
| 322 { | 364 { |
| 323 DestroyWindow(m_hPaneWnd); | 365 DestroyWindow(m_hPaneWnd); |
| 324 m_hPaneWnd = NULL; | 366 m_hPaneWnd = NULL; |
| 325 } | 367 } |
| 326 | 368 |
| 327 m_hTabWnd = NULL; | 369 m_hTabWnd = NULL; |
| 328 m_hStatusBarWnd = NULL; | 370 m_hStatusBarWnd = NULL; |
| 329 | 371 |
| 330 // Remove instance from the list, shutdown threads | 372 // Remove instance from the list, shutdown threads |
| 331 HANDLE hMainThread = NULL; | 373 HANDLE hMainThread = NULL; |
| 332 HANDLE hTabThread = NULL; | 374 HANDLE hTabThread = NULL; |
| 333 | 375 |
| 334 s_criticalSectionLocal.Lock(); | 376 s_criticalSectionLocal.Lock(); |
| 335 { | 377 { |
| 336 s_instances.erase(this); | 378 s_instances.erase(this); |
| 337 | 379 |
| 338 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::Ge
tCurrentThreadId()); | 380 std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::Ge
tCurrentThreadId()); |
| 339 if (it != s_threadInstances.end()) | 381 if (it != s_threadInstances.end()) |
| 340 { | 382 { |
| 341 s_threadInstances.erase(it); | 383 s_threadInstances.erase(it); |
| 342 } | 384 } |
| 343 if (s_instances.empty()) | 385 if (s_instances.empty()) |
| 344 { | 386 { |
| 345 // TODO: Explicitly releasing a resource when a container becomes empt
y looks like a job better suited for shared_ptr | 387 // TODO: Explicitly releasing a resource when a container becomes empt
y looks like a job better suited for shared_ptr |
| 346 CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 388 CPluginClientFactory::ReleaseMimeFilterClientInstance(); |
| 347 } | 389 } |
| 348 } | 390 } |
| 349 s_criticalSectionLocal.Unlock(); | 391 s_criticalSectionLocal.Unlock(); |
| 350 | 392 |
| 351 // Release browser interface | 393 // Release browser interface |
| 352 s_criticalSectionBrowser.Lock(); | 394 s_criticalSectionBrowser.Lock(); |
| 353 { | 395 { |
| 354 m_webBrowser2.Release(); | 396 m_webBrowser2.Release(); |
| 355 } | 397 } |
| 356 s_criticalSectionBrowser.Unlock(); | 398 s_criticalSectionBrowser.Unlock(); |
| 357 | 399 |
| 358 DEBUG_GENERAL("===========================================================
=====================\nNEW TAB UI - END\n=======================================
=========================================") | 400 DEBUG_GENERAL("===========================================================
=====================\nNEW TAB UI - END\n=======================================
=========================================") |
| 359 | 401 |
| 360 ::CoUninitialize(); | 402 ::CoUninitialize(); |
| 361 } | 403 } |
| 362 | 404 |
| 363 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | 405 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); |
| 364 }); | 406 }); |
| 365 } | 407 } |
| 366 | 408 |
| 367 bool CPluginClass::IsStatusBarEnabled() | 409 bool CPluginClass::IsStatusBarEnabled() |
| 368 { | 410 { |
| 369 DEBUG_GENERAL("IsStatusBarEnabled start"); | 411 DEBUG_GENERAL("IsStatusBarEnabled start"); |
| 370 HKEY pHkey; | 412 HKEY pHkey; |
| 371 HKEY pHkeySub; | 413 HKEY pHkeySub; |
| 372 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); | 414 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 } | 512 } |
| 471 } | 513 } |
| 472 else | 514 else |
| 473 { | 515 { |
| 474 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class
::Get statusbar state"); | 516 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class
::Get statusbar state"); |
| 475 } | 517 } |
| 476 } | 518 } |
| 477 DEBUG_GENERAL("ShowStatusBar end"); | 519 DEBUG_GENERAL("ShowStatusBar end"); |
| 478 } | 520 } |
| 479 | 521 |
| 480 void STDMETHODCALLTYPE CPluginClass::OnBeforeNavigate2( | 522 /* |
| 481 /* [in] */ IDispatch* frameBrowserDisp, | 523 * #1163 This class is the implementation for method DISPID_BEFORENAVIGATE2 in C
PluginClass::Invoke. |
| 482 /* [in] */ VARIANT* urlVariant, | 524 * - It validates and convertes its own arguments, rather than unifying them in
the Invoke body. |
| 483 /* [in] */ VARIANT* /*Flags*/, | 525 * - It's declared void and not HRESULT, so DISPID_BEFORENAVIGATE2 can only retu
rn S_OK. |
| 484 /* [in] */ VARIANT* /*TargetFrameName*/, | 526 */ |
| 485 /* [in] */ VARIANT* /*PostData*/, | 527 void CPluginClass::BeforeNavigate2(DISPPARAMS* pDispParams) |
| 486 /* [in] */ VARIANT* /*Headers*/, | 528 { |
| 487 /* [in, out] */ VARIANT_BOOL* /*Cancel*/) | 529 |
| 488 { | 530 if (pDispParams->cArgs < 7) |
| 489 EntryPoint([&] | 531 { |
| 490 { | 532 return; |
| 491 ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; | 533 } |
| 492 if (!webBrowser) | 534 //Register a mime filter if it's not registered yet |
| 493 { | 535 if (s_mimeFilter == NULL) |
| 494 return; | 536 { |
| 495 } | 537 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
| 496 | 538 } |
| 497 if (!urlVariant || urlVariant->vt != VT_BSTR) | 539 |
| 498 { | 540 // Get the IWebBrowser2 interface |
| 499 return; | 541 CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> WebBrowser2Ptr; |
| 500 } | 542 VARTYPE vt = pDispParams->rgvarg[6].vt; |
| 501 std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal)); | 543 if (vt == VT_DISPATCH) |
| 502 UnescapeUrl(url); | 544 { |
| 503 | 545 WebBrowser2Ptr = pDispParams->rgvarg[6].pdispVal; |
| 504 //Register a mime filter if it's not registered yet | 546 } |
| 505 if (s_mimeFilter == NULL) | 547 else |
| 506 { | 548 { |
| 507 s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); | 549 // Wrong type, return. |
| 508 } | 550 return; |
| 509 | 551 } |
| 510 CString urlCString = ToCString(url); | 552 |
| 511 | 553 // Get the URL |
| 512 // If webbrowser2 is equal to top level browser (as set in SetSite), we are
navigating new page | 554 std::wstring url; |
| 513 CPluginClient* client = CPluginClient::GetInstance(); | 555 const auto& arg = pDispParams->rgvarg[5]; |
| 514 | 556 vt = arg.vt; |
| 515 if (urlCString.Find(L"javascript") == 0) | 557 if (vt == (VT_BYREF | VT_VARIANT) && arg.pvarVal->vt == VT_BSTR) |
| 516 { | 558 { |
| 517 } | 559 BSTR b = arg.pvarVal->bstrVal; |
| 518 else if (GetBrowser().IsEqualObject(webBrowser)) | 560 if (b) { |
| 519 { | 561 url = std::wstring(b, SysStringLen(b)); |
| 520 m_tab->OnNavigate(urlCString); | 562 UnescapeUrl(url); |
| 521 | 563 } |
| 522 DEBUG_GENERAL(L"==========================================================
======================\nBegin main navigation url:" + urlCString + "\n==========
======================================================================") | 564 } |
| 523 | 565 else |
| 566 { |
| 567 // Wrong type, return. |
| 568 return; |
| 569 } |
| 570 |
| 571 // If webbrowser2 is equal to top level browser (as set in SetSite), we are na
vigating new page |
| 572 CPluginClient* client = CPluginClient::GetInstance(); |
| 573 CString urlLegacy = ToCString(url); |
| 574 if (urlLegacy.Find(L"javascript") == 0) |
| 575 { |
| 576 } |
| 577 else if (GetBrowser().IsEqualObject(WebBrowser2Ptr)) |
| 578 { |
| 579 m_tab->OnNavigate(url); |
| 580 |
| 581 DEBUG_GENERAL(L"============================================================
====================\nBegin main navigation url:" + urlLegacy + "\n=============
===================================================================") |
| 582 |
| 524 #ifdef ENABLE_DEBUG_RESULT | 583 #ifdef ENABLE_DEBUG_RESULT |
| 525 CPluginDebug::DebugResultDomain(urlCString); | 584 CPluginDebug::DebugResultDomain(urlLegacy); |
| 526 #endif | 585 #endif |
| 527 | 586 |
| 528 UpdateStatusBar(); | 587 UpdateStatusBar(); |
| 529 } | 588 } |
| 530 else | 589 else |
| 531 { | 590 { |
| 532 DEBUG_NAVI(L"Navi::Begin navigation url:" + urlCString) | 591 DEBUG_NAVI(L"Navi::Begin navigation url:" + urlLegacy) |
| 533 m_tab->CacheFrame(urlCString); | 592 m_tab->CacheFrame(url); |
| 534 } | 593 } |
| 535 }); | 594 } |
| 536 } | 595 |
| 537 | 596 /* |
| 538 void STDMETHODCALLTYPE CPluginClass::OnDownloadBegin() | 597 * #1163 implements behavior for method DISPID_WINDOWSTATECHANGED in CPluginClas
s::Invoke |
| 539 { | 598 * - should validate and convert arguments in Invoke, not here |
| 540 EntryPoint([&] | 599 * - does not validate number of arguments before indexing into 'rgvarg' |
| 541 { | 600 * - does not validate type of argument before using its value |
| 542 DEBUG_NAVI("Navi::Download Begin") | 601 */ |
| 543 }); | 602 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) |
| 544 } | 603 { |
| 545 | 604 DEBUG_GENERAL("Tab changed"); |
| 546 void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() | 605 bool newtabshown = pDispParams->rgvarg[1].intVal==3; |
| 547 { | 606 if (newtabshown) |
| 548 EntryPoint([&] | 607 { |
| 549 { | 608 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge
tCurrentThreadId()); |
| 550 DEBUG_NAVI("Navi::Download Complete") | 609 if (it == s_threadInstances.end()) |
| 551 ATL::CComPtr<IWebBrowser2> browser = GetBrowser(); | 610 { |
| 552 if (browser) | 611 s_threadInstances[::GetCurrentThreadId()] = this; |
| 553 { | 612 if (!m_isInitializedOk) |
| 554 m_tab->OnDownloadComplete(browser); | 613 { |
| 555 } | 614 m_isInitializedOk = true; |
| 556 }); | 615 InitObject(true); |
| 557 } | 616 UpdateStatusBar(); |
| 558 | 617 } |
| 559 void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserD
isp, VARIANT* /*urlOrPidl*/) | 618 } |
| 560 { | 619 } |
| 561 EntryPoint([&] | 620 notificationMessage.Hide(); |
| 562 { | 621 DEBUG_GENERAL("Tab change end"); |
| 563 ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; | 622 return S_OK; |
| 564 if (!webBrowser2) | 623 } |
| 565 { | 624 |
| 566 return; | 625 STDMETHODIMP CPluginClass::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, W
ORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo,
UINT* puArgErr) |
| 567 } | 626 { |
| 568 ATL::CString frameSrc; | 627 return EntryPointWithHResult([&]()->HRESULT |
| 569 ATL::CComBSTR locationUrl; | 628 { |
| 570 if (FAILED(webBrowser2->get_LocationURL(&locationUrl)) && !!locationUrl) | 629 WCHAR tmp[256]; |
| 571 { | 630 wsprintf(tmp, L"Invoke: %d\n", dispidMember); |
| 572 return; | 631 DEBUG_GENERAL(tmp); |
| 573 } | 632 switch (dispidMember) |
| 574 frameSrc = locationUrl; | 633 { |
| 575 CPluginClient::UnescapeUrl(frameSrc); | 634 case DISPID_WINDOWSTATECHANGED: |
| 576 bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2); | 635 { |
| 577 m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser); | 636 // #1163 should validate and convert arguments here |
| 578 }); | 637 return OnTabChanged(pDispParams, wFlags); |
| 579 } | 638 } |
| 580 | 639 |
| 581 void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, u
nsigned long validFlagsMask) | 640 case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE: |
| 582 { | 641 break; |
| 583 EntryPoint([&] | 642 |
| 584 { | 643 case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK: |
| 585 DEBUG_GENERAL("Tab changed"); | 644 break; |
| 586 bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OL
ECMDIDF_WINDOWSTATE_ENABLED) | 645 |
| 587 && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_W
INDOWSTATE_ENABLED); | 646 case DISPID_EVMETH_ONLOAD: |
| 588 if (newtabshown) | 647 DEBUG_NAVI("Navi::OnLoad") |
| 589 { | 648 break; |
| 590 std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(
GetCurrentThreadId()); | 649 |
| 591 if (it == s_threadInstances.end()) | 650 case DISPID_EVMETH_ONCHANGE: |
| 592 { | 651 break; |
| 593 s_threadInstances[::GetCurrentThreadId()] = this; | 652 |
| 594 if (!m_isInitializedOk) | 653 case DISPID_EVMETH_ONMOUSEDOWN: |
| 595 { | 654 break; |
| 596 m_isInitializedOk = true; | 655 |
| 597 InitObject(true); | 656 case DISPID_EVMETH_ONMOUSEENTER: |
| 598 UpdateStatusBar(); | 657 break; |
| 599 } | 658 |
| 600 } | 659 case DISPID_IHTMLIMGELEMENT_START: |
| 601 } | 660 break; |
| 602 notificationMessage.Hide(); | 661 |
| 603 DEBUG_GENERAL("Tab change end"); | 662 case STDDISPID_XOBJ_ERRORUPDATE: |
| 604 }); | 663 break; |
| 605 } | 664 |
| 606 | 665 case STDDISPID_XOBJ_ONPROPERTYCHANGE: |
| 607 void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARI
ANT_BOOL /*enable*/) | 666 break; |
| 608 { | 667 |
| 609 EntryPoint([&] | 668 case DISPID_READYSTATECHANGE: |
| 610 { | 669 DEBUG_NAVI("Navi::ReadyStateChange"); |
| 611 if (m_hPaneWnd == NULL) | 670 break; |
| 612 { | 671 |
| 613 CreateStatusBarPane(); | 672 case DISPID_BEFORENAVIGATE: |
| 614 } | 673 DEBUG_NAVI("Navi::BeforeNavigate"); |
| 615 else | 674 break; |
| 616 { | 675 |
| 676 case DISPID_COMMANDSTATECHANGE: |
| 677 if (m_hPaneWnd == NULL) |
| 678 { |
| 679 CreateStatusBarPane(); |
| 680 } |
| 681 else |
| 682 { |
| 617 if (AdblockPlus::IE::InstalledMajorVersion() > 6) | 683 if (AdblockPlus::IE::InstalledMajorVersion() > 6) |
| 618 { | 684 { |
| 619 RECT rect; | 685 RECT rect; |
| 620 BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect); | 686 BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect); |
| 621 if (rectRes == TRUE) | 687 if (rectRes == TRUE) |
| 622 { | 688 { |
| 623 MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.bottom
- rect.top, TRUE); | 689 MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.botto
m - rect.top, TRUE); |
| 624 } | 690 } |
| 625 } | 691 } |
| 692 } |
| 693 break; |
| 694 |
| 695 case DISPID_STATUSTEXTCHANGE: |
| 696 break; |
| 697 |
| 698 case DISPID_BEFORENAVIGATE2: |
| 699 { |
| 700 // #1163 should validate and convert parameters here |
| 701 BeforeNavigate2(pDispParams); |
| 702 } |
| 703 break; |
| 704 |
| 705 case DISPID_DOWNLOADBEGIN: |
| 706 { |
| 707 DEBUG_NAVI("Navi::Download Begin") |
| 708 } |
| 709 break; |
| 710 |
| 711 case DISPID_DOWNLOADCOMPLETE: |
| 712 { |
| 713 DEBUG_NAVI("Navi::Download Complete"); |
| 714 CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
| 715 if (browser) |
| 716 { |
| 717 m_tab->OnDownloadComplete(browser); |
| 718 } |
| 719 } |
| 720 break; |
| 721 |
| 722 case DISPID_DOCUMENTCOMPLETE: |
| 723 { |
| 724 DEBUG_NAVI("Navi::Document Complete"); |
| 725 CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
| 726 if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == V
T_DISPATCH) |
| 727 { |
| 728 CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; |
| 729 if (pBrowser) |
| 730 { |
| 731 CComBSTR bstrUrl; |
| 732 if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && bstrUrl && ::S
ysStringLen(bstrUrl) > 0) |
| 733 { |
| 734 std::wstring url = std::wstring(bstrUrl, SysStringLen(bstrUrl)); |
| 735 UnescapeUrl(url); |
| 736 m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBro
wser)); |
| 737 } |
| 738 } |
| 739 } |
| 740 } |
| 741 break; |
| 742 |
| 743 case DISPID_ONQUIT: |
| 744 case DISPID_QUIT: |
| 745 { |
| 746 Unadvice(); |
| 747 } |
| 748 break; |
| 749 |
| 750 default: |
| 751 { |
| 752 CString did; |
| 753 did.Format(L"DispId:%u", dispidMember); |
| 754 |
| 755 DEBUG_NAVI(L"Navi::Default " + did) |
| 756 } |
| 757 /* |
| 758 * Ordinarily a method not dispatched should return DISP_E_MEMBERNOTFOUND. |
| 759 * As a conservative initial change, we leave it behaving as before, |
| 760 * which is to do nothing and return S_OK. |
| 761 */ |
| 762 // do nothing |
| 763 break; |
| 626 } | 764 } |
| 627 }); | 765 }); |
| 628 } | 766 } |
| 629 | 767 |
| 630 bool CPluginClass::InitObject(bool bBHO) | 768 bool CPluginClass::InitObject(bool bBHO) |
| 631 { | 769 { |
| 632 DEBUG_GENERAL("InitObject"); | 770 DEBUG_GENERAL("InitObject"); |
| 633 CPluginSettings* settings = CPluginSettings::GetInstance(); | 771 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 634 | 772 |
| 635 if (!settings->GetPluginEnabled()) | 773 if (!settings->GetPluginEnabled()) |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 return tab; | 1138 return tab; |
| 1001 } | 1139 } |
| 1002 | 1140 |
| 1003 | 1141 |
| 1004 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
LECMD prgCmds[], OLECMDTEXT* pCmdText) | 1142 STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, O
LECMD prgCmds[], OLECMDTEXT* pCmdText) |
| 1005 { | 1143 { |
| 1006 return EntryPointWithHResult([&]()->HRESULT | 1144 return EntryPointWithHResult([&]()->HRESULT |
| 1007 { | 1145 { |
| 1008 if (cCmds == 0) return E_INVALIDARG; | 1146 if (cCmds == 0) return E_INVALIDARG; |
| 1009 if (prgCmds == 0) return E_POINTER; | 1147 if (prgCmds == 0) return E_POINTER; |
| 1010 | 1148 |
| 1011 prgCmds[0].cmdf = OLECMDF_ENABLED; | 1149 prgCmds[0].cmdf = OLECMDF_ENABLED; |
| 1012 | 1150 |
| 1013 return S_OK; | 1151 return S_OK; |
| 1014 }); | 1152 }); |
| 1015 } | 1153 } |
| 1016 | 1154 |
| 1017 HMENU CPluginClass::CreatePluginMenu(const CString& url) | 1155 HMENU CPluginClass::CreatePluginMenu(const std::wstring& url) |
| 1018 { | 1156 { |
| 1019 DEBUG_GENERAL("CreatePluginMenu"); | 1157 DEBUG_GENERAL("CreatePluginMenu"); |
| 1020 HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance(); | 1158 HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance(); |
| 1021 | 1159 |
| 1022 HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); | 1160 HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); |
| 1023 | 1161 |
| 1024 HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0); | 1162 HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0); |
| 1025 | 1163 |
| 1026 SetMenuBar(hMenuTrackPopup, url); | 1164 SetMenuBar(hMenuTrackPopup, url); |
| 1027 | 1165 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 { | 1253 { |
| 1116 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_NAVIGATION, PLUGIN_ERROR_NAVIGATION
_SETTINGS, "Navigation::Failed") | 1254 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_NAVIGATION, PLUGIN_ERROR_NAVIGATION
_SETTINGS, "Navigation::Failed") |
| 1117 } | 1255 } |
| 1118 } | 1256 } |
| 1119 } | 1257 } |
| 1120 break; | 1258 break; |
| 1121 } | 1259 } |
| 1122 case ID_MENU_DISABLE_ON_SITE: | 1260 case ID_MENU_DISABLE_ON_SITE: |
| 1123 { | 1261 { |
| 1124 CPluginSettings* settings = CPluginSettings::GetInstance(); | 1262 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 1125 CString urlString = GetTab()->GetDocumentUrl(); | 1263 std::wstring urlString = GetTab()->GetDocumentUrl(); |
| 1126 if (client->IsWhitelistedUrl(to_wstring(urlString))) | 1264 if (client->IsWhitelistedUrl(urlString)) |
| 1127 { | 1265 { |
| 1128 settings->RemoveWhiteListedDomain(to_CString(client->GetHostFromUrl(to_w
string(urlString)))); | 1266 settings->RemoveWhiteListedDomain(ToCString(client->GetHostFromUrl(urlSt
ring))); |
| 1129 } | 1267 } |
| 1130 else | 1268 else |
| 1131 { | 1269 { |
| 1132 settings->AddWhiteListedDomain(to_CString(client->GetHostFromUrl(to_wstr
ing(urlString)))); | 1270 settings->AddWhiteListedDomain(ToCString(client->GetHostFromUrl(urlStrin
g))); |
| 1133 } | 1271 } |
| 1134 GetBrowser()->Refresh(); | 1272 GetBrowser()->Refresh(); |
| 1135 } | 1273 } |
| 1136 default: | 1274 default: |
| 1137 break; | 1275 break; |
| 1138 } | 1276 } |
| 1139 | 1277 |
| 1140 // Invalidate and redraw the control | 1278 // Invalidate and redraw the control |
| 1141 UpdateStatusBar(); | 1279 UpdateStatusBar(); |
| 1142 } | 1280 } |
| 1143 | 1281 |
| 1144 | 1282 |
| 1145 bool CPluginClass::SetMenuBar(HMENU hMenu, const CString& url) | 1283 bool CPluginClass::SetMenuBar(HMENU hMenu, const std::wstring& url) |
| 1146 { | 1284 { |
| 1147 DEBUG_GENERAL("SetMenuBar"); | 1285 DEBUG_GENERAL("SetMenuBar"); |
| 1148 | 1286 |
| 1149 std::wstring ctext; | 1287 std::wstring ctext; |
| 1150 Dictionary* dictionary = Dictionary::GetInstance(); | 1288 Dictionary* dictionary = Dictionary::GetInstance(); |
| 1151 | 1289 |
| 1152 MENUITEMINFOW fmii = {}; | 1290 MENUITEMINFOW fmii = {}; |
| 1153 fmii.cbSize = sizeof(fmii); | 1291 fmii.cbSize = sizeof(fmii); |
| 1154 | 1292 |
| 1155 MENUITEMINFOW miiSep = {}; | 1293 MENUITEMINFOW miiSep = {}; |
| 1156 miiSep.cbSize = sizeof(miiSep); | 1294 miiSep.cbSize = sizeof(miiSep); |
| 1157 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; | 1295 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; |
| 1158 miiSep.fType = MFT_SEPARATOR; | 1296 miiSep.fType = MFT_SEPARATOR; |
| 1159 | 1297 |
| 1160 CPluginClient* client = CPluginClient::GetInstance(); | 1298 CPluginClient* client = CPluginClient::GetInstance(); |
| 1161 CPluginSettings* settings = CPluginSettings::GetInstance(); | 1299 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 1162 { | 1300 { |
| 1163 ctext = dictionary->Lookup("menu", "menu-disable-on-site"); | 1301 ctext = dictionary->Lookup("menu", "menu-disable-on-site"); |
| 1164 // Is domain in white list? | 1302 // Is domain in white list? |
| 1165 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(to_wstring(url))); | 1303 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(url)); |
| 1166 if (client->IsWhitelistedUrl(to_wstring(GetTab()->GetDocumentUrl()))) | 1304 if (client->IsWhitelistedUrl(GetTab()->GetDocumentUrl())) |
| 1167 { | 1305 { |
| 1168 fmii.fState = MFS_CHECKED | MFS_ENABLED; | 1306 fmii.fState = MFS_CHECKED | MFS_ENABLED; |
| 1169 } | 1307 } |
| 1170 else | 1308 else |
| 1171 { | 1309 { |
| 1172 fmii.fState = MFS_UNCHECKED | MFS_ENABLED; | 1310 fmii.fState = MFS_UNCHECKED | MFS_ENABLED; |
| 1173 } | 1311 } |
| 1174 fmii.fMask = MIIM_STRING | MIIM_STATE; | 1312 fmii.fMask = MIIM_STRING | MIIM_STATE; |
| 1175 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); | 1313 fmii.dwTypeData = const_cast<LPWSTR>(ctext.c_str()); |
| 1176 fmii.cch = static_cast<UINT>(ctext.size()); | 1314 fmii.cch = static_cast<UINT>(ctext.size()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 | 1354 |
| 1217 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V
ARIANTARG*) | 1355 STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, V
ARIANTARG*) |
| 1218 { | 1356 { |
| 1219 return EntryPointWithHResult([&]()->HRESULT | 1357 return EntryPointWithHResult([&]()->HRESULT |
| 1220 { | 1358 { |
| 1221 HWND hBrowserWnd = GetBrowserHWND(); | 1359 HWND hBrowserWnd = GetBrowserHWND(); |
| 1222 if (!hBrowserWnd) | 1360 if (!hBrowserWnd) |
| 1223 { | 1361 { |
| 1224 return E_FAIL; | 1362 return E_FAIL; |
| 1225 } | 1363 } |
| 1226 | 1364 |
| 1227 // Create menu | 1365 // Create menu |
| 1228 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); | 1366 HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl()); |
| 1229 if (!hMenu) | 1367 if (!hMenu) |
| 1230 { | 1368 { |
| 1231 return E_FAIL; | 1369 return E_FAIL; |
| 1232 } | 1370 } |
| 1233 | 1371 |
| 1234 // Check if button in toolbar was pressed | 1372 // Check if button in toolbar was pressed |
| 1235 int nIDCommand = -1; | 1373 int nIDCommand = -1; |
| 1236 BOOL bRightAlign = FALSE; | 1374 BOOL bRightAlign = FALSE; |
| 1237 | 1375 |
| 1238 POINT pt; | 1376 POINT pt; |
| 1239 GetCursorPos(&pt); | 1377 GetCursorPos(&pt); |
| 1240 | 1378 |
| 1241 HWND hWndToolBar = ::WindowFromPoint(pt); | 1379 HWND hWndToolBar = ::WindowFromPoint(pt); |
| 1242 | 1380 |
| 1243 DWORD nProcessId; | 1381 DWORD nProcessId; |
| 1244 ::GetWindowThreadProcessId(hWndToolBar, &nProcessId); | 1382 ::GetWindowThreadProcessId(hWndToolBar, &nProcessId); |
| 1245 | 1383 |
| 1246 if (hWndToolBar && ::GetCurrentProcessId() == nProcessId) | 1384 if (hWndToolBar && ::GetCurrentProcessId() == nProcessId) |
| 1247 { | 1385 { |
| 1248 ::ScreenToClient(hWndToolBar, &pt); | 1386 ::ScreenToClient(hWndToolBar, &pt); |
| 1249 int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt); | 1387 int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt); |
| 1250 | 1388 |
| 1251 if (nButton > 0) | 1389 if (nButton > 0) |
| 1252 { | 1390 { |
| 1253 TBBUTTON pTBBtn = {}; | 1391 TBBUTTON pTBBtn = {}; |
| 1254 | 1392 |
| 1255 if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn)) | 1393 if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn)) |
| 1256 { | 1394 { |
| 1257 RECT rcButton; | 1395 RECT rcButton; |
| 1258 nIDCommand = pTBBtn.idCommand; | 1396 nIDCommand = pTBBtn.idCommand; |
| 1259 | 1397 |
| 1260 if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton
)) | 1398 if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton
)) |
| 1261 { | 1399 { |
| 1262 pt.x = rcButton.left; | 1400 pt.x = rcButton.left; |
| 1263 pt.y = rcButton.bottom; | 1401 pt.y = rcButton.bottom; |
| 1264 ClientToScreen(hWndToolBar, &pt); | 1402 ClientToScreen(hWndToolBar, &pt); |
| 1265 | 1403 |
| 1266 RECT rcWorkArea; | 1404 RECT rcWorkArea; |
| 1267 SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID)&rcWorkArea, 0); | 1405 SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID)&rcWorkArea, 0); |
| 1268 if (rcWorkArea.right - pt.x < 150) | 1406 if (rcWorkArea.right - pt.x < 150) |
| 1269 { | 1407 { |
| 1270 bRightAlign = TRUE; | 1408 bRightAlign = TRUE; |
| 1271 pt.x = rcButton.right; | 1409 pt.x = rcButton.right; |
| 1272 pt.y = rcButton.bottom; | 1410 pt.y = rcButton.bottom; |
| 1273 ClientToScreen(hWndToolBar, &pt); | 1411 ClientToScreen(hWndToolBar, &pt); |
| 1274 } | 1412 } |
| 1275 } | 1413 } |
| 1276 } | 1414 } |
| 1277 } | 1415 } |
| 1278 else | 1416 else |
| 1279 { | 1417 { |
| 1280 GetCursorPos(&pt); | 1418 GetCursorPos(&pt); |
| 1281 } | 1419 } |
| 1282 } | 1420 } |
| 1283 | 1421 |
| 1284 // Display menu | 1422 // Display menu |
| 1285 UINT nFlags = 0; | 1423 UINT nFlags = 0; |
| 1286 if (bRightAlign) | 1424 if (bRightAlign) |
| 1287 { | 1425 { |
| 1288 nFlags |= TPM_RIGHTALIGN; | 1426 nFlags |= TPM_RIGHTALIGN; |
| 1289 } | 1427 } |
| 1290 else | 1428 else |
| 1291 { | 1429 { |
| 1292 nFlags |= TPM_LEFTALIGN; | 1430 nFlags |= TPM_LEFTALIGN; |
| 1293 } | 1431 } |
| 1294 | 1432 |
| 1295 DisplayPluginMenu(hMenu, nIDCommand, pt, nFlags); | 1433 DisplayPluginMenu(hMenu, nIDCommand, pt, nFlags); |
| 1296 | 1434 |
| 1297 return S_OK; | 1435 return S_OK; |
| 1298 }); | 1436 }); |
| 1299 } | 1437 } |
| 1300 | 1438 |
| 1301 ///////////////////////////////////////////////////////////////////////////// | 1439 ///////////////////////////////////////////////////////////////////////////// |
| 1302 // Window procedures | 1440 // Window procedures |
| 1303 | 1441 |
| 1304 LRESULT CALLBACK CPluginClass::NewStatusProc(HWND hWnd, UINT message, WPARAM wPa
ram, LPARAM lParam) | 1442 LRESULT CALLBACK CPluginClass::NewStatusProc(HWND hWnd, UINT message, WPARAM wPa
ram, LPARAM lParam) |
| 1305 { | 1443 { |
| 1306 // Find tab | 1444 // Find tab |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1373 } | 1511 } |
| 1374 | 1512 |
| 1375 LRESULT result = CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wPara
m, lParam); | 1513 LRESULT result = CallWindowProc(pClass->m_pWndProcStatus, hWnd, message, wPara
m, lParam); |
| 1376 | 1514 |
| 1377 | 1515 |
| 1378 return result; | 1516 return result; |
| 1379 | 1517 |
| 1380 } | 1518 } |
| 1381 | 1519 |
| 1382 | 1520 |
| 1383 HICON CPluginClass::GetStatusBarIcon(const CString& url) | 1521 HICON CPluginClass::GetStatusBarIcon(const std::wstring& url) |
| 1384 { | 1522 { |
| 1385 // use the disable icon as defualt, if the client doesn't exists | 1523 // use the disable icon as defualt, if the client doesn't exists |
| 1386 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); | 1524 HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); |
| 1387 | 1525 |
| 1388 CPluginTab* tab = GetTab(::GetCurrentThreadId()); | 1526 CPluginTab* tab = GetTab(::GetCurrentThreadId()); |
| 1389 if (tab) | 1527 if (tab) |
| 1390 { | 1528 { |
| 1391 CPluginClient* client = CPluginClient::GetInstance(); | 1529 CPluginClient* client = CPluginClient::GetInstance(); |
| 1392 if (CPluginSettings::GetInstance()->IsPluginEnabled()) | 1530 if (CPluginSettings::GetInstance()->IsPluginEnabled()) |
| 1393 { | 1531 { |
| 1394 if (client->IsWhitelistedUrl(ToWstring(url))) | 1532 if (client->IsWhitelistedUrl(url)) |
| 1395 { | 1533 { |
| 1396 hIcon = GetIcon(ICON_PLUGIN_DISABLED); | 1534 hIcon = GetIcon(ICON_PLUGIN_DISABLED); |
| 1397 } | 1535 } |
| 1398 else | 1536 else |
| 1399 { | 1537 { |
| 1400 CPluginSettings* settings = CPluginSettings::GetInstance(); | 1538 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 1401 hIcon = GetIcon(ICON_PLUGIN_ENABLED); | 1539 hIcon = GetIcon(ICON_PLUGIN_ENABLED); |
| 1402 } | 1540 } |
| 1403 } | 1541 } |
| 1404 } | 1542 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1502 | 1640 |
| 1503 // Done! | 1641 // Done! |
| 1504 EndPaint(hWnd, &ps); | 1642 EndPaint(hWnd, &ps); |
| 1505 | 1643 |
| 1506 return 0; | 1644 return 0; |
| 1507 } | 1645 } |
| 1508 | 1646 |
| 1509 case WM_LBUTTONUP: | 1647 case WM_LBUTTONUP: |
| 1510 case WM_RBUTTONUP: | 1648 case WM_RBUTTONUP: |
| 1511 { | 1649 { |
| 1512 CString strURL = pClass->GetBrowserUrl(); | 1650 std::wstring url = pClass->GetBrowserUrl(); |
| 1513 if (strURL != pClass->GetTab()->GetDocumentUrl()) | 1651 if (url != pClass->GetTab()->GetDocumentUrl()) |
| 1514 { | 1652 { |
| 1515 pClass->GetTab()->SetDocumentUrl(strURL); | 1653 pClass->GetTab()->SetDocumentUrl(url); |
| 1516 } | 1654 } |
| 1517 | 1655 |
| 1518 // Create menu | 1656 // Create menu |
| 1519 HMENU hMenu = pClass->CreatePluginMenu(strURL); | 1657 HMENU hMenu = pClass->CreatePluginMenu(url); |
| 1520 if (!hMenu) | 1658 if (!hMenu) |
| 1521 { | 1659 { |
| 1522 return 0; | 1660 return 0; |
| 1523 } | 1661 } |
| 1524 | 1662 |
| 1525 // Display menu | 1663 // Display menu |
| 1526 POINT pt; | 1664 POINT pt; |
| 1527 ::GetCursorPos(&pt); | 1665 ::GetCursorPos(&pt); |
| 1528 | 1666 |
| 1529 RECT rc; | 1667 RECT rc; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1614 if (m_hPaneWnd == NULL) | 1752 if (m_hPaneWnd == NULL) |
| 1615 { | 1753 { |
| 1616 CreateStatusBarPane(); | 1754 CreateStatusBarPane(); |
| 1617 } | 1755 } |
| 1618 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) | 1756 if ((m_hPaneWnd != NULL) && !::InvalidateRect(m_hPaneWnd, NULL, FALSE)) |
| 1619 { | 1757 { |
| 1620 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); | 1758 DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_INVALID
ATE_STATUSBAR, "Class::Invalidate statusbar"); |
| 1621 } | 1759 } |
| 1622 } | 1760 } |
| 1623 | 1761 |
| 1624 void STDMETHODCALLTYPE CPluginClass::OnOnQuit() | 1762 |
| 1625 { | 1763 void CPluginClass::Unadvice() |
| 1626 EntryPoint([&] | |
| 1627 { | |
| 1628 Unadvise(); | |
| 1629 }); | |
| 1630 } | |
| 1631 | |
| 1632 void CPluginClass::Unadvise() | |
| 1633 { | 1764 { |
| 1634 s_criticalSectionLocal.Lock(); | 1765 s_criticalSectionLocal.Lock(); |
| 1635 { | 1766 { |
| 1636 if (m_isAdvised) | 1767 if (m_isAdviced) |
| 1637 { | 1768 { |
| 1638 HRESULT hr = DispEventUnadvise(GetBrowser()); | 1769 CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); |
| 1639 if (FAILED(hr)) | 1770 if (pPoint) |
| 1640 { | 1771 { |
| 1641 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVIS
E, "Class::Unadvise - Unadvise"); | 1772 HRESULT hr = pPoint->Unadvise(m_nConnectionID); |
| 1642 } | 1773 if (FAILED(hr)) |
| 1643 m_isAdvised = false; | 1774 { |
| 1775 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADV
ICE, "Class::Unadvice - Unadvise"); |
| 1776 } |
| 1777 } |
| 1778 |
| 1779 m_isAdviced = false; |
| 1644 } | 1780 } |
| 1645 } | 1781 } |
| 1646 s_criticalSectionLocal.Unlock(); | 1782 s_criticalSectionLocal.Unlock(); |
| 1647 } | 1783 } |
| 1648 | 1784 |
| 1649 HICON CPluginClass::GetIcon(int type) | 1785 HICON CPluginClass::GetIcon(int type) |
| 1650 { | 1786 { |
| 1651 HICON icon = NULL; | 1787 HICON icon = NULL; |
| 1652 | 1788 |
| 1653 s_criticalSectionLocal.Lock(); | 1789 s_criticalSectionLocal.Lock(); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1735 } | 1871 } |
| 1736 } | 1872 } |
| 1737 } | 1873 } |
| 1738 | 1874 |
| 1739 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 1875 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); |
| 1740 } | 1876 } |
| 1741 | 1877 |
| 1742 return hTabWnd; | 1878 return hTabWnd; |
| 1743 | 1879 |
| 1744 } | 1880 } |
| LEFT | RIGHT |