| 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 | 
| +    } | 
| +  } | 
| +} | 
|  |