| OLD | NEW | 
|---|
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" | 
| 2 | 2 | 
| 3 #include "PluginClient.h" | 3 #include "PluginClient.h" | 
| 4 #include "PluginSettings.h" | 4 #include "PluginSettings.h" | 
| 5 #include "PluginTab.h" | 5 #include "PluginTab.h" | 
| 6 #include "AdblockPlusDomTraverser.h" | 6 #include "AdblockPlusDomTraverser.h" | 
| 7 #include "PluginClass.h" | 7 #include "PluginClass.h" | 
| 8 #include "PluginTabBase.h" | 8 #include "PluginTabBase.h" | 
| 9 #include "PluginUtil.h" | 9 #include "PluginUtil.h" | 
| 10 #include <dispex.h> | 10 #include <dispex.h> | 
| 11 #include <Mshtmhst.h> | 11 #include <Mshtmhst.h> | 
|  | 12 #include "../shared/Utils.h" | 
| 12 | 13 | 
| 13 int CPluginTabBase::s_dictionaryVersion = 0; | 14 int CPluginTabBase::s_dictionaryVersion = 0; | 
| 14 int CPluginTabBase::s_settingsVersion = 1; | 15 int CPluginTabBase::s_settingsVersion = 1; | 
| 15 int CPluginTabBase::s_filterVersion = 0; | 16 int CPluginTabBase::s_filterVersion = 0; | 
| 16 int CPluginTabBase::s_whitelistVersion = 0; | 17 int CPluginTabBase::s_whitelistVersion = 0; | 
| 17 | 18 | 
| 18 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) | 19 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) | 
| 19   : m_plugin(plugin) | 20   : m_plugin(plugin) | 
| 20   , m_isActivated(false) | 21   , m_isActivated(false) | 
| 21   , m_continueThreadRunning(true) | 22   , m_continueThreadRunning(true) | 
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 108   } | 109   } | 
| 109   DEBUG_GENERAL(L"Going to inject"); | 110   DEBUG_GENERAL(L"Going to inject"); | 
| 110   CComPtr<IDispatch> pDocDispatch; | 111   CComPtr<IDispatch> pDocDispatch; | 
| 111   browser->get_Document(&pDocDispatch); | 112   browser->get_Document(&pDocDispatch); | 
| 112   CComQIPtr<IHTMLDocument2> pDoc2 = pDocDispatch; | 113   CComQIPtr<IHTMLDocument2> pDoc2 = pDocDispatch; | 
| 113   if (!pDoc2) | 114   if (!pDoc2) | 
| 114   { | 115   { | 
| 115     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
     ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to QI docume
     nt"); | 116     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
     ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to QI docume
     nt"); | 
| 116     return; | 117     return; | 
| 117   } | 118   } | 
|  | 119 | 
| 118   CComPtr<IHTMLWindow2> pWnd2; | 120   CComPtr<IHTMLWindow2> pWnd2; | 
| 119   pDoc2->get_parentWindow(&pWnd2); | 121   pDoc2->get_parentWindow(&pWnd2); | 
| 120   if (!pWnd2) | 122   if (!pWnd2) | 
| 121   { | 123   { | 
| 122     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
     ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to get paren
     t window"); | 124     DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
     ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to get paren
     t window"); | 
| 123     return; | 125     return; | 
| 124   } | 126   } | 
| 125   CComQIPtr<IDispatchEx> pWndEx = pWnd2; | 127   CComQIPtr<IDispatchEx> pWndEx = pWnd2; | 
| 126   if (!pWndEx) | 128   if (!pWndEx) | 
| 127   { | 129   { | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 147   params.rgvarg = &var; | 149   params.rgvarg = &var; | 
| 148   params.rgdispidNamedArgs = 0; | 150   params.rgdispidNamedArgs = 0; | 
| 149   hr = pWndEx->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPU
     T | DISPATCH_PROPERTYPUTREF, ¶ms, 0, 0, 0); | 151   hr = pWndEx->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPU
     T | DISPATCH_PROPERTYPUTREF, ¶ms, 0, 0, 0); | 
