| 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/Utils.h" | 10 #include "../shared/IE_version.h" |
| 15 #include <dispex.h> | 11 #include <dispex.h> |
| 12 #include <Mshtmhst.h> |
| 16 | 13 |
| 17 int CPluginTabBase::s_dictionaryVersion = 0; | 14 int CPluginTabBase::s_dictionaryVersion = 0; |
| 18 int CPluginTabBase::s_settingsVersion = 1; | 15 int CPluginTabBase::s_settingsVersion = 1; |
| 19 #ifdef SUPPORT_FILTER | |
| 20 int CPluginTabBase::s_filterVersion = 0; | 16 int CPluginTabBase::s_filterVersion = 0; |
| 21 #endif | |
| 22 #ifdef SUPPORT_WHITELIST | |
| 23 int CPluginTabBase::s_whitelistVersion = 0; | 17 int CPluginTabBase::s_whitelistVersion = 0; |
| 24 #endif | |
| 25 #ifdef SUPPORT_CONFIG | |
| 26 int CPluginTabBase::s_configVersion = 0; | |
| 27 #endif | |
| 28 | |
| 29 | 18 |
| 30 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) | 19 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) |
| 31 : m_plugin(plugin) | 20 : m_plugin(plugin) |
| 32 , m_isActivated(false) | 21 , m_isActivated(false) |
| 33 , m_continueThreadRunning(true) | 22 , m_continueThreadRunning(true) |
| 34 { | 23 { |
| 35 m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); | 24 m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); |
| 36 m_filter->hideFiltersLoadedEvent = CreateEvent(NULL, true, false, NULL); | 25 m_filter->hideFiltersLoadedEvent = CreateEvent(NULL, true, false, NULL); |
| 37 | 26 |
| 38 CPluginClient* client = CPluginClient::GetInstance(); | 27 CPluginClient* client = CPluginClient::GetInstance(); |
| 39 if ( ABP::IE::installed_major_version() < 10 ) | 28 if (AdblockPlus::IE::InstalledMajorVersion() < 10) |
| 40 { | 29 { |
| 41 m_isActivated = true; | 30 m_isActivated = true; |
| 42 } | 31 } |
| 43 | 32 |
| 44 try | 33 try |
| 45 { | 34 { |
| 46 m_thread = std::thread(&CPluginTabBase::ThreadProc, this); | 35 m_thread = std::thread(&CPluginTabBase::ThreadProc, this); |
| 47 } | 36 } |
| 48 catch (const std::system_error& ex) | 37 catch (const std::system_error& ex) |
| 49 { | 38 { |
| 50 std::wstring errDescription( L"Tab::Thread - Failed to create tab thread" ); | 39 auto errDescription = std::string("Tab::Thread - Failed to create tab thread
") + |
| 51 errDescription += ABP::debug::widen( ex.code().message() + ex.what() ); | 40 ex.code().message() + ex.what(); |
| 52 DEBUG_ERROR_LOG( ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_TAB_TH
READ_CREATE_PROCESS, errDescription ); | 41 DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_TAB_THR
EAD_CREATE_PROCESS, errDescription.c_str()); |
| 53 } | 42 } |
| 54 | |
| 55 #ifdef SUPPORT_DOM_TRAVERSER | |
| 56 m_traverser = new CPluginDomTraverser(static_cast<CPluginTab*>(this)); | 43 m_traverser = new CPluginDomTraverser(static_cast<CPluginTab*>(this)); |
| 57 #endif // SUPPORT_DOM_TRAVERSER | |
| 58 } | 44 } |
| 59 | 45 |
| 60 | 46 |
| 61 CPluginTabBase::~CPluginTabBase() | 47 CPluginTabBase::~CPluginTabBase() |
| 62 { | 48 { |
| 63 #ifdef SUPPORT_DOM_TRAVERSER | |
| 64 delete m_traverser; | 49 delete m_traverser; |
| 65 m_traverser = NULL; | 50 m_traverser = NULL; |
| 66 #endif // SUPPORT_DOM_TRAVERSER | |
| 67 | |
| 68 m_continueThreadRunning = false; | 51 m_continueThreadRunning = false; |
| 69 if (m_thread.joinable()) { | 52 if (m_thread.joinable()) { |
| 70 m_thread.join(); | 53 m_thread.join(); |
| 71 } | 54 } |
| 72 } | 55 } |
| 73 | 56 |
| 74 void CPluginTabBase::OnActivate() | 57 void CPluginTabBase::OnActivate() |
| 75 { | 58 { |
| 76 m_isActivated = true; | 59 m_isActivated = true; |
| 77 } | 60 } |
| 78 | 61 |
| 79 | 62 |
| 80 void CPluginTabBase::OnUpdate() | 63 void CPluginTabBase::OnUpdate() |
| 81 { | 64 { |
| 82 m_isActivated = true; | 65 m_isActivated = true; |
| 83 } | 66 } |
| 84 | 67 |
| 85 namespace | 68 namespace |
| 86 { | 69 { |
| 87 void FilterLoader(CPluginTabBase* tabBase) | 70 void FilterLoader(CPluginTabBase* tabBase) |
| 88 { | 71 { |
| 89 tabBase->m_filter->LoadHideFilters(CPluginClient::GetInstance()->GetElementHid
ingSelectors(tabBase->GetDocumentDomain())); | 72 tabBase->m_filter->LoadHideFilters(CPluginClient::GetInstance()->GetElementH
idingSelectors(tabBase->GetDocumentDomain())); |
| 90 SetEvent(tabBase->m_filter->hideFiltersLoadedEvent); | 73 SetEvent(tabBase->m_filter->hideFiltersLoadedEvent); |
| 91 } | 74 } |
| 92 } | 75 } |
| 93 | 76 |
| 94 void CPluginTabBase::OnNavigate(const std::wstring & url) | 77 void CPluginTabBase::OnNavigate(const CString& url) |
| 95 { | 78 { |
| 96 SetDocumentUrl(url); | 79 SetDocumentUrl(url); |
| 97 | |
| 98 #ifdef SUPPORT_FRAME_CACHING | |
| 99 ClearFrameCache(GetDocumentDomain()); | 80 ClearFrameCache(GetDocumentDomain()); |
| 100 #endif | |
| 101 | |
| 102 std::wstring domainString = GetDocumentDomain(); | 81 std::wstring domainString = GetDocumentDomain(); |
| 103 ResetEvent(m_filter->hideFiltersLoadedEvent); | 82 ResetEvent(m_filter->hideFiltersLoadedEvent); |
| 104 try | 83 try |
| 105 { | 84 { |
| 106 std::thread filterLoaderThread(&FilterLoader, this); | 85 std::thread filterLoaderThread(&FilterLoader, this); |
| 107 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. |
| 108 } | 87 } |
| 109 catch (const std::system_error& ex) | 88 catch (const std::system_error& ex) |
| 110 { | 89 { |
| 111 std::wstring errDescription( L"Class::Thread - Failed to start filter loader
thread, "); | 90 auto errDescription = std::string("Class::Thread - Failed to start filter lo
ader thread, ") + |
| 112 errDescription += ABP::debug::widen( ex.code().message() + ex.what() ); | 91 ex.code().message() + ex.what(); |
| 113 DEBUG_ERROR_LOG( ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_T
HREAD_CREATE_PROCESS, errDescription ); | 92 DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_TH
READ_CREATE_PROCESS, errDescription.c_str()); |
| 114 } | 93 } |
| 115 | |
| 116 #ifdef SUPPORT_DOM_TRAVERSER | |
| 117 m_traverser->ClearCache(); | 94 m_traverser->ClearCache(); |
| 118 #endif | |
| 119 } | |
| 120 | |
| 121 namespace { | |
| 122 } | 95 } |
| 123 | 96 |
| 124 void CPluginTabBase::InjectABP(IWebBrowser2* browser) | 97 void CPluginTabBase::InjectABP(IWebBrowser2* browser) |
| 125 { | 98 { |
| 126 CriticalSection::Lock lock(m_csInject); | 99 CriticalSection::Lock lock(m_csInject); |
| 127 std::wstring url = GetDocumentUrl(); | 100 CString url = GetDocumentUrl(); |
| 128 | 101 CString log; |
| 129 std::wostringstream log; | 102 log.Format(L"InjectABP. Current URL: %s, settings URL: %s", url, UserSettingsF
ileUrl().c_str()); |
| 130 log << L"InjectABP. Current URL: " << url << L", settings URL: " << UserSettin
gsFileUrl(); | 103 DEBUG_GENERAL(log); |
| 131 DEBUG_GENERAL( log.str() ); | 104 if (!(0 == url.CompareNoCase(CString(UserSettingsFileUrl().c_str())) || |
| 132 | 105 0 == url.CompareNoCase(CString(FirstRunPageFileUrl().c_str())))) |
| 133 if( !ABP::util::wstring_equal_ci( url, UserSettingsFileUrl() ) | |
| 134 && !ABP::util::wstring_equal_ci( url, FirstRunPageFileUrl() ) ) | |
| 135 { | 106 { |
| 136 DEBUG_GENERAL(L"Not injecting"); | 107 DEBUG_GENERAL(L"Not injecting"); |
| 137 return; | 108 return; |
| 138 } | 109 } |
| 139 DEBUG_GENERAL(L"Going to inject"); | 110 DEBUG_GENERAL(L"Going to inject"); |
| 140 CComPtr<IDispatch> pDocDispatch; | 111 CComPtr<IDispatch> pDocDispatch; |
| 141 browser->get_Document(&pDocDispatch); | 112 browser->get_Document(&pDocDispatch); |
| 142 CComQIPtr<IHTMLDocument2> pDoc2 = pDocDispatch; | 113 CComQIPtr<IHTMLDocument2> pDoc2 = pDocDispatch; |
| 143 if (!pDoc2) | 114 if (!pDoc2) |
| 144 { | 115 { |
| 145 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
ATE_SETTINGS_JAVASCRIPT_INVOKE, L"CPluginTabBase::InjectABP - Failed to QI docum
ent"); | 116 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to QI docume
nt"); |
| 146 return; | 117 return; |
| 147 } | 118 } |
| 148 CComPtr<IHTMLWindow2> pWnd2; | 119 CComPtr<IHTMLWindow2> pWnd2; |
| 149 pDoc2->get_parentWindow(&pWnd2); | 120 pDoc2->get_parentWindow(&pWnd2); |
| 150 if (!pWnd2) | 121 if (!pWnd2) |
| 151 { | 122 { |
| 152 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
ATE_SETTINGS_JAVASCRIPT_INVOKE, L"CPluginTabBase::InjectABP - Failed to get pare
nt window"); | 123 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to get paren
t window"); |
| 153 return; | 124 return; |
| 154 } | 125 } |
| 155 CComQIPtr<IDispatchEx> pWndEx = pWnd2; | 126 CComQIPtr<IDispatchEx> pWndEx = pWnd2; |
| 156 if (!pWndEx) | 127 if (!pWndEx) |
| 157 { | 128 { |
| 158 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
ATE_SETTINGS_JAVASCRIPT_INVOKE, L"CPluginTabBase::InjectABP - Failed to QI dispa
tch"); | 129 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE
ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to QI dispat
ch"); |
| 159 return; | 130 return; |
| 160 } | 131 } |
| 161 // Create "Settings" object in JavaScript. | 132 // Create "Settings" object in JavaScript. |
| 162 // A method call of "Settings" in JavaScript, transfered to "Invoke" of m_plug
inUserSettings | 133 // A method call of "Settings" in JavaScript, transfered to "Invoke" of m_plug
inUserSettings |
| 163 DISPID dispid; | 134 DISPID dispid; |
| 164 HRESULT hr = pWndEx->GetDispID(L"Settings", fdexNameEnsure, &dispid); | 135 HRESULT hr = pWndEx->GetDispID(L"Settings", fdexNameEnsure, &dispid); |
| 165 if (FAILED(hr)) | 136 if (FAILED(hr)) |
| 166 { | 137 { |
| 167 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CR
EATE_SETTINGS_JAVASCRIPT_INVOKE, L"CPluginTabBase::InjectABP - Failed to get dis
patch"); | 138 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CR
EATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to get disp
atch"); |
| 168 return; | 139 return; |
| 169 } | 140 } |
| 170 | 141 CComVariant var((IDispatch*)&m_pluginUserSettings); |
| 171 DEBUG_GENERAL(L"Injecting"); | 142 |
| 172 | 143 DEBUG_GENERAL("Injecting"); |
| 173 VARIANT var; | |
| 174 var.vt = VT_DISPATCH; | |
| 175 var.pdispVal = &m_pluginUserSettings; | |
| 176 | 144 |
| 177 DISPPARAMS params; | 145 DISPPARAMS params; |
| 178 params.cArgs = 1; | 146 params.cArgs = 1; |
| 179 params.cNamedArgs = 0; | 147 params.cNamedArgs = 0; |
| 180 params.rgvarg = &var; | 148 params.rgvarg = &var; |
| 181 params.rgdispidNamedArgs = 0; | 149 params.rgdispidNamedArgs = 0; |
| 182 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); |
| 183 DEBUG_GENERAL(L"Invoke"); | 151 DEBUG_GENERAL("Invoke"); |
| 184 if (FAILED(hr)) | 152 if (FAILED(hr)) |
| 185 { | 153 { |
| 186 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CR
EATE_SETTINGS_JAVASCRIPT_INVOKE, L"CPluginTabBase::InjectABP - Failed to create
Settings 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"); |
| 187 } | 155 } |
| 188 } | 156 } |
| 189 | 157 |
| 190 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) | 158 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) |
| 191 { | 159 { |
| 192 #ifdef SUPPORT_DOM_TRAVERSER | 160 CPluginClient* client = CPluginClient::GetInstance(); |
| 193 if (!CPluginClient::GetInstance()->IsWhitelistedUrl(GetDocumentUrl())) | 161 std::wstring url = to_wstring(GetDocumentUrl()); |
| 194 { | 162 if (!client->IsWhitelistedUrl(url) && !client->IsElemhideWhitelistedOnDomain(u
rl)) |
| 195 m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl()
.c_str()); | 163 { |
| 196 } | 164 m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl()
); |
| 197 #endif // SUPPORT_DOM_TRAVERSER | 165 } |
| 198 | |
| 199 InjectABP(browser); | 166 InjectABP(browser); |
| 200 } | 167 } |
| 201 | 168 |
| 202 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const std::wstrin
g url, bool isDocumentBrowser) | 169 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const CString& ur
l, bool isDocumentBrowser) |
| 203 { | 170 { |
| 204 std::wstring documentUrl = GetDocumentUrl(); | 171 CString documentUrl = GetDocumentUrl(); |
| 205 | 172 |
| 206 if (isDocumentBrowser) | 173 if (isDocumentBrowser) |
| 207 { | 174 { |
| 208 if (url != documentUrl) | 175 if (url != documentUrl) |
| 209 { | 176 { |
| 210 SetDocumentUrl( url ); | 177 SetDocumentUrl(url); |
| 211 } | 178 } |
| 212 InjectABP(browser); | 179 InjectABP(browser); |
| 213 } | 180 } |
| 214 | 181 if (url.Left(6) != "res://") |
| 215 #ifdef SUPPORT_DOM_TRAVERSER | |
| 216 if ( !ABP::util::begins_with( url, L"res://" ) ) | |
| 217 { | 182 { |
| 218 // Get document | 183 // Get document |
| 219 CComPtr<IDispatch> pDocDispatch; | 184 CComPtr<IDispatch> pDocDispatch; |
| 220 HRESULT hr = browser->get_Document(&pDocDispatch); | 185 HRESULT hr = browser->get_Document(&pDocDispatch); |
| 221 if (FAILED(hr) || !pDocDispatch) | 186 if (FAILED(hr) || !pDocDispatch) |
| 222 { | 187 { |
| 223 return; | 188 return; |
| 224 } | 189 } |
| 225 | 190 |
| 226 CComQIPtr<IHTMLDocument2> pDoc = pDocDispatch; | 191 CComQIPtr<IHTMLDocument2> pDoc = pDocDispatch; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 237 pOleObj->GetClientSite(&pClientSite); | 202 pOleObj->GetClientSite(&pClientSite); |
| 238 if (pClientSite != NULL) | 203 if (pClientSite != NULL) |
| 239 { | 204 { |
| 240 CComPtr<IDocHostUIHandler> docHostUIHandler; | 205 CComPtr<IDocHostUIHandler> docHostUIHandler; |
| 241 pClientSite->QueryInterface(IID_IDocHostUIHandler, (void**)&docHostUIHandl
er); | 206 pClientSite->QueryInterface(IID_IDocHostUIHandler, (void**)&docHostUIHandl
er); |
| 242 if (docHostUIHandler != NULL) | 207 if (docHostUIHandler != NULL) |
| 243 { | 208 { |
| 244 docHostUIHandler->UpdateUI(); | 209 docHostUIHandler->UpdateUI(); |
| 245 } | 210 } |
| 246 } | 211 } |
| 247 | 212 } |
| 248 pDoc.Release(); | |
| 249 pDocDispatch.Release(); | |
| 250 } | |
| 251 #endif | |
| 252 } | 213 } |
| 253 | 214 |
| 254 std::wstring CPluginTabBase::GetDocumentDomain() | 215 std::wstring CPluginTabBase::GetDocumentDomain() |
| 255 { | 216 { |
| 256 std::wstring domain; | 217 std::wstring domain; |
| 257 | 218 |
| 258 m_criticalSection.Lock(); | 219 m_criticalSection.Lock(); |
| 259 { | 220 { |
| 260 domain = m_documentDomain; | 221 domain = m_documentDomain; |
| 261 } | 222 } |
| 262 m_criticalSection.Unlock(); | 223 m_criticalSection.Unlock(); |
| 263 | 224 |
| 264 return domain; | 225 return domain; |
| 265 } | 226 } |
| 266 | 227 |
| 267 void CPluginTabBase::SetDocumentUrl(const std::wstring & url) | 228 void CPluginTabBase::SetDocumentUrl(const CString& url) |
| 268 { | 229 { |
| 269 m_criticalSection.Lock(); | 230 m_criticalSection.Lock(); |
| 270 { | 231 { |
| 271 m_documentUrl = url; | 232 m_documentUrl = url; |
| 272 m_documentDomain = CAdblockPlusClient::GetInstance()->GetHostFromUrl(url); | 233 m_documentDomain = CAdblockPlusClient::GetInstance()->GetHostFromUrl(to_wstr
ing(url)); |
| 273 } | 234 } |
| 274 m_criticalSection.Unlock(); | 235 m_criticalSection.Unlock(); |
| 275 } | 236 } |
| 276 | 237 |
| 277 std::wstring CPluginTabBase::GetDocumentUrl() | 238 CString CPluginTabBase::GetDocumentUrl() |
| 278 { | 239 { |
| 279 std::wstring url; | 240 CString url; |
| 280 | 241 |
| 281 m_criticalSection.Lock(); | 242 m_criticalSection.Lock(); |
| 282 { | 243 { |
| 283 url = m_documentUrl; | 244 url = m_documentUrl; |
| 284 } | 245 } |
| 285 m_criticalSection.Unlock(); | 246 m_criticalSection.Unlock(); |
| 286 | 247 |
| 287 return url; | 248 return url; |
| 288 } | 249 } |
| 289 | 250 |
| 290 | 251 |
| 291 // ============================================================================ | 252 // ============================================================================ |
| 292 // Frame caching | 253 // Frame caching |
| 293 // ============================================================================ | 254 // ============================================================================ |
| 294 | 255 bool CPluginTabBase::IsFrameCached(const CString& url) |
| 295 #ifdef SUPPORT_FRAME_CACHING | |
| 296 | |
| 297 bool CPluginTabBase::IsFrameCached(const std::wstring & url) | |
| 298 { | 256 { |
| 299 bool isFrame; | 257 bool isFrame; |
| 300 | 258 |
| 301 m_criticalSectionCache.Lock(); | 259 m_criticalSectionCache.Lock(); |
| 302 { | 260 { |
| 303 isFrame = m_cacheFrames.find(url) != m_cacheFrames.end(); | 261 isFrame = m_cacheFrames.find(url) != m_cacheFrames.end(); |
| 304 } | 262 } |
| 305 m_criticalSectionCache.Unlock(); | 263 m_criticalSectionCache.Unlock(); |
| 306 | 264 |
| 307 return isFrame; | 265 return isFrame; |
| 308 } | 266 } |
| 309 | 267 |
| 310 void CPluginTabBase::CacheFrame(const std::wstring & url) | 268 void CPluginTabBase::CacheFrame(const CString& url) |
| 311 { | 269 { |
| 312 m_criticalSectionCache.Lock(); | 270 m_criticalSectionCache.Lock(); |
| 313 { | 271 { |
| 314 m_cacheFrames.insert(url); | 272 m_cacheFrames.insert(url); |
| 315 } | 273 } |
| 316 m_criticalSectionCache.Unlock(); | 274 m_criticalSectionCache.Unlock(); |
| 317 } | 275 } |
| 318 | 276 |
| 319 void CPluginTabBase::ClearFrameCache(const std::wstring & domain) | 277 void CPluginTabBase::ClearFrameCache(const std::wstring& domain) |
| 320 { | 278 { |
| 321 m_criticalSectionCache.Lock(); | 279 m_criticalSectionCache.Lock(); |
| 322 { | 280 { |
| 323 if (domain.empty() || domain != m_cacheDomain) | 281 if (domain.empty() || domain != m_cacheDomain) |
| 324 { | 282 { |
| 325 m_cacheFrames.clear(); | 283 m_cacheFrames.clear(); |
| 326 m_cacheDomain = domain; | 284 m_cacheDomain = domain; |
| 327 } | 285 } |
| 328 } | 286 } |
| 329 m_criticalSectionCache.Unlock(); | 287 m_criticalSectionCache.Unlock(); |
| 330 } | 288 } |
| 331 | 289 |
| 332 #endif // SUPPORT_FRAME_CACHING | |
| 333 | |
| 334 | |
| 335 void CPluginTabBase::ThreadProc() | 290 void CPluginTabBase::ThreadProc() |
| 336 { | 291 { |
| 337 // Force loading/creation of settings | 292 // Force loading/creation of settings |
| 338 CPluginSettings* settings = CPluginSettings::GetInstance(); | 293 CPluginSettings* settings = CPluginSettings::GetInstance(); |
| 339 | 294 |
| 340 settings->SetWorkingThreadId(); | 295 settings->SetWorkingThreadId(); |
| 341 | 296 |
| 342 std::wostringstream thread_info; | 297 CString threadInfo; |
| 343 thread_info << ::GetCurrentProcessId() << L"." << ::GetCurrentThreadId(); | 298 threadInfo.Format(L"%d.%d", ::GetCurrentProcessId(), ::GetCurrentThreadId()); |
| 344 | 299 |
| 345 std::wstring t[] = { | 300 CString debugText; |
| 346 L"==========================================================================
======", | 301 |
| 347 L"TAB THREAD " + thread_info.str(), | 302 debugText += L"===============================================================
================="; |
| 348 L"==========================================================================
======", | 303 debugText += L"\nTAB THREAD " + threadInfo; |
| 349 }; | 304 debugText += L"\n=============================================================
==================="; |
| 350 DEBUG_GENERAL(t); | 305 |
| 306 DEBUG_GENERAL(debugText) |
| 351 | 307 |
| 352 // -------------------------------------------------------------------- | 308 // -------------------------------------------------------------------- |
| 353 // Tab loop | 309 // Tab loop |
| 354 // -------------------------------------------------------------------- | 310 // -------------------------------------------------------------------- |
| 355 | 311 |
| 356 DWORD loopCount = 0; | 312 DWORD loopCount = 0; |
| 357 DWORD tabLoopIteration = 1; | 313 DWORD tabLoopIteration = 1; |
| 358 | 314 |
| 359 while (this->m_continueThreadRunning) | 315 while (this->m_continueThreadRunning) |
| 360 { | 316 { |
| 361 #ifdef ENABLE_DEBUG_THREAD | 317 #ifdef ENABLE_DEBUG_THREAD |
| 362 std::wostringstream message; | 318 CStringA sTabLoopIteration; |
| 363 message << L"Loop iteration " << tabLoopIteration; | 319 sTabLoopIteration.Format("%u", tabLoopIteration); |
| 364 DEBUG_THREAD( L"------------------------------------------------------------
--------------------" ); | 320 |
| 365 DEBUG_THREAD( message.str() ); | 321 DEBUG_THREAD("--------------------------------------------------------------
------------------") |
| 366 DEBUG_THREAD( L"------------------------------------------------------------
--------------------" ); | 322 DEBUG_THREAD("Loop iteration " + sTabLoopIteration); |
| 323 DEBUG_THREAD("--------------------------------------------------------------
------------------") |
| 367 #endif | 324 #endif |
| 368 if (this->m_isActivated) | 325 if (this->m_isActivated) |
| 369 { | 326 { |
| 370 bool isChanged = false; | 327 bool isChanged = false; |
| 371 | 328 |
| 372 if (isChanged) | 329 if (isChanged) |
| 373 { | 330 { |
| 374 this->m_plugin->UpdateStatusBar(); | 331 this->m_plugin->UpdateStatusBar(); |
| 375 } | 332 } |
| 376 | 333 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 391 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()); |
| 392 } | 349 } |
| 393 | 350 |
| 394 // Non-hanging sleep | 351 // Non-hanging sleep |
| 395 Sleep(50); | 352 Sleep(50); |
| 396 } | 353 } |
| 397 | 354 |
| 398 tabLoopIteration++; | 355 tabLoopIteration++; |
| 399 } | 356 } |
| 400 } | 357 } |
| LEFT | RIGHT |