| LEFT | RIGHT | 
|---|
| 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 #ifdef SUPPORT_CONFIG |  | 
| 6 #include "PluginConfig.h" |  | 
| 7 #endif |  | 
| 8 #include "PluginTab.h" | 5 #include "PluginTab.h" | 
| 9 #include "PluginDomTraverser.h" | 6 #include "AdblockPlusDomTraverser.h" | 
| 10 #include "PluginClass.h" | 7 #include "PluginClass.h" | 
| 11 |  | 
| 12 #include "PluginTabBase.h" | 8 #include "PluginTabBase.h" | 
| 13 #include "PluginUtil.h" | 9 #include "PluginUtil.h" | 
| 14 #include "../shared/IE_version.h" | 10 #include "../shared/IE_version.h" | 
| 15 #include <dispex.h> | 11 #include <dispex.h> | 
| 16 #include <Mshtmhst.h> | 12 #include <Mshtmhst.h> | 
| 17 | 13 | 
| 18 int CPluginTabBase::s_dictionaryVersion = 0; | 14 int CPluginTabBase::s_dictionaryVersion = 0; | 
| 19 int CPluginTabBase::s_settingsVersion = 1; | 15 int CPluginTabBase::s_settingsVersion = 1; | 
| 20 #ifdef SUPPORT_FILTER |  | 
| 21 int CPluginTabBase::s_filterVersion = 0; | 16 int CPluginTabBase::s_filterVersion = 0; | 
| 22 #endif |  | 
| 23 #ifdef SUPPORT_WHITELIST |  | 
| 24 int CPluginTabBase::s_whitelistVersion = 0; | 17 int CPluginTabBase::s_whitelistVersion = 0; | 
| 25 #endif |  | 
| 26 #ifdef SUPPORT_CONFIG |  | 
| 27 int CPluginTabBase::s_configVersion = 0; |  | 
| 28 #endif |  | 
| 29 |  | 
| 30 | 18 | 
| 31 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) | 19 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) | 
| 32   : m_plugin(plugin) | 20   : m_plugin(plugin) | 
| 33   , m_isActivated(false) | 21   , m_isActivated(false) | 
| 34   , m_continueThreadRunning(true) | 22   , m_continueThreadRunning(true) | 
| 35 { | 23 { | 
| 36   m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); | 24   m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); | 
| 37   m_filter->hideFiltersLoadedEvent = CreateEvent(NULL, true, false, NULL); | 25   m_filter->hideFiltersLoadedEvent = CreateEvent(NULL, true, false, NULL); | 
| 38 | 26 | 
| 39   CPluginClient* client = CPluginClient::GetInstance(); | 27   CPluginClient* client = CPluginClient::GetInstance(); | 
| 40   if (AdblockPlus::IE::InstalledMajorVersion() < 10) | 28   if (AdblockPlus::IE::InstalledMajorVersion() < 10) | 
| 41   { | 29   { | 
| 42     m_isActivated = true; | 30     m_isActivated = true; | 
| 43   } | 31   } | 
| 44 | 32 | 
| 45   try | 33   try | 
| 46   { | 34   { | 
| 47     m_thread = std::thread(&CPluginTabBase::ThreadProc, this); | 35     m_thread = std::thread(&CPluginTabBase::ThreadProc, this); | 
| 48   } | 36   } | 
| 49   catch (const std::system_error& ex) | 37   catch (const std::system_error& ex) | 
| 50   { | 38   { | 
| 51     auto errDescription = std::string("Tab::Thread - Failed to create tab thread
     ") + | 39     auto errDescription = std::string("Tab::Thread - Failed to create tab thread
     ") + | 
| 52                 ex.code().message() + ex.what(); | 40                 ex.code().message() + ex.what(); | 
| 53     DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_TAB_THR
     EAD_CREATE_PROCESS, errDescription.c_str()); | 41     DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_TAB_THR
     EAD_CREATE_PROCESS, errDescription.c_str()); | 
| 54   } | 42   } | 
| 55 |  | 
| 56 #ifdef SUPPORT_DOM_TRAVERSER |  | 
| 57   m_traverser = new CPluginDomTraverser(static_cast<CPluginTab*>(this)); | 43   m_traverser = new CPluginDomTraverser(static_cast<CPluginTab*>(this)); | 
| 58 #endif // SUPPORT_DOM_TRAVERSER |  | 
| 59 } | 44 } | 
| 60 | 45 | 
| 61 | 46 | 
| 62 CPluginTabBase::~CPluginTabBase() | 47 CPluginTabBase::~CPluginTabBase() | 
| 63 { | 48 { | 
| 64 #ifdef SUPPORT_DOM_TRAVERSER |  | 
| 65   delete m_traverser; | 49   delete m_traverser; | 
| 66   m_traverser = NULL; | 50   m_traverser = NULL; | 
| 67 #endif // SUPPORT_DOM_TRAVERSER |  | 
| 68 |  | 
| 69   m_continueThreadRunning = false; | 51   m_continueThreadRunning = false; | 
| 70   if (m_thread.joinable()) { | 52   if (m_thread.joinable()) { | 
| 71     m_thread.join(); | 53     m_thread.join(); | 
| 72   } | 54   } | 
| 73 } | 55 } | 
| 74 | 56 | 
| 75 void CPluginTabBase::OnActivate() | 57 void CPluginTabBase::OnActivate() | 
| 76 { | 58 { | 
| 77   m_isActivated = true; | 59   m_isActivated = true; | 
| 78 } | 60 } | 
| 79 | 61 | 
| 80 | 62 | 
| 81 void CPluginTabBase::OnUpdate() | 63 void CPluginTabBase::OnUpdate() | 
| 82 { | 64 { | 
| 83   m_isActivated = true; | 65   m_isActivated = true; | 
| 84 } | 66 } | 
| 85 | 67 | 
| 86 namespace | 68 namespace | 
| 87 { | 69 { | 
| 88   void FilterLoader(CPluginTabBase* tabBase) | 70   void FilterLoader(CPluginTabBase* tabBase) | 
| 89   { | 71   { | 
| 90     tabBase->m_filter->LoadHideFilters(CPluginClient::GetInstance()->GetElementH
     idingSelectors(tabBase->GetDocumentDomain().GetString())); | 72     tabBase->m_filter->LoadHideFilters(CPluginClient::GetInstance()->GetElementH
     idingSelectors(tabBase->GetDocumentDomain())); | 
| 91     SetEvent(tabBase->m_filter->hideFiltersLoadedEvent); | 73     SetEvent(tabBase->m_filter->hideFiltersLoadedEvent); | 
| 92   } | 74   } | 
| 93 } | 75 } | 
| 94 | 76 | 
| 95 void CPluginTabBase::OnNavigate(const CString& url) | 77 void CPluginTabBase::OnNavigate(const CString& url) | 
| 96 { | 78 { | 
| 97   SetDocumentUrl(url); | 79   SetDocumentUrl(url); | 
| 98 |  | 
| 99 |  | 
| 100 #ifdef SUPPORT_FRAME_CACHING |  | 
| 101   ClearFrameCache(GetDocumentDomain()); | 80   ClearFrameCache(GetDocumentDomain()); | 
| 102 #endif |  | 
| 103 |  | 
| 104   std::wstring domainString = GetDocumentDomain(); | 81   std::wstring domainString = GetDocumentDomain(); | 
| 105   ResetEvent(m_filter->hideFiltersLoadedEvent); | 82   ResetEvent(m_filter->hideFiltersLoadedEvent); | 
| 106   try | 83   try | 
| 107   { | 84   { | 
| 108     std::thread filterLoaderThread(&FilterLoader, this); | 85     std::thread filterLoaderThread(&FilterLoader, this); | 
| 109     filterLoaderThread.detach(); // TODO: but actually we should wait for the th
     read in the dtr. | 86     filterLoaderThread.detach(); // TODO: but actually we should wait for the th
     read in the dtr. | 
| 110   } | 87   } | 
| 111   catch (const std::system_error& ex) | 88   catch (const std::system_error& ex) | 
| 112   { | 89   { | 
| 113     auto errDescription = std::string("Class::Thread - Failed to start filter lo
     ader thread, ") + | 90     auto errDescription = std::string("Class::Thread - Failed to start filter lo
     ader thread, ") + | 
| 114       ex.code().message() + ex.what(); | 91       ex.code().message() + ex.what(); | 
| 115     DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
     READ_CREATE_PROCESS, errDescription.c_str()); | 92     DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
     READ_CREATE_PROCESS, errDescription.c_str()); | 
| 116   } | 93   } | 
| 117 |  | 
| 118 #ifdef SUPPORT_DOM_TRAVERSER |  | 
| 119   m_traverser->ClearCache(); | 94   m_traverser->ClearCache(); | 
| 120 #endif |  | 
| 121 } | 95 } | 
| 122 | 96 | 
| 123 void CPluginTabBase::InjectABP(IWebBrowser2* browser) | 97 void CPluginTabBase::InjectABP(IWebBrowser2* browser) | 
| 124 { | 98 { | 
| 125   CriticalSection::Lock lock(m_csInject); | 99   CriticalSection::Lock lock(m_csInject); | 
| 126   CString url = GetDocumentUrl(); | 100   CString url = GetDocumentUrl(); | 
| 127   CString log; | 101   CString log; | 
| 128   log.Format(L"InjectABP. Current URL: %s, settings URL: %s", url, UserSettingsF
     ileUrl().c_str()); | 102   log.Format(L"InjectABP. Current URL: %s, settings URL: %s", url, UserSettingsF
     ileUrl().c_str()); | 
| 129   DEBUG_GENERAL(log); | 103   DEBUG_GENERAL(log); | 
| 130   if (!(0 == url.CompareNoCase(CString(UserSettingsFileUrl().c_str())) || | 104   if (!(0 == url.CompareNoCase(CString(UserSettingsFileUrl().c_str())) || | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 176   hr = pWndEx->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPU
     T | DISPATCH_PROPERTYPUTREF, ¶ms, 0, 0, 0); | 150   hr = pWndEx->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPU
     T | DISPATCH_PROPERTYPUTREF, ¶ms, 0, 0, 0); | 
| 177   DEBUG_GENERAL("Invoke"); | 151   DEBUG_GENERAL("Invoke"); | 
| 178   if (FAILED(hr)) | 152   if (FAILED(hr)) | 
| 179   { | 153   { | 
| 180     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     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"); | 
| 181   } | 155   } | 
| 182 } | 156 } | 
| 183 | 157 | 
| 184 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) | 158 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) | 
| 185 { | 159 { | 
| 186 #ifdef SUPPORT_DOM_TRAVERSER | 160   CPluginClient* client = CPluginClient::GetInstance(); | 
| 187   if (!CPluginClient::GetInstance()->IsWhitelistedUrl(std::wstring(GetDocumentUr
     l()))) | 161   std::wstring url = to_wstring(GetDocumentUrl()); | 
|  | 162   if (!client->IsWhitelistedUrl(url) && !client->IsElemhideWhitelistedOnDomain(u
     rl)) | 
| 188   { | 163   { | 
| 189     m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl()
     ); | 164     m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl()
     ); | 
| 190   } | 165   } | 
| 191 #endif // SUPPORT_DOM_TRAVERSER |  | 
| 192 |  | 
| 193   InjectABP(browser); | 166   InjectABP(browser); | 
| 194 } | 167 } | 
| 195 | 168 | 
| 196 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const CString& ur
     l, bool isDocumentBrowser) | 169 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const CString& ur
     l, bool isDocumentBrowser) | 
