| LEFT | RIGHT | 
|---|
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" | 
| 2 | 2 | 
| 3 #include "PluginClass.h" | 3 #include "PluginClass.h" | 
| 4 #include "PluginSettings.h" | 4 #include "PluginSettings.h" | 
| 5 #include "PluginSystem.h" | 5 #include "PluginSystem.h" | 
| 6 #include "PluginFilter.h" | 6 #include "PluginFilter.h" | 
| 7 #include "PluginMimeFilterClient.h" | 7 #include "PluginMimeFilterClient.h" | 
| 8 #include "PluginClient.h" | 8 #include "PluginClient.h" | 
| 9 #include "PluginClientFactory.h" | 9 #include "PluginClientFactory.h" | 
| 10 #include "PluginMutex.h" | 10 #include "PluginMutex.h" | 
| 11 #include "sddl.h" | 11 #include "sddl.h" | 
| 12 #include "PluginUtil.h" | 12 #include "PluginUtil.h" | 
| 13 #include "PluginUserSettings.h" | 13 #include "PluginUserSettings.h" | 
| 14 #include "../shared/Utils.h" | 14 #include "../shared/Utils.h" | 
| 15 #include "../shared/Dictionary.h" | 15 #include "../shared/Dictionary.h" | 
| 16 #include <thread> | 16 #include <thread> | 
|  | 17 #include <array> | 
| 17 | 18 | 
| 18 #ifdef DEBUG_HIDE_EL | 19 #ifdef DEBUG_HIDE_EL | 
| 19 DWORD profileTime = 0; | 20 DWORD profileTime = 0; | 
| 20 #endif | 21 #endif | 
| 21 | 22 | 
| 22 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); | 23 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); | 
| 23 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR
      ECT); | 24 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR
      ECT); | 
| 24 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); | 25 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); | 
| 25 | 26 | 
| 26 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL }; | 27 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL }; | 
| 27 DWORD CPluginClass::s_hIconTypes[ICON_MAX] = { IDI_ICON_DISABLED, IDI_ICON_ENABL
      ED, IDI_ICON_DEACTIVATED }; | 28 DWORD CPluginClass::s_hIconTypes[ICON_MAX] = { IDI_ICON_DISABLED, IDI_ICON_ENABL
      ED, IDI_ICON_DEACTIVATED }; | 
| 28 | 29 | 
| 29 CPluginMimeFilterClient* CPluginClass::s_mimeFilter = NULL; | 30 CPluginMimeFilterClient* CPluginClass::s_mimeFilter = NULL; | 
| 30 | 31 | 
| 31 CLOSETHEMEDATA pfnClose = NULL; | 32 CLOSETHEMEDATA pfnClose = NULL; | 
| 32 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; | 33 DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; | 
| 33 OPENTHEMEDATA pfnOpenThemeData = NULL; | 34 OPENTHEMEDATA pfnOpenThemeData = NULL; | 
| 34 | 35 | 
| 35 ATOM CPluginClass::s_atomPaneClass = NULL; | 36 ATOM CPluginClass::s_atomPaneClass = NULL; | 
| 36 HINSTANCE CPluginClass::s_hUxtheme = NULL; | 37 HINSTANCE CPluginClass::s_hUxtheme = NULL; | 
| 37 std::set<CPluginClass*> CPluginClass::s_instances; | 38 std::set<CPluginClass*> CPluginClass::s_instances; | 
| 38 std::map<DWORD, CPluginClass*> CPluginClass::s_threadInstances; | 39 std::map<DWORD, CPluginClass*> CPluginClass::s_threadInstances; | 
| 39 | 40 | 
| 40 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal; | 41 CComAutoCriticalSection CPluginClass::s_criticalSectionLocal; | 
| 41 CComAutoCriticalSection CPluginClass::s_criticalSectionBrowser; | 42 CComAutoCriticalSection CPluginClass::s_criticalSectionBrowser; | 
| 42 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow; | 43 CComAutoCriticalSection CPluginClass::s_criticalSectionWindow; | 
| 43 | 44 | 
| 44 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2; | 45 CComQIPtr<IWebBrowser2> CPluginClass::s_asyncWebBrowser2; | 
| 45 std::map<UINT,CString> CPluginClass::s_menuDomains; |  | 
| 46 | 46 | 
| 47 /* | 47 /* | 
| 48  * Without namespace declaration, the identifier "Rectangle" is ambiguous | 48  * Without namespace declaration, the identifier "Rectangle" is ambiguous | 
| 49  * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85)
      .aspx | 49  * See http://msdn.microsoft.com/en-us/library/windows/desktop/dd162898(v=vs.85)
      .aspx | 
| 50  */ | 50  */ | 
| 51 namespace AdblockPlus | 51 namespace AdblockPlus | 
| 52 { | 52 { | 
| 53   /** | 53   /** | 
| 54     * Replacement for ATL type CRect. | 54     * Replacement for ATL type CRect. | 
| 55     */ | 55     */ | 
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 201 | 201 | 
| 202   return browser; | 202   return browser; | 
| 203 } | 203 } | 
| 204 | 204 | 
| 205 std::wstring CPluginClass::GetBrowserUrl() const | 205 std::wstring CPluginClass::GetBrowserUrl() const | 
| 206 { | 206 { | 
| 207   std::wstring url; | 207   std::wstring url; | 
| 208   CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 208   CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 
| 209   if (browser) | 209   if (browser) | 
| 210   { | 210   { | 
| 211     BSTR bstrURL; | 211     CComBSTR bstrURL; | 
| 212     if (SUCCEEDED(browser->get_LocationURL(&bstrURL)) && bstrURL) | 212     if (SUCCEEDED(browser->get_LocationURL(&bstrURL)) && bstrURL) | 
| 213     { | 213     { | 
| 214       url = std::wstring(bstrURL, SysStringLen(bstrURL)); | 214       url = std::wstring(bstrURL, SysStringLen(bstrURL)); | 
| 215       SysFreeString(bstrURL); |  | 
| 216       UnescapeUrl(url); | 215       UnescapeUrl(url); | 
| 217     } | 216     } | 
| 218   } | 217   } | 
| 219   else | 218   else | 
| 220   { | 219   { | 
| 221     url = m_tab->GetDocumentUrl(); | 220     url = m_tab->GetDocumentUrl(); | 
| 222   } | 221   } | 
| 223   return url; | 222   return url; | 
| 224 } | 223 } | 
| 225 | 224 | 
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 380     { | 379     { | 
| 381       s_instances.erase(this); | 380       s_instances.erase(this); | 
| 382 | 381 | 
| 383       std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetC
      urrentThreadId()); | 382       std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetC
      urrentThreadId()); | 
