Index: src/plugin/AdblockPlusDomTraverser.cpp |
diff --git a/src/plugin/AdblockPlusDomTraverser.cpp b/src/plugin/AdblockPlusDomTraverser.cpp |
index 296a209942052e479083599c7c8007684132d0f9..e1e495b28a9b76a739bc950e9b6de6e1f04eb06b 100644 |
--- a/src/plugin/AdblockPlusDomTraverser.cpp |
+++ b/src/plugin/AdblockPlusDomTraverser.cpp |
@@ -15,147 +15,149 @@ |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
-#include "PluginStdAfx.h" |
- |
-#include "PluginClient.h" |
-#include "PluginFilter.h" |
-#include "PluginSettings.h" |
- |
-#include "AdblockPlusDomTraverser.h" |
- |
- |
-CPluginDomTraverser::CPluginDomTraverser(CPluginTab* tab) : CPluginDomTraverserBase(tab) |
-{ |
-} |
- |
- |
-bool CPluginDomTraverser::OnIFrame(IHTMLElement* pEl, const std::wstring& url, CString& indent) |
-{ |
- CPluginClient* client = CPluginClient::GetInstance(); |
- |
- // If src should be blocked, set style display:none on iframe |
- bool isBlocked = client->ShouldBlock(url, CFilter::contentTypeSubdocument, m_domain); |
- if (isBlocked) |
- { |
- HideElement(pEl, "iframe", url, true, indent); |
- } |
- |
- return !isBlocked; |
-} |
- |
- |
-bool CPluginDomTraverser::OnElement(IHTMLElement* pEl, const CString& tag, CPluginDomTraverserCache* cache, bool isDebug, CString& indent) |
-{ |
- if (cache->m_isHidden) |
- { |
- return false; |
- } |
- |
- // Check if element is hidden |
- CPluginClient* client = CPluginClient::GetInstance(); |
- |
- cache->m_isHidden = client->IsElementHidden(ToWstring(tag), pEl, m_domain, ToWstring(indent), m_tab->m_filter.get()); |
- if (cache->m_isHidden) |
- { |
- HideElement(pEl, tag, L"", false, indent); |
- return false; |
- } |
- |
- // Images |
- if (tag == "img") |
- { |
- CComVariant vAttr; |
- |
- if (SUCCEEDED(pEl->getAttribute(L"src", 0, &vAttr)) && vAttr.vt == VT_BSTR && ::SysStringLen(vAttr.bstrVal) > 0) |
- { |
- std::wstring src(vAttr.bstrVal, SysStringLen(vAttr.bstrVal)); |
- UnescapeUrl(src); |
- |
- // If src should be blocked, set style display:none on image |
- cache->m_isHidden = client->ShouldBlock(src, CFilter::contentTypeImage, m_domain); |
- if (cache->m_isHidden) |
- { |
- HideElement(pEl, "image", src, true, indent); |
- return false; |
- } |
- } |
- } |
- // Objects |
- else if (tag == "object") |
- { |
- CComBSTR bstrInnerHtml; |
- |
- if (SUCCEEDED(pEl->get_innerHTML(&bstrInnerHtml)) && bstrInnerHtml) |
- { |
- CString sObjectHtml = bstrInnerHtml; |
- CString src; |
- |
- int posBegin = sObjectHtml.Find(L"VALUE=\""); |
- int posEnd = posBegin >= 0 ? sObjectHtml.Find('\"', posBegin + 7) : -1; |
- |
- while (posBegin >= 0 && posEnd >= 0) |
- { |
- posBegin += 7; |
- |
- src = sObjectHtml.Mid(posBegin, posEnd - posBegin); |
- |
- // eg. http://w3schools.com/html/html_examples.asp |
- if (src.Left(2) == "//") |
- { |
- src = "http:" + src; |
- } |
- |
- if (!src.IsEmpty()) |
- { |
- if (cache->m_isHidden) |
- { |
- HideElement(pEl, "object", ToWstring(src), true, indent); |
- return false; |
- } |
- } |
- |
- posBegin = sObjectHtml.Find(L"VALUE=\"", posBegin); |
- posEnd = posBegin >= 0 ? sObjectHtml.Find(L"\"", posBegin + 7) : -1; |
- } |
- } |
- } |
- |
- return true; |
-} |
- |
- |
-bool CPluginDomTraverser::IsEnabled() |
-{ |
- CPluginClient* client = CPluginClient::GetInstance(); |
- return client && CPluginSettings::GetInstance()->IsPluginEnabled() && !client->IsWhitelistedUrl(m_domain); |
-} |
- |
- |
-void CPluginDomTraverser::HideElement(IHTMLElement* pEl, const CString& type, const std::wstring& url, bool isDebug, CString& indent) |
-{ |
- CComPtr<IHTMLStyle> pStyle; |
- |
- if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) |
- { |
- CComBSTR bstrDisplay; |
- |
- if (SUCCEEDED(pStyle->get_display(&bstrDisplay)) && bstrDisplay && CString(bstrDisplay) == L"none") |
- { |
- return; |
- } |
- |
- static const CComBSTR sbstrNone(L"none"); |
- |
- if (SUCCEEDED(pStyle->put_display(sbstrNone))) |
- { |
- DEBUG_HIDE_EL(indent + L"HideEl::Hiding " + type + L" url:" + ToCString(url)) |
- |
-#ifdef ENABLE_DEBUG_RESULT |
- if (isDebug) |
- { |
- CPluginDebug::DebugResultHiding(type, ToCString(url), "-"); |
- } |
-#endif // ENABLE_DEBUG_RESULT |
- } |
- } |
-} |
+#include "PluginStdAfx.h" |
+ |
+#include "PluginClient.h" |
+#include "PluginFilter.h" |
+#include "PluginSettings.h" |
+ |
+#include "AdblockPlusDomTraverser.h" |
+ |
+ |
+CPluginDomTraverser::CPluginDomTraverser(CPluginTab* tab) : CPluginDomTraverserBase(tab) |
+{ |
+} |
+ |
+ |
+bool CPluginDomTraverser::OnIFrame(IHTMLElement* pEl, const std::wstring& url, CString& indent) |
+{ |
+ CPluginClient* client = CPluginClient::GetInstance(); |
+ |
+ // If src should be blocked, set style display:none on iframe |
+ bool isBlocked = client->ShouldBlock(url, |
+ AdblockPlus::FilterEngine::ContentType::CONTENT_TYPE_SUBDOCUMENT, m_domain); |
+ if (isBlocked) |
+ { |
+ HideElement(pEl, "iframe", url, true, indent); |
+ } |
+ |
+ return !isBlocked; |
+} |
+ |
+ |
+bool CPluginDomTraverser::OnElement(IHTMLElement* pEl, const CString& tag, CPluginDomTraverserCache* cache, bool isDebug, CString& indent) |
+{ |
+ if (cache->m_isHidden) |
+ { |
+ return false; |
+ } |
+ |
+ // Check if element is hidden |
+ CPluginClient* client = CPluginClient::GetInstance(); |
+ |
+ cache->m_isHidden = client->IsElementHidden(ToWstring(tag), pEl, m_domain, ToWstring(indent), m_tab->m_filter.get()); |
+ if (cache->m_isHidden) |
+ { |
+ HideElement(pEl, tag, L"", false, indent); |
+ return false; |
+ } |
+ |
+ // Images |
+ if (tag == "img") |
+ { |
+ CComVariant vAttr; |
+ |
+ if (SUCCEEDED(pEl->getAttribute(L"src", 0, &vAttr)) && vAttr.vt == VT_BSTR && ::SysStringLen(vAttr.bstrVal) > 0) |
+ { |
+ std::wstring src(vAttr.bstrVal, SysStringLen(vAttr.bstrVal)); |
+ UnescapeUrl(src); |
+ |
+ // If src should be blocked, set style display:none on image |
+ cache->m_isHidden = client->ShouldBlock(src, |
+ AdblockPlus::FilterEngine::ContentType::CONTENT_TYPE_IMAGE, m_domain); |
+ if (cache->m_isHidden) |
+ { |
+ HideElement(pEl, "image", src, true, indent); |
+ return false; |
+ } |
+ } |
+ } |
+ // Objects |
+ else if (tag == "object") |
+ { |
+ CComBSTR bstrInnerHtml; |
+ |
+ if (SUCCEEDED(pEl->get_innerHTML(&bstrInnerHtml)) && bstrInnerHtml) |
+ { |
+ CString sObjectHtml = bstrInnerHtml; |
+ CString src; |
+ |
+ int posBegin = sObjectHtml.Find(L"VALUE=\""); |
+ int posEnd = posBegin >= 0 ? sObjectHtml.Find('\"', posBegin + 7) : -1; |
+ |
+ while (posBegin >= 0 && posEnd >= 0) |
+ { |
+ posBegin += 7; |
+ |
+ src = sObjectHtml.Mid(posBegin, posEnd - posBegin); |
+ |
+ // eg. http://w3schools.com/html/html_examples.asp |
+ if (src.Left(2) == "//") |
+ { |
+ src = "http:" + src; |
+ } |
+ |
+ if (!src.IsEmpty()) |
+ { |
+ if (cache->m_isHidden) |
+ { |
+ HideElement(pEl, "object", ToWstring(src), true, indent); |
+ return false; |
+ } |
+ } |
+ |
+ posBegin = sObjectHtml.Find(L"VALUE=\"", posBegin); |
+ posEnd = posBegin >= 0 ? sObjectHtml.Find(L"\"", posBegin + 7) : -1; |
+ } |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |
+ |
+bool CPluginDomTraverser::IsEnabled() |
+{ |
+ CPluginClient* client = CPluginClient::GetInstance(); |
+ return client && CPluginSettings::GetInstance()->IsPluginEnabled() && !client->IsWhitelistedUrl(m_domain); |
+} |
+ |
+ |
+void CPluginDomTraverser::HideElement(IHTMLElement* pEl, const CString& type, const std::wstring& url, bool isDebug, CString& indent) |
+{ |
+ CComPtr<IHTMLStyle> pStyle; |
+ |
+ if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) |
+ { |
+ CComBSTR bstrDisplay; |
+ |
+ if (SUCCEEDED(pStyle->get_display(&bstrDisplay)) && bstrDisplay && CString(bstrDisplay) == L"none") |
+ { |
+ return; |
+ } |
+ |
+ static const CComBSTR sbstrNone(L"none"); |
+ |
+ if (SUCCEEDED(pStyle->put_display(sbstrNone))) |
+ { |
+ DEBUG_HIDE_EL(indent + L"HideEl::Hiding " + type + L" url:" + ToCString(url)) |
+ |
+#ifdef ENABLE_DEBUG_RESULT |
+ if (isDebug) |
+ { |
+ CPluginDebug::DebugResultHiding(type, ToCString(url), "-"); |
+ } |
+#endif // ENABLE_DEBUG_RESULT |
+ } |
+ } |
+} |