OLD | NEW |
1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
2 | 2 |
3 #include "PluginClient.h" | 3 #include "PluginClient.h" |
4 #include "PluginFilter.h" | 4 #include "PluginFilter.h" |
5 #include "PluginSettings.h" | 5 #include "PluginSettings.h" |
6 | 6 |
7 #include "AdblockPlusDomTraverser.h" | 7 #include "AdblockPlusDomTraverser.h" |
| 8 #include "PluginUtil.h" |
8 | 9 |
9 | 10 |
10 CPluginDomTraverser::CPluginDomTraverser(CPluginTab* tab) : CPluginDomTraverserB
ase(tab) | 11 CPluginDomTraverser::CPluginDomTraverser(CPluginTab* tab) : CPluginDomTraverserB
ase(tab) |
11 { | 12 { |
12 } | 13 } |
13 | 14 |
14 | 15 |
15 bool CPluginDomTraverser::OnIFrame(IHTMLElement* pEl, const CString& url, CStrin
g& indent) | 16 bool CPluginDomTraverser::OnIFrame(IHTMLElement* pEl, const std::wstring & url,
std::wstring & indent) |
16 { | 17 { |
17 CPluginClient* client = CPluginClient::GetInstance(); | 18 CPluginClient* client = CPluginClient::GetInstance(); |
18 | 19 |
19 // If src should be blocked, set style display:none on iframe | 20 // If src should be blocked, set style display:none on iframe |
20 bool isBlocked = client->ShouldBlock(url, CFilter::contentTypeSubdocument, m_d
omain); | 21 bool isBlocked = client->ShouldBlock(url, CFilter::contentTypeSubdocument, m_d
omain); |
21 if (isBlocked) | 22 if (isBlocked) |
22 { | 23 { |
23 HideElement(pEl, "iframe", url, true, indent); | 24 HideElement(pEl, L"iframe", url, true, indent); |
24 } | 25 } |
25 | 26 |
26 return !isBlocked; | 27 return !isBlocked; |
27 } | 28 } |
28 | 29 |
29 | 30 |
30 bool CPluginDomTraverser::OnElement(IHTMLElement* pEl, const CString& tag, CPlug
inDomTraverserCache* cache, bool isDebug, CString& indent) | 31 bool CPluginDomTraverser::OnElement(IHTMLElement* pEl, const std::wstring & tag,
CPluginDomTraverserCache* cache, bool isDebug, std::wstring & indent) |
31 { | 32 { |
32 if (cache->m_isHidden) | 33 if (cache->m_isHidden) |
33 { | 34 { |
34 return false; | 35 return false; |
35 } | 36 } |
36 | 37 |
37 // Check if element is hidden | 38 // Check if element is hidden |
38 CPluginClient* client = CPluginClient::GetInstance(); | 39 CPluginClient* client = CPluginClient::GetInstance(); |
39 | 40 |
40 cache->m_isHidden = client->IsElementHidden(tag, pEl, m_domain, indent, m_tab-
>m_filter.get()); | 41 cache->m_isHidden = client->IsElementHidden(tag, pEl, m_domain, indent, m_tab-
>m_filter.get()); |
41 if (cache->m_isHidden) | 42 if (cache->m_isHidden) |
42 { | 43 { |
43 HideElement(pEl, tag, "", false, indent); | 44 HideElement(pEl, tag, L"", false, indent); |
44 return false; | 45 return false; |
45 } | 46 } |
46 | 47 |
47 // Images | 48 // Images |
48 if (tag == "img") | 49 if (tag == L"img") |
49 { | 50 { |
50 CComVariant vAttr; | 51 Wrapper::HTML_Element element( pEl ); |
51 | 52 std::wstring src; |
52 if (SUCCEEDED(pEl->getAttribute(L"src", 0, &vAttr)) && vAttr.vt == VT_BSTR &
& ::SysStringLen(vAttr.bstrVal) > 0) | 53 if ( element.attribute( L"src", src ) && !src.empty() ) |
53 { | 54 { |
54 CString src = vAttr.bstrVal; | 55 Wrapper::Unescape_URL( src ); |
55 CPluginClient::UnescapeUrl(src); | |
56 | 56 |
57 // If src should be blocked, set style display:none on image | 57 // If src should be blocked, set style display:none on image |
58 cache->m_isHidden = client->ShouldBlock(src, CFilter::contentTypeImage, m_
domain); | 58 cache->m_isHidden = client->ShouldBlock(src, CFilter::contentTypeImage, m_
domain); |
59 if (cache->m_isHidden) | 59 if (cache->m_isHidden) |
60 { | 60 { |
61 HideElement(pEl, "image", src, true, indent); | 61 HideElement(pEl, L"image", src, true, indent); |
62 return false; | 62 return false; |
63 } | 63 } |
64 } | 64 } |
65 } | 65 } |
66 // Objects | 66 // Objects |
67 else if (tag == "object") | 67 else if (tag == L"object") |
68 { | 68 { |
69 CComBSTR bstrInnerHtml; | 69 Wrapper::HTML_Element element( pEl ); |
| 70 std::wstring object_html; |
| 71 element.inner_HTML( object_html ); |
| 72 if ( element.inner_HTML( object_html ) && !object_html.empty() ) |
| 73 { |
| 74 std::wstring src; |
70 | 75 |
71 if (SUCCEEDED(pEl->get_innerHTML(&bstrInnerHtml)) && bstrInnerHtml) | 76 int posBegin = object_html.find( L"VALUE=\"" ); |
72 { | 77 int posEnd = ( posBegin >= 0 ) ? object_html.find( L'\"', posBegin + 7 ) :
-1; |
73 CString sObjectHtml = bstrInnerHtml; | |
74 CString src; | |
75 | |
76 int posBegin = sObjectHtml.Find(L"VALUE=\""); | |
77 int posEnd = posBegin >= 0 ? sObjectHtml.Find('\"', posBegin + 7) : -1; | |
78 | 78 |
79 while (posBegin >= 0 && posEnd >= 0) | 79 while (posBegin >= 0 && posEnd >= 0) |
80 { | 80 { |
81 posBegin += 7; | 81 posBegin += 7; |
82 | 82 |
83 src = sObjectHtml.Mid(posBegin, posEnd - posBegin); | 83 src = object_html.substr( posBegin, posEnd - posBegin ); |
84 | 84 |
85 // eg. http://w3schools.com/html/html_examples.asp | 85 // eg. http://w3schools.com/html/html_examples.asp |
86 if (src.Left(2) == "//") | 86 if ( ABP::util::begins_with( src, L"//" ) ) |
87 { | 87 { |
88 src = "http:" + src; | 88 src = L"http:" + src; |
89 } | 89 } |
90 | 90 |
91 if (!src.IsEmpty()) | 91 if ( !src.empty() ) |
92 { | 92 { |
93 // cache->m_isHidden = client->ShouldBlock(
src, CFilter::contentTypeObject, m_domain); | 93 // cache->m_isHidden = client->ShouldBlock(
src, CFilter::contentTypeObject, m_domain); |
94 if (cache->m_isHidden) | 94 if (cache->m_isHidden) |
95 { | 95 { |
96 HideElement(pEl, "object", src, true, indent); | 96 HideElement(pEl, L"object", src, true, indent); |
97 return false; | 97 return false; |
98 } | 98 } |
99 } | 99 } |
100 | 100 |
101 posBegin = sObjectHtml.Find(L"VALUE=\"", posBegin); | 101 posBegin = object_html.find( L"VALUE=\"", posBegin ); |
102 posEnd = posBegin >= 0 ? sObjectHtml.Find(L"\"", posBegin + 7) : -1; | 102 posEnd = ( posBegin >= 0 ) ? object_html.find( L'\"', posBegin + 7 ) : -
1; |
103 } | 103 } |
104 } | 104 } |
105 } | 105 } |
106 | 106 |
107 return true; | 107 return true; |
108 } | 108 } |
109 | 109 |
110 | 110 |
111 bool CPluginDomTraverser::IsEnabled() | 111 bool CPluginDomTraverser::IsEnabled() |
112 { | 112 { |
113 CPluginClient* client = CPluginClient::GetInstance(); | 113 CPluginClient* client = CPluginClient::GetInstance(); |
114 | 114 |
115 return client && CPluginSettings::GetInstance()->IsPluginEnabled() && !client-
>IsWhitelistedUrl(std::wstring(m_domain)); | 115 return client && CPluginSettings::GetInstance()->IsPluginEnabled() && !client-
>IsWhitelistedUrl(std::wstring(m_domain)); |
116 } | 116 } |
117 | 117 |
118 | 118 |
119 void CPluginDomTraverser::HideElement(IHTMLElement* pEl, const CString& type, co
nst CString& url, bool isDebug, CString& indent) | 119 void CPluginDomTraverser::HideElement(IHTMLElement* pEl, const std::wstring & ty
pe, const std::wstring & url, bool isDebug, std::wstring & indent) |
120 { | 120 { |
121 CComPtr<IHTMLStyle> pStyle; | 121 CComPtr<IHTMLStyle> pStyle; |
122 | 122 |
123 if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) | 123 if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) |
124 { | 124 { |
125 CComBSTR bstrDisplay; | 125 std::wstring display; |
126 | 126 Wrapper::HTML_Style style( pStyle ); |
127 if (SUCCEEDED(pStyle->get_display(&bstrDisplay)) && bstrDisplay && CString(b
strDisplay) == L"none") | 127 if ( style.display( display ) && display == L"none" ) |
128 { | 128 { |
129 return; | 129 return; |
130 } | 130 } |
131 | 131 |
132 static const CComBSTR sbstrNone(L"none"); | 132 if ( style.assign_display( L"none" ) ) |
133 | |
134 if (SUCCEEDED(pStyle->put_display(sbstrNone))) | |
135 { | 133 { |
136 DEBUG_HIDE_EL(indent + L"HideEl::Hiding " + type + L" url:" + url) | 134 DEBUG_HIDE_EL(indent + L"HideEl::Hiding " + type + L" url:" + url) |
137 | 135 |
138 #ifdef ENABLE_DEBUG_RESULT | 136 #ifdef ENABLE_DEBUG_RESULT |
139 if (isDebug) | 137 if (isDebug) |
140 { | 138 { |
141 CPluginDebug::DebugResultHiding(type, url, "-"); | 139 CPluginDebug::DebugResultHiding(type, url, L"-"); |
142 } | 140 } |
143 #endif // ENABLE_DEBUG_RESULT | 141 #endif // ENABLE_DEBUG_RESULT |
144 } | 142 } |
145 } | 143 } |
146 } | 144 } |
OLD | NEW |