| 384       if (it != s_threadInstances.end()) | 383       if (it != s_threadInstances.end()) | 
| 385       { | 384       { | 
| 386         s_threadInstances.erase(it); | 385         s_threadInstances.erase(it); | 
| 387       } | 386       } | 
| 388       if (s_instances.empty()) | 387       if (s_instances.empty()) | 
| 389       { | 388       { | 
|  | 389         // TODO: Explicitly releasing a resource when a container becomes empty 
      looks like a job better suited for shared_ptr | 
| 390         CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 390         CPluginClientFactory::ReleaseMimeFilterClientInstance(); | 
| 391       } | 391       } | 
| 392     } | 392     } | 
| 393     s_criticalSectionLocal.Unlock(); | 393     s_criticalSectionLocal.Unlock(); | 
| 394 | 394 | 
| 395     // Release browser interface | 395     // Release browser interface | 
| 396     s_criticalSectionBrowser.Lock(); | 396     s_criticalSectionBrowser.Lock(); | 
| 397     { | 397     { | 
| 398       m_webBrowser2.Release(); | 398       m_webBrowser2.Release(); | 
| 399     } | 399     } | 
| 400     s_criticalSectionBrowser.Unlock(); | 400     s_criticalSectionBrowser.Unlock(); | 
| 401 | 401 | 
| 402     DEBUG_GENERAL("=============================================================
      ===================\nNEW TAB UI - END\n=========================================
      =======================================") | 402     DEBUG_GENERAL("=============================================================
      ===================\nNEW TAB UI - END\n=========================================
      =======================================") | 
| 403 | 403 | 
| 404     ::CoUninitialize(); | 404     ::CoUninitialize(); | 
| 405   } | 405   } | 
| 406 | 406 | 
| 407   return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | 407   return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); | 
| 408 } | 408 } | 
| 409 | 409 | 
| 410 bool CPluginClass::IsStatusBarEnabled() | 410 bool CPluginClass::IsStatusBarEnabled() | 
| 411 { | 411 { | 
| 412   DEBUG_GENERAL("IsStatusBarEnabled start"); | 412   DEBUG_GENERAL("IsStatusBarEnabled start"); | 
| 413   HKEY pHkey; | 413   HKEY pHkey; | 
| 414   HKEY pHkeySub; | 414   HKEY pHkeySub; | 
| 415   RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); | 415   RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); | 
| 416   DWORD trueth = 1; | 416   DWORD truth = 1; | 
| 417   DWORD truethSize = sizeof(DWORD); | 417   DWORD truthSize = sizeof(truth); | 
| 418   RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\Main", &pHkeySub); | 418   RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\Main", &pHkeySub); | 
| 419   LONG res = RegQueryValueEx(pHkeySub, L"StatusBarWeb", NULL, NULL, (BYTE*)&true
      th, &truethSize); | 419   LONG res = RegQueryValueEx(pHkeySub, L"StatusBarWeb", NULL, NULL, (BYTE*)&trut
      h, &truthSize); | 
| 420   RegCloseKey(pHkey); | 420   RegCloseKey(pHkey); | 
| 421   if (res != ERROR_SUCCESS) | 421   if (res != ERROR_SUCCESS) | 
| 422   { | 422   { | 
| 423     res = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\MINIE", &p
      HkeySub); | 423     res = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\MINIE", &p
      HkeySub); | 
