| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2015 Eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 { | 36 { |
| 37 | 37 |
| 38 public: | 38 public: |
| 39 | 39 |
| 40 CPluginDomTraverserBase(CPluginTab* tab); | 40 CPluginDomTraverserBase(CPluginTab* tab); |
| 41 ~CPluginDomTraverserBase(); | 41 ~CPluginDomTraverserBase(); |
| 42 | 42 |
| 43 void TraverseHeader(bool isHeaderTraversed); | 43 void TraverseHeader(bool isHeaderTraversed); |
| 44 | 44 |
| 45 void TraverseDocument(IWebBrowser2* pBrowser, const std::wstring& domain, cons
t std::wstring& documentName); | 45 void TraverseDocument(IWebBrowser2* pBrowser, const std::wstring& domain, cons
t std::wstring& documentName); |
| 46 void TraverseSubdocument(IWebBrowser2* pBrowser, const std::wstring& domain, c
onst CString& documentName); | 46 void TraverseSubdocument(IWebBrowser2* pBrowser, const std::wstring& domain); |
| 47 | 47 |
| 48 virtual void ClearCache(); | 48 virtual void ClearCache(); |
| 49 | 49 |
| 50 protected: | 50 protected: |
| 51 | 51 |
| 52 virtual bool OnIFrame(IHTMLElement* pEl, const std::wstring& url, CString& ind
ent) { return true; } | 52 virtual bool OnIFrame(IHTMLElement* pEl, const std::wstring& url, const std::w
string& indent) { return true; } |
| 53 virtual bool OnElement(IHTMLElement* pEl, const CString& tag, T* cache, bool i
sDebug, CString& indent) { return true; } | 53 virtual bool OnElement(IHTMLElement* pEl, const std::wstring& tag, T* cache, b
ool isDebug, const std::wstring& indent) { return true; } |
| 54 | 54 |
| 55 virtual bool IsEnabled(); | 55 virtual bool IsEnabled(); |
| 56 | 56 |
| 57 protected: | 57 protected: |
| 58 | 58 |
| 59 void TraverseDocument(IWebBrowser2* pBrowser, bool isMainDoc, CString indent); | 59 void TraverseDocument(IWebBrowser2* pBrowser, bool isMainDoc, const std::wstri
ng& indent); |
| 60 void TraverseChild(IHTMLElement* pEl, IWebBrowser2* pBrowser, CString& indent,
bool isCached=true); | 60 void TraverseChild(IHTMLElement* pEl, IWebBrowser2* pBrowser, const std::wstri
ng& indent, bool isCached=true); |
| 61 | 61 |
| 62 CComAutoCriticalSection m_criticalSection; | 62 CComAutoCriticalSection m_criticalSection; |
| 63 | 63 |
| 64 std::wstring m_domain; | 64 std::wstring m_domain; |
| 65 CString m_documentName; | 65 std::wstring m_documentName; |
| 66 | 66 |
| 67 bool m_isHeaderTraversed; | 67 bool m_isHeaderTraversed; |
| 68 | 68 |
| 69 // Caching | 69 // Caching |
| 70 long m_cacheDomElementCount; | 70 long m_cacheDomElementCount; |
| 71 | 71 |
| 72 int m_cacheIndexLast; | 72 int m_cacheIndexLast; |
| 73 int m_cacheElementsMax; | 73 int m_cacheElementsMax; |
| 74 std::set<CString> m_cacheDocumentHasFrames; | 74 std::set<std::wstring> m_cacheDocumentHasFrames; |
| 75 std::set<CString> m_cacheDocumentHasIframes; | 75 std::set<std::wstring> m_cacheDocumentHasIframes; |
| 76 | 76 |
| 77 T* m_cacheElements; | 77 T* m_cacheElements; |
| 78 | 78 |
| 79 CPluginTab* m_tab; | 79 CPluginTab* m_tab; |
| 80 CComPtr<IWebBrowser2> m_pBrowser; | 80 CComPtr<IWebBrowser2> m_pBrowser; |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 template <class T> | 83 template <class T> |
| 84 CPluginDomTraverserBase<T>::CPluginDomTraverserBase(CPluginTab* tab) : | 84 CPluginDomTraverserBase<T>::CPluginDomTraverserBase(CPluginTab* tab) : |
| 85 m_tab(tab), m_isHeaderTraversed(false), m_cacheDomElementCount(0), m_cacheInde
xLast(0), m_cacheElementsMax(5000) | 85 m_tab(tab), m_isHeaderTraversed(false), m_cacheDomElementCount(0), m_cacheInde
xLast(0), m_cacheElementsMax(5000) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 98 void CPluginDomTraverserBase<T>::TraverseHeader(bool isHeaderTraversed) | 98 void CPluginDomTraverserBase<T>::TraverseHeader(bool isHeaderTraversed) |
| 99 { | 99 { |
| 100 m_isHeaderTraversed = isHeaderTraversed; | 100 m_isHeaderTraversed = isHeaderTraversed; |
| 101 } | 101 } |
| 102 | 102 |
| 103 template <class T> | 103 template <class T> |
| 104 void CPluginDomTraverserBase<T>::TraverseDocument(IWebBrowser2* pBrowser, const
std::wstring& domain, const std::wstring& documentName) | 104 void CPluginDomTraverserBase<T>::TraverseDocument(IWebBrowser2* pBrowser, const
std::wstring& domain, const std::wstring& documentName) |
| 105 { | 105 { |
| 106 m_domain = domain; | 106 m_domain = domain; |
| 107 | 107 |
| 108 TraverseDocument(pBrowser, true, ""); | 108 TraverseDocument(pBrowser, true, L""); |
| 109 } | 109 } |
| 110 | 110 |
| 111 | 111 |
| 112 template <class T> | 112 template <class T> |
| 113 void CPluginDomTraverserBase<T>::TraverseSubdocument(IWebBrowser2* pBrowser, con
st std::wstring& domain, const CString& documentName) | 113 void CPluginDomTraverserBase<T>::TraverseSubdocument(IWebBrowser2* pBrowser, con
st std::wstring& domain) |
| 114 { | 114 { |
| 115 m_domain = domain; | 115 m_domain = domain; |
| 116 | 116 |
| 117 TraverseDocument(pBrowser, false, ""); | 117 TraverseDocument(pBrowser, false, L""); |
| 118 } | 118 } |
| 119 | 119 |
| 120 | 120 |
| 121 template <class T> | 121 template <class T> |
| 122 bool CPluginDomTraverserBase<T>::IsEnabled() | 122 bool CPluginDomTraverserBase<T>::IsEnabled() |
| 123 { | 123 { |
| 124 return CPluginSettings::GetInstance()->IsPluginEnabled(); | 124 return CPluginSettings::GetInstance()->IsPluginEnabled(); |
| 125 } | 125 } |
| 126 | 126 |
| 127 | 127 |
| 128 template <class T> | 128 template <class T> |
| 129 void CPluginDomTraverserBase<T>::TraverseDocument(IWebBrowser2* pBrowser, bool i
sMainDoc, CString indent) | 129 void CPluginDomTraverserBase<T>::TraverseDocument(IWebBrowser2* pBrowser, bool i
sMainDoc, const std::wstring& indent) |
| 130 { | 130 { |
| 131 DWORD res = WaitForSingleObject(m_tab->m_filter->hideFiltersLoadedEvent, ENGIN
E_STARTUP_TIMEOUT); | 131 DWORD res = WaitForSingleObject(m_tab->m_filter->hideFiltersLoadedEvent, ENGIN
E_STARTUP_TIMEOUT); |
| 132 if (!IsEnabled()) return; | 132 if (!IsEnabled()) return; |
| 133 | 133 |
| 134 VARIANT_BOOL isBusy; | 134 VARIANT_BOOL isBusy; |
| 135 if (SUCCEEDED(pBrowser->get_Busy(&isBusy))) | 135 if (SUCCEEDED(pBrowser->get_Busy(&isBusy))) |
| 136 { | 136 { |
| 137 if (isBusy != VARIANT_FALSE) | 137 if (isBusy != VARIANT_FALSE) |
| 138 { | 138 { |
| 139 return; | 139 return; |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 TraverseDocument(pFrameBrowser, false, indent); | 299 TraverseDocument(pFrameBrowser, false, indent); |
| 300 } | 300 } |
| 301 } | 301 } |
| 302 } | 302 } |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 } | 305 } |
| 306 } | 306 } |
| 307 } | 307 } |
| 308 | 308 |
| 309 | |
| 310 template <class T> | 309 template <class T> |
| 311 void CPluginDomTraverserBase<T>::TraverseChild(IHTMLElement* pEl, IWebBrowser2*
pBrowser, CString& indent, bool isCached) | 310 void CPluginDomTraverserBase<T>::TraverseChild(IHTMLElement* pEl, IWebBrowser2*
pBrowser, const std::wstring& indent, bool isCached) |
| 312 { | 311 { |
| 313 int cacheIndex = -1; | 312 int cacheIndex = -1; |
| 314 long cacheAllElementsCount = -1; | 313 long cacheAllElementsCount = -1; |
| 315 | 314 |
| 316 m_criticalSection.Lock(); | 315 m_criticalSection.Lock(); |
| 317 { | 316 { |
| 318 CComVariant vCacheIndex; | 317 CComVariant vCacheIndex; |
| 319 if (isCached && SUCCEEDED(pEl->getAttribute(ATL::CComBSTR(L"abp"), 0, &vCach
eIndex)) && vCacheIndex.vt == VT_I4) | 318 if (isCached && SUCCEEDED(pEl->getAttribute(ATL::CComBSTR(L"abp"), 0, &vCach
eIndex)) && vCacheIndex.vt == VT_I4) |
| 320 { | 319 { |
| 321 cacheIndex = vCacheIndex.intVal; | 320 cacheIndex = vCacheIndex.intVal; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 m_cacheElements[cacheIndex].m_elements = allElementsCount; | 376 m_cacheElements[cacheIndex].m_elements = allElementsCount; |
| 378 } | 377 } |
| 379 m_criticalSection.Unlock(); | 378 m_criticalSection.Unlock(); |
| 380 | 379 |
| 381 // Get tag | 380 // Get tag |
| 382 CComBSTR bstrTag; | 381 CComBSTR bstrTag; |
| 383 if (FAILED(pEl->get_tagName(&bstrTag)) || !bstrTag) | 382 if (FAILED(pEl->get_tagName(&bstrTag)) || !bstrTag) |
| 384 { | 383 { |
| 385 return; | 384 return; |
| 386 } | 385 } |
| 387 | 386 std::wstring tag = ToLowerString(ToWstring(bstrTag)); |
| 388 CString tag = bstrTag; | |
| 389 tag.MakeLower(); | |
| 390 | 387 |
| 391 // Custom OnElement | 388 // Custom OnElement |
| 392 if (!OnElement(pEl, tag, &m_cacheElements[cacheIndex], false, indent)) | 389 if (!OnElement(pEl, tag, &m_cacheElements[cacheIndex], false, indent)) |
| 393 { | 390 { |
| 394 return; | 391 return; |
| 395 } | 392 } |
| 396 | 393 |
| 397 // Update frame/iframe cache | 394 // Update frame/iframe cache |
| 398 if (tag == "iframe") | 395 if (tag == L"iframe") |
| 399 { | 396 { |
| 400 m_criticalSection.Lock(); | 397 m_criticalSection.Lock(); |
| 401 { | 398 { |
| 402 m_cacheDocumentHasIframes.insert(m_documentName); | 399 m_cacheDocumentHasIframes.insert(m_documentName); |
| 403 } | 400 } |
| 404 m_criticalSection.Unlock(); | 401 m_criticalSection.Unlock(); |
| 405 } | 402 } |
| 406 else if (tag == "frame") | 403 else if (tag == L"frame") |
| 407 { | 404 { |
| 408 m_criticalSection.Lock(); | 405 m_criticalSection.Lock(); |
| 409 { | 406 { |
| 410 m_cacheDocumentHasFrames.insert(m_documentName); | 407 m_cacheDocumentHasFrames.insert(m_documentName); |
| 411 } | 408 } |
| 412 m_criticalSection.Unlock(); | 409 m_criticalSection.Unlock(); |
| 413 } | 410 } |
| 414 | 411 |
| 415 // Iterate through children of this element | 412 // Iterate through children of this element |
| 416 if (allElementsCount > 0) | 413 if (allElementsCount > 0) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 433 CComPtr<IDispatch> pChildElDispatch; | 430 CComPtr<IDispatch> pChildElDispatch; |
| 434 CComVariant vRetIndex; | 431 CComVariant vRetIndex; |
| 435 | 432 |
| 436 vIndex.intVal = i; | 433 vIndex.intVal = i; |
| 437 | 434 |
| 438 if (SUCCEEDED(pChildCollection->item(vIndex, vRetIndex, &pChildElDispa
tch)) && pChildElDispatch) | 435 if (SUCCEEDED(pChildCollection->item(vIndex, vRetIndex, &pChildElDispa
tch)) && pChildElDispatch) |
| 439 { | 436 { |
| 440 CComPtr<IHTMLElement> pChildEl; | 437 CComPtr<IHTMLElement> pChildEl; |
| 441 if (SUCCEEDED(pChildElDispatch->QueryInterface(&pChildEl)) && pChild
El) | 438 if (SUCCEEDED(pChildElDispatch->QueryInterface(&pChildEl)) && pChild
El) |
| 442 { | 439 { |
| 443 TraverseChild(pChildEl, pBrowser, indent + " ", isCached); | 440 TraverseChild(pChildEl, pBrowser, indent + L" ", isCached); |
| 444 } | 441 } |
| 445 } | 442 } |
| 446 } | 443 } |
| 447 } | 444 } |
| 448 } | 445 } |
| 449 } | 446 } |
| 450 } | 447 } |
| 451 | 448 |
| 452 | 449 |
| 453 template <class T> | 450 template <class T> |
| 454 void CPluginDomTraverserBase<T>::ClearCache() | 451 void CPluginDomTraverserBase<T>::ClearCache() |
| 455 { | 452 { |
| 456 m_criticalSection.Lock(); | 453 m_criticalSection.Lock(); |
| 457 { | 454 { |
| 458 m_cacheIndexLast = 0; | 455 m_cacheIndexLast = 0; |
| 459 m_cacheDocumentHasFrames.clear(); | 456 m_cacheDocumentHasFrames.clear(); |
| 460 m_cacheDocumentHasIframes.clear(); | 457 m_cacheDocumentHasIframes.clear(); |
| 461 } | 458 } |
| 462 m_criticalSection.Unlock(); | 459 m_criticalSection.Unlock(); |
| 463 } | 460 } |
| 464 | 461 |
| 465 | 462 |
| 466 #endif // _PLUGIN_DOM_TRAVERSER_BASE_H_ | 463 #endif // _PLUGIN_DOM_TRAVERSER_BASE_H_ |
| OLD | NEW |