| 150   DEBUG_GENERAL("Invoke"); | 152   DEBUG_GENERAL("Invoke"); | 
| 151   if (FAILED(hr)) | 153   if (FAILED(hr)) | 
| 152   { | 154   { | 
| 153     DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CR
     EATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to create S
     ettings in JavaScript"); | 155     DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CR
     EATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to create S
     ettings in JavaScript"); | 
| 154   } | 156   } | 
| 155 } | 157 } | 
| 156 | 158 | 
|  | 159 bool CPluginTabBase::IsTraverserEnabled() | 
|  | 160 { | 
|  | 161   return !IsCSSInjectionEnabled(); | 
|  | 162 } | 
|  | 163 | 
|  | 164 bool CPluginTabBase::IsCSSInjectionEnabled() | 
|  | 165 { | 
|  | 166   return IsWindowsVistaOrLater() && CPluginClient::GetInstance()->GetIEVersion()
      >= 10; | 
|  | 167 } | 
|  | 168 | 
|  | 169 namespace | 
|  | 170 { | 
|  | 171   void InjectABPCSS(IHTMLDocument2& htmlDocument2, const std::vector<std::wstrin
     g>& hideFilters) | 
|  | 172   { | 
|  | 173     ATL::CComPtr<IHTMLElement> stylePureHtmlElement; | 
|  | 174     ATL::CComQIPtr<IHTMLStyleElement> styleHtmlElement; | 
|  | 175     if (FAILED(htmlDocument2.createElement(ATL::CComBSTR(L"style"), &stylePureHt
     mlElement))) | 
|  | 176     { | 
|  | 177       DEBUG_GENERAL(L"Cannot create style element"); | 
|  | 178       return; | 
|  | 179     } | 
|  | 180     if (!(styleHtmlElement = stylePureHtmlElement)) | 
|  | 181     { | 
|  | 182       DEBUG_GENERAL(L"Cannot obtain IHTMLStyleElement from IHTMLElement"); | 
|  | 183       return; | 
|  | 184     } | 
|  | 185     if (FAILED(styleHtmlElement->put_type(ATL::CComBSTR("text/css")))) | 
|  | 186     { | 
|  | 187       DEBUG_GENERAL(L"Cannot set type text/css"); | 
|  | 188       return; | 
|  | 189     } | 
|  | 190     ATL::CComQIPtr<IHTMLStyleSheet> styleSheet; | 
|  | 191     // IHTMLStyleElement2 is availabe starting from IE9, Vista | 
|  | 192     ATL::CComQIPtr<IHTMLStyleElement2> styleHtmlElement2 = styleHtmlElement; | 
|  | 193     if (!styleHtmlElement2) | 
|  | 194     { | 
|  | 195       DEBUG_GENERAL(L"Cannot obtain IHTMLStyleElement2 from IHTMLStyleElement"); | 
|  | 196       return; | 
|  | 197     } | 
|  | 198     if (FAILED(styleHtmlElement2->get_sheet(&styleSheet)) || !styleSheet) | 
|  | 199     { | 
|  | 200       DEBUG_GENERAL(L"Cannot obtain IHTMLStyleSheet"); | 
|  | 201       return; | 
|  | 202     } | 
|  | 203     // IHTMLStyleSheet4 is availabe starting from IE9, Vista | 
|  | 204     ATL::CComQIPtr<IHTMLStyleSheet4> styleSheet4 = styleSheet; | 
|  | 205     if (!styleSheet4) | 
|  | 206     { | 
|  | 207       DEBUG_GENERAL(L"Cannot obtain IHTMLStyleSheet4"); | 
|  | 208       return; | 
|  | 209     } | 
|  | 210     long newIndex = 0; | 
|  | 211     std::wstring cssValue = L"{ display: none !important; }"; | 
|  | 212     for (const auto& selector : hideFilters) | 
|  | 213     { | 
|  | 214       auto cssRule = selector + cssValue; | 
|  | 215       ATL::CComBSTR selector(cssRule.size(), cssRule.c_str()); | 
|  | 216       if (SUCCEEDED(styleSheet4->insertRule(selector, newIndex, &newIndex))) | 
|  | 217       { | 
|  | 218         ++newIndex; | 
|  | 219       } | 
|  | 220       else | 
|  | 221       { | 
|  | 222         DEBUG_GENERAL(ToCString(L"Cannot add rule for selector " + cssRule)); | 
|  | 223       } | 
|  | 224     } | 
|  | 225 | 
|  | 226     ATL::CComQIPtr<IHTMLDOMNode> styleNode = stylePureHtmlElement; | 
|  | 227     if (!styleNode) | 
|  | 228     { | 
|  | 229       DEBUG_GENERAL(L"Cannot obtain IHTMLDOMNode from stylePureHtmlElement"); | 
|  | 230       return; | 
|  | 231     } | 
|  | 232     ATL::CComPtr<IHTMLElement> headHtmlElement; | 
|  | 233     // IHTMLDocument7 is availabe starting from IE9, Vista | 
|  | 234     ATL::CComQIPtr<IHTMLDocument7> htmlDocument7 = &htmlDocument2; | 
|  | 235     if (!htmlDocument7) | 
|  | 236     { | 
|  | 237       DEBUG_GENERAL(L"Cannot obtain IHTMLDocument7 from htmlDocument2"); | 
|  | 238       return; | 
|  | 239     } | 
|  | 240     if (FAILED(htmlDocument7->get_head(&headHtmlElement))) | 
|  | 241     { | 
|  | 242       DEBUG_GENERAL(L"Cannot obtain head from pDoc7"); | 
|  | 243       return; | 
|  | 244     } | 
|  | 245     ATL::CComQIPtr<IHTMLDOMNode> headNode = headHtmlElement; | 
|  | 246     if (!headNode) | 
|  | 247     { | 
|  | 248       DEBUG_GENERAL(L"Cannot obtain headNode from headHtmlElement"); | 
|  | 249       return; | 
|  | 250     } | 
|  | 251     if (FAILED(headNode->appendChild(styleNode, nullptr))) | 
|  | 252     { | 
|  | 253       DEBUG_GENERAL(L"Cannot append blocking style"); | 
|  | 254     } | 
|  | 255   } | 
|  | 256 } | 
|  | 257 | 
| 157 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) | 258 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) | 
| 158 { | 259 { | 
| 159   CPluginClient* client = CPluginClient::GetInstance(); | 260   if (IsTraverserEnabled()) | 
| 160   std::wstring url = to_wstring(GetDocumentUrl()); |  | 
| 161   if (!client->IsWhitelistedUrl(url) && !client->IsElemhideWhitelistedOnDomain(u
     rl)) |  | 
| 162   { | 261   { | 
| 163     m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl()
     ); | 262     CPluginClient* client = CPluginClient::GetInstance(); | 
|  | 263     std::wstring url = to_wstring(GetDocumentUrl()); | 
|  | 264     if (!client->IsWhitelistedUrl(url) && !client->IsElemhideWhitelistedOnDomain
     (url)) | 
|  | 265     { | 
|  | 266       m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl
     ()); | 
|  | 267     } | 
| 164   } | 268   } | 
| 165   InjectABP(browser); | 269   InjectABP(browser); | 
| 166 } | 270 } | 
| 167 | 271 | 
| 168 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const CString& ur
     l, bool isDocumentBrowser) | 272 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const CString& ur
     l, bool isDocumentBrowser) | 