| 424     if (res == ERROR_SUCCESS) | 424     if (res == ERROR_SUCCESS) | 
| 425     { | 425     { | 
| 426       LONG res = RegQueryValueEx(pHkeySub, L"ShowStatusBar", NULL, NULL, (BYTE*)
      &trueth, &truethSize); | 426       LONG res = RegQueryValueEx(pHkeySub, L"ShowStatusBar", NULL, NULL, (BYTE*)
      &truth, &truthSize); | 
| 427       if (res == ERROR_SUCCESS) | 427       if (res == ERROR_SUCCESS) | 
| 428       { | 428       { | 
| 429         RegCloseKey(pHkey); | 429         RegCloseKey(pHkey); | 
| 430       } | 430       } | 
| 431     } | 431     } | 
| 432   } | 432   } | 
| 433   DEBUG_GENERAL("IsStatusBarEnabled end"); | 433   DEBUG_GENERAL("IsStatusBarEnabled end"); | 
| 434   return trueth == 1; | 434   return truth == 1; | 
| 435 } | 435 } | 
| 436 | 436 | 
| 437 void CPluginClass::ShowStatusBar() | 437 void CPluginClass::ShowStatusBar() | 
| 438 { | 438 { | 
| 439   DEBUG_GENERAL("ShowStatusBar start"); | 439   DEBUG_GENERAL("ShowStatusBar start"); | 
| 440 | 440 | 
| 441   VARIANT_BOOL isVisible; | 441   VARIANT_BOOL isVisible; | 
| 442 | 442 | 
| 443 | 443 | 
| 444   CComQIPtr<IWebBrowser2> browser = GetAsyncBrowser(); | 444   CComQIPtr<IWebBrowser2> browser = GetAsyncBrowser(); | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 469               MB_OK); | 469               MB_OK); | 
| 470           return; | 470           return; | 
| 471         } | 471         } | 
| 472         // Ask if a user wants to enable a status bar automatically | 472         // Ask if a user wants to enable a status bar automatically | 
| 473         LRESULT res = MessageBox((HWND)m_hTabWnd, | 473         LRESULT res = MessageBox((HWND)m_hTabWnd, | 
| 474             dictionary->Lookup("status-bar", "question").c_str(), | 474             dictionary->Lookup("status-bar", "question").c_str(), | 
| 475             dictionary->Lookup("status-bar", "title").c_str(), | 475             dictionary->Lookup("status-bar", "title").c_str(), | 
| 476             MB_YESNO); | 476             MB_YESNO); | 
| 477         if (res == IDYES) | 477         if (res == IDYES) | 
| 478         { | 478         { | 
| 479           DWORD trueth = 1; | 479           DWORD truth = 1; | 
| 480           regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M
      INIE", &pHkeySub); | 480           regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M
      INIE", &pHkeySub); | 
| 481           regRes = RegSetValueEx(pHkeySub, L"ShowStatusBar", 0, REG_DWORD, (BYTE
      *)&trueth, sizeof(DWORD)); | 481           regRes = RegSetValueEx(pHkeySub, L"ShowStatusBar", 0, REG_DWORD, (BYTE
      *)&truth, sizeof(truth)); | 
| 482           regRes = RegCloseKey(pHkeySub); | 482           regRes = RegCloseKey(pHkeySub); | 
| 483           regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M
      ain", &pHkeySub); | 483           regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M
      ain", &pHkeySub); | 
| 484           regRes = RegSetValueEx(pHkeySub, L"StatusBarWeb", 0, REG_DWORD, (BYTE*
      )&trueth, sizeof(DWORD)); | 484           regRes = RegSetValueEx(pHkeySub, L"StatusBarWeb", 0, REG_DWORD, (BYTE*
      )&truth, sizeof(truth)); | 
| 485           regRes = RegCloseKey(pHkeySub); | 485           regRes = RegCloseKey(pHkeySub); | 
| 486           hr = browser->put_StatusBar(TRUE); | 486           hr = browser->put_StatusBar(TRUE); | 
| 487           if (FAILED(hr)) | 487           if (FAILED(hr)) | 
| 488           { | 488           { | 
| 489             DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_PUT_STATUSBAR, 
      "Class::Enable statusbar"); | 489             DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_PUT_STATUSBAR, 
      "Class::Enable statusbar"); | 
| 490           } | 490           } | 
| 491           CreateStatusBarPane(); | 491           CreateStatusBarPane(); | 
| 492 | 492 | 
| 493           // We need to restart the tab now, to enable the status bar properly | 493           // We need to restart the tab now, to enable the status bar properly | 
| 494           VARIANT vFlags; | 494           VARIANT vFlags; | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 513       } | 513       } | 
| 514     } | 514     } | 
| 515     else | 515     else | 
| 516     { | 516     { | 
| 517       DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class
      ::Get statusbar state"); | 517       DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_GET_STATUSBAR, "Class
      ::Get statusbar state"); | 
| 518     } | 518     } | 
| 519   } | 519   } | 
| 520   DEBUG_GENERAL("ShowStatusBar end"); | 520   DEBUG_GENERAL("ShowStatusBar end"); | 
| 521 } | 521 } | 
| 522 | 522 | 
|  | 523 /* | 
|  | 524  * #1163 This class is the implementation for method DISPID_BEFORENAVIGATE2 in C
      PluginClass::Invoke. | 
|  | 525  * - It validates and convertes its own arguments, rather than unifying them in 
      the Invoke body. | 
|  | 526  * - It's declared void and not HRESULT, so DISPID_BEFORENAVIGATE2 can only retu
      rn S_OK. | 
|  | 527  */ | 
| 523 void CPluginClass::BeforeNavigate2(DISPPARAMS* pDispParams) | 528 void CPluginClass::BeforeNavigate2(DISPPARAMS* pDispParams) | 
| 524 { | 529 { | 
| 525 | 530 | 
| 526   if (pDispParams->cArgs < 7) | 531   if (pDispParams->cArgs < 7) | 
| 527   { | 532   { | 
| 528     return; | 533     return; | 
| 529   } | 534   } | 
| 530   //Register a mime filter if it's not registered yet | 535   //Register a mime filter if it's not registered yet | 
| 531   if (s_mimeFilter == NULL) | 536   if (s_mimeFilter == NULL) | 
| 532   { | 537   { | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 582 | 587 | 
| 583     UpdateStatusBar(); | 588     UpdateStatusBar(); | 
| 584   } | 589   } | 
| 585   else | 590   else | 
| 586   { | 591   { | 
| 587     DEBUG_NAVI(L"Navi::Begin navigation url:" + urlLegacy) | 592     DEBUG_NAVI(L"Navi::Begin navigation url:" + urlLegacy) | 
| 588     m_tab->CacheFrame(url); | 593     m_tab->CacheFrame(url); | 
| 589   } | 594   } | 
| 590 } | 595 } | 
| 591 | 596 | 
|  | 597 /* | 
|  | 598  * #1163 implements behavior for method DISPID_WINDOWSTATECHANGED in CPluginClas
      s::Invoke | 
|  | 599  * - should validate and convert arguments in Invoke, not here | 
|  | 600  * - does not validate number of arguments before indexing into 'rgvarg' | 
|  | 601  * - does not validate type of argument before using its value | 
|  | 602  */ | 
| 592 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) | 603 STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) | 
| 593 { | 604 { | 
| 594   DEBUG_GENERAL("Tab changed"); | 605   DEBUG_GENERAL("Tab changed"); | 
| 595   bool newtabshown = pDispParams->rgvarg[1].intVal==3; | 606   bool newtabshown = pDispParams->rgvarg[1].intVal==3; | 
| 596   if (newtabshown) | 607   if (newtabshown) | 
| 597   { | 608   { | 
| 598     std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge
      tCurrentThreadId()); | 609     std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(Ge
      tCurrentThreadId()); | 
| 599     if (it == s_threadInstances.end()) | 610     if (it == s_threadInstances.end()) | 
| 600     { | 611     { | 
| 601       s_threadInstances[::GetCurrentThreadId()] = this; | 612       s_threadInstances[::GetCurrentThreadId()] = this; | 
| 602 |  | 
| 603 |  | 
| 604       if (!m_isInitializedOk) | 613       if (!m_isInitializedOk) | 
| 605       { | 614       { | 
| 606         m_isInitializedOk = true; | 615         m_isInitializedOk = true; | 
| 607         if (!InitObject(true)) | 616         InitObject(true); | 
| 608         { |  | 
| 609           //»   »       »       »       »       Unadvice(); |  | 
| 610         } |  | 
| 611         UpdateStatusBar(); | 617         UpdateStatusBar(); | 
| 612       } | 618       } | 
| 613     } | 619     } | 
| 614   } | 620   } | 
| 615   notificationMessage.Hide(); | 621   notificationMessage.Hide(); | 
| 616   DEBUG_GENERAL("Tab change end"); | 622   DEBUG_GENERAL("Tab change end"); | 
| 617   return VARIANT_TRUE; | 623   return S_OK; | 
| 618 } | 624 } | 
| 619 | 625 | 
| 620 // This gets called whenever there's a browser event | 626 // This gets called whenever there's a browser event | 
|  | 627 // ENTRY POINT | 
| 621 STDMETHODIMP CPluginClass::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, W
      ORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo,
       UINT* puArgErr) | 628 STDMETHODIMP CPluginClass::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, W
      ORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo,
       UINT* puArgErr) | 
