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 |