| 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 |