| 622 { | 629 { | 
| 623   WCHAR tmp[256]; | 630   try | 
| 624   wsprintf(tmp, L"Invoke: %d\n", dispidMember); | 631   { | 
| 625   DEBUG_GENERAL(tmp); | 632     WCHAR tmp[256]; | 
| 626   switch (dispidMember) | 633     wsprintf(tmp, L"Invoke: %d\n", dispidMember); | 
| 627   { | 634     DEBUG_GENERAL(tmp); | 
| 628 | 635     switch (dispidMember) | 
| 629   case DISPID_WINDOWSTATECHANGED: | 636     { | 
| 630     return OnTabChanged(pDispParams, wFlags); | 637     case DISPID_WINDOWSTATECHANGED: | 
| 631     break; | 638       { | 
| 632   case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE: | 639         // #1163 should validate and convert arguments here | 
| 633     return VARIANT_TRUE; | 640         return OnTabChanged(pDispParams, wFlags); | 
| 634     break; | 641       } | 
| 635 | 642 | 
| 636   case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK: | 643     case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE: | 
| 637     return VARIANT_TRUE; | 644       break; | 
| 638     break; | 645 | 
| 639 | 646     case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK: | 
| 640   case DISPID_EVMETH_ONLOAD: | 647       break; | 
| 641     DEBUG_NAVI("Navi::OnLoad") | 648 | 
| 642       return VARIANT_TRUE; | 649     case DISPID_EVMETH_ONLOAD: | 
| 643     break; | 650       DEBUG_NAVI("Navi::OnLoad") | 
| 644 | 651       break; | 
| 645   case DISPID_EVMETH_ONCHANGE: | 652 | 
| 646     return VARIANT_TRUE; | 653     case DISPID_EVMETH_ONCHANGE: | 
| 647 | 654       break; | 
| 648   case DISPID_EVMETH_ONMOUSEDOWN: | 655 | 
| 649     return VARIANT_TRUE; | 656     case DISPID_EVMETH_ONMOUSEDOWN: | 
| 650 | 657       break; | 
| 651   case DISPID_EVMETH_ONMOUSEENTER: | 658 | 
| 652     return VARIANT_TRUE; | 659     case DISPID_EVMETH_ONMOUSEENTER: | 
| 653 | 660       break; | 
| 654   case DISPID_IHTMLIMGELEMENT_START: | 661 | 
| 655     return VARIANT_TRUE; | 662     case DISPID_IHTMLIMGELEMENT_START: | 
| 656 | 663       break; | 
| 657   case STDDISPID_XOBJ_ERRORUPDATE: | 664 | 
| 658     return VARIANT_TRUE; | 665     case STDDISPID_XOBJ_ERRORUPDATE: | 
| 659 | 666       break; | 
| 660   case STDDISPID_XOBJ_ONPROPERTYCHANGE: | 667 | 
| 661     return VARIANT_TRUE; | 668     case STDDISPID_XOBJ_ONPROPERTYCHANGE: | 
| 662 | 669       break; | 
| 663   case DISPID_READYSTATECHANGE: | 670 | 
| 664     DEBUG_NAVI("Navi::ReadyStateChange") | 671     case DISPID_READYSTATECHANGE: | 
| 665       return VARIANT_TRUE; | 672       DEBUG_NAVI("Navi::ReadyStateChange"); | 
| 666 | 673       break; | 
| 667   case DISPID_BEFORENAVIGATE: | 674 | 
| 668     DEBUG_NAVI("Navi::BeforeNavigate") | 675     case DISPID_BEFORENAVIGATE: | 
| 669       return VARIANT_TRUE; | 676       DEBUG_NAVI("Navi::BeforeNavigate"); | 
| 670   case DISPID_COMMANDSTATECHANGE: | 677       break; | 
| 671     if (m_hPaneWnd == NULL) | 678 | 
| 672     { | 679     case DISPID_COMMANDSTATECHANGE: | 
| 673       CreateStatusBarPane(); | 680       if (m_hPaneWnd == NULL) | 
| 674     } | 681       { | 
| 675     else | 682         CreateStatusBarPane(); | 
| 676     { | 683       } | 
| 677       if (CPluginClient::GetInstance()->GetIEVersion() > 6) | 684       else | 
| 678       { | 685       { | 
| 679         RECT rect; | 686         if (CPluginClient::GetInstance()->GetIEVersion() > 6) | 
| 680         BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect); | 687         { | 
| 681         if (rectRes == TRUE) | 688           RECT rect; | 
| 682         { | 689           BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect); | 
| 683           MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.bottom 
      - rect.top, TRUE); | 690           if (rectRes == TRUE) | 
| 684         } | 691           { | 
| 685       } | 692             MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.botto
      m - rect.top, TRUE); | 
| 686     } | 693           } | 
| 687     break; | 694         } | 
| 688   case DISPID_STATUSTEXTCHANGE: | 695       } | 
| 689     break; | 696       break; | 
| 690 | 697 | 
| 691   case DISPID_BEFORENAVIGATE2: | 698     case DISPID_STATUSTEXTCHANGE: | 
| 692     BeforeNavigate2(pDispParams); | 699       break; | 
| 693     break; | 700 | 
| 694 | 701     case DISPID_BEFORENAVIGATE2: | 
| 695   case DISPID_DOWNLOADBEGIN: | 702       { | 
| 696     { | 703         // #1163 should validate and convert parameters here | 
| 697       DEBUG_NAVI("Navi::Download Begin") | 704         BeforeNavigate2(pDispParams); | 
| 698     } | 705       } | 
| 699     break; | 706       break; | 
| 700 | 707 | 
| 701   case DISPID_DOWNLOADCOMPLETE: | 708     case DISPID_DOWNLOADBEGIN: | 
| 702     { | 709       { | 
| 703       DEBUG_NAVI("Navi::Download Complete") | 710         DEBUG_NAVI("Navi::Download Begin") | 
| 704 | 711       } | 
|  | 712       break; | 
|  | 713 | 
|  | 714     case DISPID_DOWNLOADCOMPLETE: | 
|  | 715       { | 
|  | 716         DEBUG_NAVI("Navi::Download Complete"); | 
| 705         CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 717         CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 
| 706       if (browser) | 718         if (browser) | 
| 707       { | 719         { | 
| 708         m_tab->OnDownloadComplete(browser); | 720           m_tab->OnDownloadComplete(browser); | 
| 709       } | 721         } | 
| 710     } | 722       } | 
| 711     break; | 723       break; | 
| 712 | 724 | 
| 713   case DISPID_DOCUMENTCOMPLETE: | 725     case DISPID_DOCUMENTCOMPLETE: | 
| 714     { | 726       { | 
| 715       DEBUG_NAVI("Navi::Document Complete") | 727         DEBUG_NAVI("Navi::Document Complete"); | 
| 716 |  | 
| 717         CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 728         CComQIPtr<IWebBrowser2> browser = GetBrowser(); | 
| 718 | 729         if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == V
      T_DISPATCH) | 
| 719       if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == VT_
      DISPATCH) | 730         { | 
| 720       { | 731           CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; | 
| 721         CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; | 732           if (pBrowser) | 
| 722         if (pBrowser) |  | 
| 723         { |  | 
| 724           BSTR bstrUrl; |  | 
| 725           if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && ::SysStringLen(b
      strUrl) > 0) |  | 
| 726           { | 733           { | 
| 727             std::wstring url(bstrUrl, SysStringLen(bstrUrl)); | 734             CComBSTR bstrUrl; | 
| 728             SysFreeString(bstrUrl); | 735             if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && bstrUrl && ::S
      ysStringLen(bstrUrl) > 0) | 
| 729             UnescapeUrl(url); | 736             { | 
| 730             m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBrows
      er)); | 737               std::wstring url = std::wstring(bstrUrl, SysStringLen(bstrUrl)); | 
|  | 738               UnescapeUrl(url); | 
|  | 739               m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBro
      wser)); | 
|  | 740             } | 
| 731           } | 741           } | 
| 732         } | 742         } | 
| 733       } | 743       } | 
| 734     } | 744       break; | 
| 735     break; | 745 | 
| 736 | 746     case DISPID_ONQUIT: | 
| 737   case DISPID_ONQUIT: | 747     case DISPID_QUIT: | 
| 738   case DISPID_QUIT: | 748       { | 
| 739     { | 749         Unadvice(); | 
| 740       Unadvice(); | 750       } | 
| 741     } | 751       break; | 
| 742     break; | 752 | 
| 743 | 753     default: | 
| 744   default: | 754       { | 
| 745     { | 755         CString did; | 
| 746       CString did; | 756         did.Format(L"DispId:%u", dispidMember); | 
| 747       did.Format(L"DispId:%u", dispidMember); | 757 | 
| 748 | 758         DEBUG_NAVI(L"Navi::Default " + did) | 
| 749       DEBUG_NAVI(L"Navi::Default " + did) | 759       } | 
| 750     } | 760       /* | 
| 751 | 761        * Ordinarily a method not dispatched should return DISP_E_MEMBERNOTFOUND. | 
| 752     // do nothing | 762        * As a conservative initial change, we leave it behaving as before, | 
| 753     break; | 763        *   which is to do nothing and return S_OK. | 
| 754   } | 764        */ | 
| 755 | 765       // do nothing | 
| 756   return VARIANT_TRUE; | 766       break; | 
|  | 767     } | 
|  | 768   } | 
|  | 769   catch(...) | 
|  | 770   { | 
|  | 771     DEBUG_GENERAL( "Caught unknown exception in CPluginClass::Invoke" ); | 
|  | 772     return E_FAIL; | 
|  | 773   } | 
|  | 774   return S_OK; | 
| 757 } | 775 } | 
| 758 | 776 | 
| 759 bool CPluginClass::InitObject(bool bBHO) | 777 bool CPluginClass::InitObject(bool bBHO) | 
| 760 { | 778 { | 
| 761   DEBUG_GENERAL("InitObject"); | 779   DEBUG_GENERAL("InitObject"); | 
| 762   CPluginSettings* settings = CPluginSettings::GetInstance(); | 780   CPluginSettings* settings = CPluginSettings::GetInstance(); | 
| 763 | 781 | 
| 764   if (!settings->GetPluginEnabled()) | 782   if (!settings->GetPluginEnabled()) | 
| 765   { | 783   { | 
| 766     s_mimeFilter->Unregister(); | 784     s_mimeFilter->Unregister(); | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 798       } | 816       } | 
| 799     } | 817     } | 
| 800   } | 818   } | 
| 801   s_criticalSectionLocal.Unlock(); | 819   s_criticalSectionLocal.Unlock(); | 
| 802 | 820 | 
| 803   // Register pane class | 821   // Register pane class | 
| 804   if (!GetAtomPaneClass()) | 822   if (!GetAtomPaneClass()) | 
| 805   { | 823   { | 
| 806     WNDCLASSEX wcex; | 824     WNDCLASSEX wcex; | 
| 807 | 825 | 
| 808     wcex.cbSize = sizeof(WNDCLASSEX); | 826     wcex.cbSize = sizeof(wcex); | 
| 809     wcex.style = 0; | 827     wcex.style = 0; | 
| 810     wcex.lpfnWndProc = (WNDPROC)PaneWindowProc; | 828     wcex.lpfnWndProc = (WNDPROC)PaneWindowProc; | 
| 811     wcex.cbClsExtra = 0; | 829     wcex.cbClsExtra = 0; | 
| 812     wcex.cbWndExtra = 0; | 830     wcex.cbWndExtra = 0; | 
| 813     wcex.hInstance = _Module.m_hInst; | 831     wcex.hInstance = _Module.m_hInst; | 
| 814     wcex.hIcon = NULL; | 832     wcex.hIcon = NULL; | 
| 815     wcex.hCursor = NULL; | 833     wcex.hCursor = NULL; | 
| 816     wcex.hbrBackground = NULL; | 834     wcex.hbrBackground = NULL; | 
| 817     wcex.lpszMenuName = NULL; | 835     wcex.lpszMenuName = NULL; | 
| 818     wcex.lpszClassName = STATUSBAR_PANE_NAME; | 836     wcex.lpszClassName = STATUSBAR_PANE_NAME; | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 874   s_criticalSectionLocal.Unlock(); | 892   s_criticalSectionLocal.Unlock(); | 
| 875   return true; | 893   return true; | 
| 876 } | 894 } | 
| 877 | 895 | 
| 878 bool CPluginClass::CreateStatusBarPane() | 896 bool CPluginClass::CreateStatusBarPane() | 
| 879 { | 897 { | 
| 880   CriticalSection::Lock lock(m_csStatusBar); | 898   CriticalSection::Lock lock(m_csStatusBar); | 
| 881 | 899 | 
| 882   CPluginClient* client = CPluginClient::GetInstance(); | 900   CPluginClient* client = CPluginClient::GetInstance(); | 
| 883 | 901 | 
| 884   wchar_t szClassName[MAX_PATH]; | 902   std::array<wchar_t, MAX_PATH> className; | 
| 885   // Get browser window and url | 903   // Get browser window and url | 
| 886   HWND hBrowserWnd = GetBrowserHWND(); | 904   HWND hBrowserWnd = GetBrowserHWND(); | 
| 887   if (!hBrowserWnd) | 905   if (!hBrowserWnd) | 
| 888   { | 906   { | 
| 889     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C
      lass::CreateStatusBarPane - No status bar") | 907     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C
      lass::CreateStatusBarPane - No status bar") | 
| 890     return false; | 908     return false; | 
| 891   } | 909   } | 
| 892 | 910 | 
| 893   // Looking for a TabWindowClass window in IE7 | 911   // Looking for a TabWindowClass window in IE7 | 
| 894   // the last one should be parent for statusbar | 912   // the last one should be parent for statusbar | 
| 895   HWND hWndStatusBar = NULL; | 913   HWND hWndStatusBar = NULL; | 
| 896 | 914 | 
| 897   HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | 915   HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | 
| 898   UINT amoundOfNewTabs = 0; | 916   UINT amoundOfNewTabs = 0; | 
| 899   HWND uniqueNewTab = NULL; | 917   HWND uniqueNewTab = NULL; | 
| 900   while (hTabWnd) | 918   while (hTabWnd) | 
| 901   { | 919   { | 
| 902     memset(szClassName, 0, MAX_PATH); | 920     className[0] = L'\0'; | 
| 903     GetClassName(hTabWnd, szClassName, MAX_PATH); | 921     // GetClassNameW returns the number of characters without '\0' | 
| 904 | 922     int classNameLength = GetClassNameW(hTabWnd, className.data(), className.siz
      e()); | 
| 905     if (wcscmp(szClassName, L"TabWindowClass") == 0 || wcscmp(szClassName,L"Fram
      e Tab") == 0) | 923 | 
|  | 924     if (classNameLength && (wcscmp(className.data(), L"TabWindowClass") == 0 || 
      wcscmp(className.data(), L"Frame Tab") == 0)) | 
| 906     { | 925     { | 
| 907       // IE8 support | 926       // IE8 support | 
| 908       HWND hTabWnd2 = hTabWnd; | 927       HWND hTabWnd2 = hTabWnd; | 
| 909       if (wcscmp(szClassName,L"Frame Tab") == 0) | 928       if (wcscmp(className.data(), L"Frame Tab") == 0) | 
| 910       { | 929       { | 
| 911         hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); | 930         hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); | 
| 912       } | 931       } | 
| 913 | 932 | 
| 914       if (hTabWnd2) | 933       if (hTabWnd2) | 
| 915       { | 934       { | 
| 916         DWORD nProcessId; | 935         DWORD nProcessId; | 
| 917         ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); | 936         ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); | 
| 918         if (::GetCurrentProcessId() == nProcessId) | 937         if (::GetCurrentProcessId() == nProcessId) | 
| 919         { | 938         { | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
| 946         } | 965         } | 
| 947       } | 966       } | 
| 948     } | 967     } | 
| 949 | 968 | 
| 950     hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 969     hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 
| 951   } | 970   } | 
| 952 | 971 | 
| 953   HWND hWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | 972   HWND hWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | 
| 954   while (hWnd) | 973   while (hWnd) | 
| 955   { | 974   { | 
| 956     memset(szClassName, 0, MAX_PATH); | 975     className[0] = L'\0'; | 
| 957     ::GetClassName(hWnd, szClassName, MAX_PATH); | 976     int classNameLength = GetClassNameW(hWnd, className.data(), className.size()
      ); | 
| 958 | 977 | 
| 959     if (wcscmp(szClassName,L"msctls_statusbar32") == 0) | 978     if (classNameLength && wcscmp(className.data(), L"msctls_statusbar32") == 0) | 
| 960     { | 979     { | 
| 961       hWndStatusBar = hWnd; | 980       hWndStatusBar = hWnd; | 
| 962       break; | 981       break; | 
| 963     } | 982     } | 
| 964 | 983 | 
| 965     hWnd = ::GetWindow(hWnd, GW_HWNDNEXT); | 984     hWnd = ::GetWindow(hWnd, GW_HWNDNEXT); | 
| 966   } | 985   } | 
| 967 | 986 | 
| 968   if (!hWndStatusBar) | 987   if (!hWndStatusBar) | 
| 969   { | 988   { | 
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1146   HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance(); | 1165   HINSTANCE hInstance = _AtlBaseModule.GetModuleInstance(); | 
| 1147 | 1166 | 
| 1148   HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); | 1167   HMENU hMenu = ::LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); | 
| 1149 | 1168 | 
| 1150   HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0); | 1169   HMENU hMenuTrackPopup = GetSubMenu(hMenu, 0); | 
| 1151 | 1170 | 
| 1152   SetMenuBar(hMenuTrackPopup, url); | 1171   SetMenuBar(hMenuTrackPopup, url); | 
| 1153 | 1172 | 
| 1154   return hMenuTrackPopup; | 1173   return hMenuTrackPopup; | 
| 1155 } | 1174 } | 
| 1156 BOOL CreateLowProcess(WCHAR* wszProcessName, WCHAR* cmdLine) |  | 
| 1157 { |  | 
| 1158 |  | 
| 1159   BOOL                  fRet; |  | 
| 1160   HANDLE                hToken        = NULL; |  | 
| 1161   HANDLE                hNewToken     = NULL; |  | 
| 1162   PSID                  pIntegritySid = NULL; |  | 
| 1163   TOKEN_MANDATORY_LABEL TIL           = {0}; |  | 
| 1164   PROCESS_INFORMATION   ProcInfo      = {0}; |  | 
| 1165   STARTUPINFO           StartupInfo   = {0}; |  | 
| 1166 |  | 
| 1167 |  | 
| 1168 |  | 
| 1169   // Low integrity SID |  | 
| 1170   WCHAR wszIntegritySid[20] = L"S-1-16-4096"; |  | 
| 1171 |  | 
| 1172 |  | 
| 1173   fRet = OpenProcessToken(GetCurrentProcess(), |  | 
| 1174     TOKEN_DUPLICATE | |  | 
| 1175     TOKEN_ADJUST_DEFAULT | |  | 
| 1176     TOKEN_QUERY | |  | 
| 1177     TOKEN_ASSIGN_PRIMARY, |  | 
| 1178     &hToken); |  | 
| 1179 |  | 
| 1180   if (!fRet) |  | 
| 1181   { |  | 
| 1182     goto CleanExit; |  | 
| 1183   } |  | 
| 1184 |  | 
| 1185   fRet = DuplicateTokenEx(hToken, |  | 
| 1186     0, |  | 
| 1187     NULL, |  | 
| 1188     SecurityImpersonation, |  | 
| 1189     TokenPrimary, |  | 
| 1190     &hNewToken); |  | 
| 1191 |  | 
| 1192   if (!fRet) |  | 
| 1193   { |  | 
| 1194     goto CleanExit; |  | 
| 1195   } |  | 
| 1196 |  | 
| 1197   fRet = ConvertStringSidToSid(wszIntegritySid, &pIntegritySid); |  | 
| 1198 |  | 
| 1199   if (!fRet) |  | 
| 1200   { |  | 
| 1201     goto CleanExit; |  | 
| 1202   } |  | 
| 1203 |  | 
| 1204 |  | 
| 1205   TIL.Label.Attributes = SE_GROUP_INTEGRITY; |  | 
| 1206   TIL.Label.Sid        = pIntegritySid; |  | 
| 1207 |  | 
| 1208 |  | 
| 1209   // |  | 
| 1210   // Set the process integrity level |  | 
| 1211   // |  | 
| 1212 |  | 
| 1213   fRet = SetTokenInformation(hNewToken, |  | 
| 1214     TokenIntegrityLevel, |  | 
| 1215     &TIL, |  | 
| 1216     sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)); |  | 
| 1217 |  | 
| 1218   if (!fRet) |  | 
| 1219   { |  | 
| 1220     goto CleanExit; |  | 
| 1221   } |  | 
| 1222 |  | 
| 1223   // |  | 
| 1224   // Create the new process at Low integrity |  | 
| 1225   // |  | 
| 1226 |  | 
| 1227   fRet  = CreateProcessAsUser(hNewToken, |  | 
| 1228     wszProcessName, |  | 
| 1229     cmdLine, |  | 
| 1230     NULL, |  | 
| 1231     NULL, |  | 
| 1232     FALSE, |  | 
| 1233     0, |  | 
| 1234     NULL, |  | 
| 1235     NULL, |  | 
| 1236     &StartupInfo, |  | 
| 1237     &ProcInfo); |  | 
| 1238 |  | 
| 1239 |  | 
| 1240 CleanExit: |  | 
| 1241 |  | 
| 1242   if (ProcInfo.hProcess != NULL) |  | 
| 1243   { |  | 
| 1244     CloseHandle(ProcInfo.hProcess); |  | 
| 1245   } |  | 
| 1246 |  | 
| 1247   if (ProcInfo.hThread != NULL) |  | 
| 1248   { |  | 
| 1249     CloseHandle(ProcInfo.hThread); |  | 
| 1250   } |  | 
| 1251 |  | 
| 1252   LocalFree(pIntegritySid); |  | 
| 1253 |  | 
| 1254   if (hNewToken != NULL) |  | 
| 1255   { |  | 
| 1256     CloseHandle(hNewToken); |  | 
| 1257   } |  | 
| 1258 |  | 
| 1259   if (hToken != NULL) |  | 
| 1260   { |  | 
| 1261     CloseHandle(hToken); |  | 
| 1262   } |  | 
| 1263 |  | 
| 1264   return fRet; |  | 
| 1265 } |  | 
| 1266 | 1175 | 
| 1267 void CPluginClass::DisplayPluginMenu(HMENU hMenu, int nToolbarCmdID, POINT pt, U
      INT nMenuFlags) | 1176 void CPluginClass::DisplayPluginMenu(HMENU hMenu, int nToolbarCmdID, POINT pt, U
      INT nMenuFlags) | 