| 169 { | 273 { | 
| 170   CString documentUrl = GetDocumentUrl(); | 274   CString documentUrl = GetDocumentUrl(); | 
| 171 | 275 | 
| 172   if (isDocumentBrowser) | 276   if (isDocumentBrowser) | 
| 173   { | 277   { | 
| 174     if (url != documentUrl) | 278     if (url != documentUrl) | 
| 175     { | 279     { | 
| 176       SetDocumentUrl(url); | 280       SetDocumentUrl(url); | 
| 177     } | 281     } | 
| 178     InjectABP(browser); | 282     InjectABP(browser); | 
| 179   } | 283   } | 
| 180   if (url.Left(6) != "res://") | 284   if (url.Left(6) == "res://") | 
| 181   { | 285   { | 
| 182     // Get document | 286     return; | 
| 183     CComPtr<IDispatch> pDocDispatch; | 287   } | 
| 184     HRESULT hr = browser->get_Document(&pDocDispatch); | 288   // Get document | 
| 185     if (FAILED(hr) || !pDocDispatch) | 289   ATL::CComPtr<IDispatch> pDocDispatch; | 
|  | 290   HRESULT hr = browser->get_Document(&pDocDispatch); | 
|  | 291   if (FAILED(hr) || !pDocDispatch) | 
|  | 292   { | 
|  | 293     return; | 
|  | 294   } | 
|  | 295 | 
|  | 296   ATL::CComQIPtr<IHTMLDocument2> pDoc = pDocDispatch; | 
|  | 297   if (!pDoc) | 
|  | 298   { | 
|  | 299     return; | 
|  | 300   } | 
|  | 301 | 
|  | 302   if (IsCSSInjectionEnabled()) | 
|  | 303   { | 
|  | 304     DEBUG_GENERAL(ToCString(L"Inject CSS into ") + url); | 
|  | 305     InjectABPCSS(*pDoc, m_filter->getHideFilters()); | 
|  | 306   } | 
|  | 307 | 
|  | 308   ATL::CComPtr<IOleObject> pOleObj; | 
|  | 309   pDocDispatch->QueryInterface(IID_IOleObject, (void**)&pOleObj); | 
|  | 310 | 
|  | 311   CComPtr<IOleClientSite> pClientSite; | 
|  | 312   pOleObj->GetClientSite(&pClientSite); | 
|  | 313   if (pClientSite != NULL) | 
|  | 314   { | 
|  | 315     CComPtr<IDocHostUIHandler> docHostUIHandler; | 
|  | 316     pClientSite->QueryInterface(IID_IDocHostUIHandler, (void**)&docHostUIHandler
     ); | 
|  | 317     if (docHostUIHandler != NULL) | 
| 186     { | 318     { | 
| 187       return; | 319       docHostUIHandler->UpdateUI(); | 
| 188     } |  | 
| 189 |  | 
| 190     CComQIPtr<IHTMLDocument2> pDoc = pDocDispatch; |  | 
| 191     if (!pDoc) |  | 
| 192     { |  | 
| 193       return; |  | 
| 194     } |  | 
| 195     CComPtr<IOleObject> pOleObj; |  | 
| 196 |  | 
| 197     pDocDispatch->QueryInterface(IID_IOleObject, (void**)&pOleObj); |  | 
| 198 |  | 
| 199 |  | 
| 200     CComPtr<IOleClientSite> pClientSite; |  | 
| 201     pOleObj->GetClientSite(&pClientSite); |  | 
| 202     if (pClientSite != NULL) |  | 
| 203     { |  | 
| 204       CComPtr<IDocHostUIHandler> docHostUIHandler; |  | 
| 205       pClientSite->QueryInterface(IID_IDocHostUIHandler, (void**)&docHostUIHandl
     er); |  | 
| 206       if (docHostUIHandler != NULL) |  | 
| 207       { |  | 
| 208         docHostUIHandler->UpdateUI(); |  | 
| 209       } |  | 
| 210     } | 320     } | 
| 211   } | 321   } | 
| 212 } | 322 } | 
| 213 | 323 | 
| 214 std::wstring CPluginTabBase::GetDocumentDomain() | 324 std::wstring CPluginTabBase::GetDocumentDomain() | 
| 215 { | 325 { | 
| 216   std::wstring domain; | 326   std::wstring domain; | 
| 217 | 327 | 
| 218   m_criticalSection.Lock(); | 328   m_criticalSection.Lock(); | 
| 219   { | 329   { | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 347           CPluginClient::LogPluginError(pluginError.GetErrorCode(), pluginError.
     GetErrorId(), pluginError.GetErrorSubid(), pluginError.GetErrorDescription(), tr
     ue, pluginError.GetProcessId(), pluginError.GetThreadId()); | 457           CPluginClient::LogPluginError(pluginError.GetErrorCode(), pluginError.
     GetErrorId(), pluginError.GetErrorSubid(), pluginError.GetErrorDescription(), tr
     ue, pluginError.GetProcessId(), pluginError.GetThreadId()); | 
| 348         } | 458         } | 
| 349 | 459 | 
| 350         // Non-hanging sleep | 460         // Non-hanging sleep | 
| 351         Sleep(50); | 461         Sleep(50); | 
| 352       } | 462       } | 
| 353 | 463 | 
| 354       tabLoopIteration++; | 464       tabLoopIteration++; | 
| 355   } | 465   } | 
| 356 } | 466 } | 
| OLD | NEW | 
|---|