| 197 { | 170 { | 
| 198   CString documentUrl = GetDocumentUrl(); | 171   CString documentUrl = GetDocumentUrl(); | 
| 199 | 172 | 
| 200   if (isDocumentBrowser) | 173   if (isDocumentBrowser) | 
| 201   { | 174   { | 
| 202     if (url != documentUrl) | 175     if (url != documentUrl) | 
| 203     { | 176     { | 
| 204       SetDocumentUrl(url); | 177       SetDocumentUrl(url); | 
| 205     } | 178     } | 
| 206     InjectABP(browser); | 179     InjectABP(browser); | 
| 207   } | 180   } | 
| 208 |  | 
| 209 #ifdef SUPPORT_DOM_TRAVERSER |  | 
| 210   if (url.Left(6) != "res://") | 181   if (url.Left(6) != "res://") | 
| 211   { | 182   { | 
| 212     // Get document | 183     // Get document | 
| 213     CComPtr<IDispatch> pDocDispatch; | 184     CComPtr<IDispatch> pDocDispatch; | 
| 214     HRESULT hr = browser->get_Document(&pDocDispatch); | 185     HRESULT hr = browser->get_Document(&pDocDispatch); | 
| 215     if (FAILED(hr) || !pDocDispatch) | 186     if (FAILED(hr) || !pDocDispatch) | 
| 216     { | 187     { | 
| 217       return; | 188       return; | 
| 218     } | 189     } | 
| 219 | 190 | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 231     pOleObj->GetClientSite(&pClientSite); | 202     pOleObj->GetClientSite(&pClientSite); | 
| 232     if (pClientSite != NULL) | 203     if (pClientSite != NULL) | 
| 233     { | 204     { | 
| 234       CComPtr<IDocHostUIHandler> docHostUIHandler; | 205       CComPtr<IDocHostUIHandler> docHostUIHandler; | 
| 235       pClientSite->QueryInterface(IID_IDocHostUIHandler, (void**)&docHostUIHandl
     er); | 206       pClientSite->QueryInterface(IID_IDocHostUIHandler, (void**)&docHostUIHandl
     er); | 
| 236       if (docHostUIHandler != NULL) | 207       if (docHostUIHandler != NULL) | 
| 237       { | 208       { | 
| 238         docHostUIHandler->UpdateUI(); | 209         docHostUIHandler->UpdateUI(); | 
| 239       } | 210       } | 
| 240     } | 211     } | 
| 241 | 212   } | 
| 242     pDoc.Release(); | 213 } | 
| 243     pDocDispatch.Release(); | 214 | 
| 244   } | 215 std::wstring CPluginTabBase::GetDocumentDomain() | 
| 245 #endif | 216 { | 
| 246 } | 217   std::wstring domain; | 
| 247 |  | 
| 248 CString CPluginTabBase::GetDocumentDomain() |  | 
| 249 { |  | 
| 250   CString domain; |  | 
| 251 | 218 | 
| 252   m_criticalSection.Lock(); | 219   m_criticalSection.Lock(); | 
| 253   { | 220   { | 
| 254     domain = m_documentDomain; | 221     domain = m_documentDomain; | 
| 255   } | 222   } | 
| 256   m_criticalSection.Unlock(); | 223   m_criticalSection.Unlock(); | 
| 257 | 224 | 
| 258   return domain; | 225   return domain; | 
| 259 } | 226 } | 
| 260 | 227 | 
| 261 void CPluginTabBase::SetDocumentUrl(const CString& url) | 228 void CPluginTabBase::SetDocumentUrl(const CString& url) | 
| 262 { | 229 { | 
| 263   m_criticalSection.Lock(); | 230   m_criticalSection.Lock(); | 
| 264   { | 231   { | 
| 265     m_documentUrl = url; | 232     m_documentUrl = url; | 
| 266     m_documentDomain = CString(CAdblockPlusClient::GetInstance()->GetHostFromUrl
     (url.GetString()).c_str()); | 233     m_documentDomain = CAdblockPlusClient::GetInstance()->GetHostFromUrl(to_wstr
     ing(url)); | 
| 267   } | 234   } | 
| 268   m_criticalSection.Unlock(); | 235   m_criticalSection.Unlock(); | 
| 269 } | 236 } | 
| 270 | 237 | 
| 271 CString CPluginTabBase::GetDocumentUrl() | 238 CString CPluginTabBase::GetDocumentUrl() | 
| 272 { | 239 { | 
| 273   CString url; | 240   CString url; | 
| 274 | 241 | 
| 275   m_criticalSection.Lock(); | 242   m_criticalSection.Lock(); | 
| 276   { | 243   { | 
| 277     url = m_documentUrl; | 244     url = m_documentUrl; | 
| 278   } | 245   } | 
| 279   m_criticalSection.Unlock(); | 246   m_criticalSection.Unlock(); | 
| 280 | 247 | 
| 281   return url; | 248   return url; | 
| 282 } | 249 } | 
| 283 | 250 | 
| 284 | 251 | 
| 285 // ============================================================================ | 252 // ============================================================================ | 
| 286 // Frame caching | 253 // Frame caching | 
| 287 // ============================================================================ | 254 // ============================================================================ | 
| 288 |  | 
| 289 #ifdef SUPPORT_FRAME_CACHING |  | 
| 290 |  | 
| 291 bool CPluginTabBase::IsFrameCached(const CString& url) | 255 bool CPluginTabBase::IsFrameCached(const CString& url) | 
| 292 { | 256 { | 
| 293   bool isFrame; | 257   bool isFrame; | 
| 294 | 258 | 
| 295   m_criticalSectionCache.Lock(); | 259   m_criticalSectionCache.Lock(); | 
| 296   { | 260   { | 
| 297     isFrame = m_cacheFrames.find(url) != m_cacheFrames.end(); | 261     isFrame = m_cacheFrames.find(url) != m_cacheFrames.end(); | 
| 298   } | 262   } | 
| 299   m_criticalSectionCache.Unlock(); | 263   m_criticalSectionCache.Unlock(); | 
| 300 | 264 | 
| 301   return isFrame; | 265   return isFrame; | 
| 302 } | 266 } | 
| 303 | 267 | 
| 304 void CPluginTabBase::CacheFrame(const CString& url) | 268 void CPluginTabBase::CacheFrame(const CString& url) | 
| 305 { | 269 { | 
| 306   m_criticalSectionCache.Lock(); | 270   m_criticalSectionCache.Lock(); | 
| 307   { | 271   { | 
| 308     m_cacheFrames.insert(url); | 272     m_cacheFrames.insert(url); | 
| 309   } | 273   } | 
| 310   m_criticalSectionCache.Unlock(); | 274   m_criticalSectionCache.Unlock(); | 
| 311 } | 275 } | 
| 312 | 276 | 
| 313 void CPluginTabBase::ClearFrameCache(const CString& domain) | 277 void CPluginTabBase::ClearFrameCache(const std::wstring& domain) | 
| 314 { | 278 { | 
| 315   m_criticalSectionCache.Lock(); | 279   m_criticalSectionCache.Lock(); | 
| 316   { | 280   { | 
| 317     if (domain.IsEmpty() || domain != m_cacheDomain) | 281     if (domain.empty() || domain != m_cacheDomain) | 
| 318     { | 282     { | 
| 319       m_cacheFrames.clear(); | 283       m_cacheFrames.clear(); | 
| 320       m_cacheDomain = domain; | 284       m_cacheDomain = domain; | 
| 321     } | 285     } | 
| 322   } | 286   } | 
| 323   m_criticalSectionCache.Unlock(); | 287   m_criticalSectionCache.Unlock(); | 
| 324 } | 288 } | 
| 325 |  | 
| 326 #endif // SUPPORT_FRAME_CACHING |  | 
| 327 |  | 
| 328 | 289 | 
| 329 void CPluginTabBase::ThreadProc() | 290 void CPluginTabBase::ThreadProc() | 
| 330 { | 291 { | 
| 331   // Force loading/creation of settings | 292   // Force loading/creation of settings | 
| 332   CPluginSettings* settings = CPluginSettings::GetInstance(); | 293   CPluginSettings* settings = CPluginSettings::GetInstance(); | 
| 333 | 294 | 
| 334   settings->SetWorkingThreadId(); | 295   settings->SetWorkingThreadId(); | 
| 335 | 296 | 
| 336   CString threadInfo; | 297   CString threadInfo; | 
| 337   threadInfo.Format(L"%d.%d", ::GetCurrentProcessId(), ::GetCurrentThreadId()); | 298   threadInfo.Format(L"%d.%d", ::GetCurrentProcessId(), ::GetCurrentThreadId()); | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 387           CPluginClient::LogPluginError(pluginError.GetErrorCode(), pluginError.
     GetErrorId(), pluginError.GetErrorSubid(), pluginError.GetErrorDescription(), tr
     ue, pluginError.GetProcessId(), pluginError.GetThreadId()); | 348           CPluginClient::LogPluginError(pluginError.GetErrorCode(), pluginError.
     GetErrorId(), pluginError.GetErrorSubid(), pluginError.GetErrorDescription(), tr
     ue, pluginError.GetProcessId(), pluginError.GetThreadId()); | 
| 388         } | 349         } | 
| 389 | 350 | 
| 390         // Non-hanging sleep | 351         // Non-hanging sleep | 
| 391         Sleep(50); | 352         Sleep(50); | 
| 392       } | 353       } | 
| 393 | 354 | 
| 394       tabLoopIteration++; | 355       tabLoopIteration++; | 
| 395   } | 356   } | 
| 396 } | 357 } | 
| LEFT | RIGHT | 
|---|