| 1268 { | 1177 { | 
| 1269   CPluginClient* client = CPluginClient::GetInstance(); | 1178   CPluginClient* client = CPluginClient::GetInstance(); | 
| 1270 | 1179 | 
| 1271   // Create menu parent window | 1180   // Create menu parent window | 
| 1272   HWND hMenuWnd = ::CreateWindowEx( | 1181   HWND hMenuWnd = ::CreateWindowEx( | 
| 1273     NULL, | 1182     NULL, | 
| 1274     MAKEINTATOM(GetAtomPaneClass()), | 1183     MAKEINTATOM(GetAtomPaneClass()), | 
| 1275     L"", | 1184     L"", | 
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1375   // Invalidate and redraw the control | 1284   // Invalidate and redraw the control | 
| 1376   UpdateStatusBar(); | 1285   UpdateStatusBar(); | 
| 1377 } | 1286 } | 
| 1378 | 1287 | 
| 1379 | 1288 | 
| 1380 bool CPluginClass::SetMenuBar(HMENU hMenu, const std::wstring& url) | 1289 bool CPluginClass::SetMenuBar(HMENU hMenu, const std::wstring& url) | 
| 1381 { | 1290 { | 
| 1382   DEBUG_GENERAL("SetMenuBar"); | 1291   DEBUG_GENERAL("SetMenuBar"); | 
| 1383 | 1292 | 
| 1384   std::wstring ctext; | 1293   std::wstring ctext; | 
| 1385 |  | 
| 1386   s_criticalSectionLocal.Lock(); |  | 
| 1387   { |  | 
| 1388     s_menuDomains.clear(); |  | 
| 1389   } |  | 
| 1390   s_criticalSectionLocal.Unlock(); |  | 
| 1391 |  | 
| 1392   Dictionary* dictionary = Dictionary::GetInstance(); | 1294   Dictionary* dictionary = Dictionary::GetInstance(); | 
| 1393 | 1295 | 
| 1394   MENUITEMINFOW fmii; | 1296   MENUITEMINFOW fmii = {}; | 
| 1395   memset(&fmii, 0, sizeof(MENUITEMINFO)); | 1297   fmii.cbSize = sizeof(fmii); | 
| 1396   fmii.cbSize = sizeof(MENUITEMINFO); | 1298 | 
| 1397 | 1299   MENUITEMINFOW miiSep = {}; | 
| 1398   MENUITEMINFOW miiSep; | 1300   miiSep.cbSize = sizeof(miiSep); | 
| 1399   memset(&miiSep, 0, sizeof(MENUITEMINFO)); |  | 
| 1400   miiSep.cbSize = sizeof(MENUITEMINFO); |  | 
| 1401   miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; | 1301   miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; | 
| 1402   miiSep.fType = MFT_SEPARATOR; | 1302   miiSep.fType = MFT_SEPARATOR; | 
| 1403 | 1303 | 
| 1404   CPluginClient* client = CPluginClient::GetInstance(); | 1304   CPluginClient* client = CPluginClient::GetInstance(); | 
| 1405   CPluginSettings* settings = CPluginSettings::GetInstance(); | 1305   CPluginSettings* settings = CPluginSettings::GetInstance(); | 
| 1406   { | 1306   { | 
| 1407     ctext = dictionary->Lookup("menu", "menu-disable-on-site"); | 1307     ctext = dictionary->Lookup("menu", "menu-disable-on-site"); | 
| 1408     // Is domain in white list? | 1308     // Is domain in white list? | 
| 1409     ReplaceString(ctext, L"?1?", client->GetHostFromUrl(url)); | 1309     ReplaceString(ctext, L"?1?", client->GetHostFromUrl(url)); | 
| 1410     if (client->IsWhitelistedUrl(GetTab()->GetDocumentUrl())) | 1310     if (client->IsWhitelistedUrl(GetTab()->GetDocumentUrl())) | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1485   DWORD nProcessId; | 1385   DWORD nProcessId; | 
| 1486   ::GetWindowThreadProcessId(hWndToolBar, &nProcessId); | 1386   ::GetWindowThreadProcessId(hWndToolBar, &nProcessId); | 
| 1487 | 1387 | 
| 1488   if (hWndToolBar && ::GetCurrentProcessId() == nProcessId) | 1388   if (hWndToolBar && ::GetCurrentProcessId() == nProcessId) | 
| 1489   { | 1389   { | 
| 1490     ::ScreenToClient(hWndToolBar, &pt); | 1390     ::ScreenToClient(hWndToolBar, &pt); | 
| 1491     int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt); | 1391     int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt); | 
| 1492 | 1392 | 
| 1493     if (nButton > 0) | 1393     if (nButton > 0) | 
| 1494     { | 1394     { | 
| 1495       TBBUTTON pTBBtn; | 1395       TBBUTTON pTBBtn = {}; | 
| 1496       memset(&pTBBtn, 0, sizeof(TBBUTTON)); |  | 
| 1497 | 1396 | 
| 1498       if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn)) | 1397       if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn)) | 
| 1499       { | 1398       { | 
| 1500         RECT rcButton; | 1399         RECT rcButton; | 
| 1501         nIDCommand = pTBBtn.idCommand; | 1400         nIDCommand = pTBBtn.idCommand; | 
| 1502 | 1401 | 
| 1503         if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton)) | 1402         if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton)) | 
| 1504         { | 1403         { | 
| 1505           pt.x = rcButton.left; | 1404           pt.x = rcButton.left; | 
| 1506           pt.y = rcButton.bottom; | 1405           pt.y = rcButton.bottom; | 
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1624 | 1523 | 
| 1625 HICON CPluginClass::GetStatusBarIcon(const std::wstring& url) | 1524 HICON CPluginClass::GetStatusBarIcon(const std::wstring& url) | 
| 1626 { | 1525 { | 
| 1627   // use the disable icon as defualt, if the client doesn't exists | 1526   // use the disable icon as defualt, if the client doesn't exists | 
| 1628   HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); | 1527   HICON hIcon = GetIcon(ICON_PLUGIN_DEACTIVATED); | 
| 1629 | 1528 | 
| 1630   CPluginTab* tab = GetTab(::GetCurrentThreadId()); | 1529   CPluginTab* tab = GetTab(::GetCurrentThreadId()); | 
| 1631   if (tab) | 1530   if (tab) | 
| 1632   { | 1531   { | 
| 1633     CPluginClient* client = CPluginClient::GetInstance(); | 1532     CPluginClient* client = CPluginClient::GetInstance(); | 
| 1634     if (!CPluginSettings::GetInstance()->IsPluginEnabled()) | 1533     if (CPluginSettings::GetInstance()->IsPluginEnabled()) | 
| 1635     { | 1534     { | 
| 1636     } | 1535       if (client->IsWhitelistedUrl(url)) | 
| 1637     else if (client->IsWhitelistedUrl(url)) | 1536       { | 
| 1638     { | 1537         hIcon = GetIcon(ICON_PLUGIN_DISABLED); | 
| 1639       hIcon = GetIcon(ICON_PLUGIN_DISABLED); | 1538       } | 
| 1640     } | 1539       else | 
| 1641     else | 1540       { | 
| 1642     { | 1541         CPluginSettings* settings = CPluginSettings::GetInstance(); | 
| 1643       CPluginSettings* settings = CPluginSettings::GetInstance(); | 1542         hIcon = GetIcon(ICON_PLUGIN_ENABLED); | 
| 1644       hIcon = GetIcon(ICON_PLUGIN_ENABLED); | 1543       } | 
| 1645     } | 1544     } | 
| 1646   } | 1545   } | 
| 1647   return hIcon; | 1546   return hIcon; | 
| 1648 } | 1547 } | 
| 1649 | 1548 | 
| 1650 | 1549 | 
| 1651 LRESULT CALLBACK CPluginClass::PaneWindowProc(HWND hWnd, UINT message, WPARAM wP
      aram, LPARAM lParam) | 1550 LRESULT CALLBACK CPluginClass::PaneWindowProc(HWND hWnd, UINT message, WPARAM wP
      aram, LPARAM lParam) | 
| 1652 { | 1551 { | 
| 1653   // Find tab | 1552   // Find tab | 
| 1654   CPluginClass *pClass = FindInstance(GetParent(hWnd)); | 1553   CPluginClass *pClass = FindInstance(GetParent(hWnd)); | 
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1908   return icon; | 1807   return icon; | 
| 1909 } | 1808 } | 
| 1910 | 1809 | 
| 1911 ATOM CPluginClass::GetAtomPaneClass() | 1810 ATOM CPluginClass::GetAtomPaneClass() | 
| 1912 { | 1811 { | 
| 1913   return s_atomPaneClass; | 1812   return s_atomPaneClass; | 
| 1914 } | 1813 } | 
| 1915 | 1814 | 
| 1916 HWND CPluginClass::GetTabHWND() const | 1815 HWND CPluginClass::GetTabHWND() const | 
| 1917 { | 1816 { | 
| 1918   wchar_t szClassName[MAX_PATH]; | 1817   std::array<wchar_t, MAX_PATH> className; | 
| 1919   // Get browser window and url | 1818   // Get browser window and url | 
| 1920   HWND hBrowserWnd = GetBrowserHWND(); | 1819   HWND hBrowserWnd = GetBrowserHWND(); | 
| 1921   if (!hBrowserWnd) | 1820   if (!hBrowserWnd) | 
| 1922   { | 1821   { | 
| 1923     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C
      lass::GetTabWindow - No tab window") | 1822     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C
      lass::GetTabWindow - No tab window") | 
| 1924       s_criticalSectionWindow.Unlock(); | 1823       s_criticalSectionWindow.Unlock(); | 
| 1925 | 1824 | 
| 1926     return false; | 1825     return false; | 
| 1927   } | 1826   } | 
| 1928 | 1827 | 
| 1929   // Looking for a TabWindowClass window in IE7 | 1828   // Looking for a TabWindowClass window in IE7 | 
| 1930 | 1829 | 
| 1931   HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | 1830   HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); | 
| 1932   while (hTabWnd) | 1831   while (hTabWnd) | 
| 1933   { | 1832   { | 
| 1934     memset(szClassName, 0, MAX_PATH); | 1833     className[0] = L'\0'; | 
| 1935     GetClassName(hTabWnd, szClassName, MAX_PATH); | 1834     int classNameLength = GetClassNameW(hTabWnd, className.data(), className.siz
      e()); | 
| 1936 | 1835 | 
| 1937     if (wcscmp(szClassName, L"TabWindowClass") == 0 || wcscmp(szClassName, L"Fra
      me Tab") == 0) | 1836     if (classNameLength && (wcscmp(className.data(), L"TabWindowClass") == 0 || 
      wcscmp(className.data(), L"Frame Tab") == 0)) | 
| 1938     { | 1837     { | 
| 1939       // IE8 support | 1838       // IE8 support | 
| 1940       HWND hTabWnd2 = hTabWnd; | 1839       HWND hTabWnd2 = hTabWnd; | 
| 1941       if (wcscmp(szClassName, L"Frame Tab") == 0) | 1840       if (wcscmp(className.data(), L"Frame Tab") == 0) | 
| 1942       { | 1841       { | 
| 1943         hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); | 1842         hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); | 
| 1944       } | 1843       } | 
| 1945 | 1844 | 
| 1946       if (hTabWnd2) | 1845       if (hTabWnd2) | 
| 1947       { | 1846       { | 
| 1948         DWORD nProcessId; | 1847         DWORD nProcessId; | 
| 1949         ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); | 1848         ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); | 
| 1950         if (::GetCurrentProcessId() == nProcessId) | 1849         if (::GetCurrentProcessId() == nProcessId) | 
| 1951         { | 1850         { | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 1975         } | 1874         } | 
| 1976       } | 1875       } | 
| 1977     } | 1876     } | 
| 1978 | 1877 | 
| 1979     hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 1878     hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); | 
| 1980   } | 1879   } | 
| 1981 | 1880 | 
| 1982   return hTabWnd; | 1881   return hTabWnd; | 
| 1983 | 1882 | 
| 1984 } | 1883 } | 
| LEFT | RIGHT | 
|---|