Left: | ||
Right: |
OLD | NEW |
---|---|
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 #include "PluginTab.h" | 5 #include "PluginTab.h" |
6 #include "AdblockPlusDomTraverser.h" | 6 #include "AdblockPlusDomTraverser.h" |
7 #include "PluginClass.h" | 7 #include "PluginClass.h" |
8 #include "PluginTabBase.h" | 8 #include "PluginTabBase.h" |
9 #include "PluginUtil.h" | 9 #include "PluginUtil.h" |
10 #include "../shared/IE_version.h" | 10 #include "../shared/IE_version.h" |
11 #include "../shared/Utils.h" | |
11 #include <dispex.h> | 12 #include <dispex.h> |
12 #include <Mshtmhst.h> | 13 #include <Mshtmhst.h> |
13 | 14 |
14 int CPluginTabBase::s_dictionaryVersion = 0; | 15 int CPluginTabBase::s_dictionaryVersion = 0; |
15 int CPluginTabBase::s_settingsVersion = 1; | 16 int CPluginTabBase::s_settingsVersion = 1; |
16 int CPluginTabBase::s_filterVersion = 0; | 17 int CPluginTabBase::s_filterVersion = 0; |
17 int CPluginTabBase::s_whitelistVersion = 0; | 18 int CPluginTabBase::s_whitelistVersion = 0; |
18 | 19 |
19 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) | 20 CPluginTabBase::CPluginTabBase(CPluginClass* plugin) |
20 : m_plugin(plugin) | 21 : m_plugin(plugin) |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
109 } | 110 } |
110 DEBUG_GENERAL(L"Going to inject"); | 111 DEBUG_GENERAL(L"Going to inject"); |
111 CComPtr<IDispatch> pDocDispatch; | 112 CComPtr<IDispatch> pDocDispatch; |
112 browser->get_Document(&pDocDispatch); | 113 browser->get_Document(&pDocDispatch); |
113 CComQIPtr<IHTMLDocument2> pDoc2 = pDocDispatch; | 114 CComQIPtr<IHTMLDocument2> pDoc2 = pDocDispatch; |
114 if (!pDoc2) | 115 if (!pDoc2) |
115 { | 116 { |
116 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to QI docume nt"); | 117 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to QI docume nt"); |
117 return; | 118 return; |
118 } | 119 } |
120 | |
119 CComPtr<IHTMLWindow2> pWnd2; | 121 CComPtr<IHTMLWindow2> pWnd2; |
120 pDoc2->get_parentWindow(&pWnd2); | 122 pDoc2->get_parentWindow(&pWnd2); |
121 if (!pWnd2) | 123 if (!pWnd2) |
122 { | 124 { |
123 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to get paren t window"); | 125 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_CREATE_SETTINGS_JAVASCRIPT, PLUGIN_ERROR_CRE ATE_SETTINGS_JAVASCRIPT_INVOKE, "CPluginTabBase::InjectABP - Failed to get paren t window"); |
124 return; | 126 return; |
125 } | 127 } |
126 CComQIPtr<IDispatchEx> pWndEx = pWnd2; | 128 CComQIPtr<IDispatchEx> pWndEx = pWnd2; |
127 if (!pWndEx) | 129 if (!pWndEx) |
128 { | 130 { |
(...skipping 19 matching lines...) Expand all Loading... | |
148 params.rgvarg = &var; | 150 params.rgvarg = &var; |
149 params.rgdispidNamedArgs = 0; | 151 params.rgdispidNamedArgs = 0; |
150 hr = pWndEx->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPU T | DISPATCH_PROPERTYPUTREF, ¶ms, 0, 0, 0); | 152 hr = pWndEx->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPU T | DISPATCH_PROPERTYPUTREF, ¶ms, 0, 0, 0); |
151 DEBUG_GENERAL("Invoke"); | 153 DEBUG_GENERAL("Invoke"); |
152 if (FAILED(hr)) | 154 if (FAILED(hr)) |
153 { | 155 { |
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"); | 156 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"); |
155 } | 157 } |
156 } | 158 } |
157 | 159 |
160 namespace | |
161 { | |
162 void InjectABPCSS(IHTMLDocument2& htmlDocument2, const std::vector<std::wstrin g>& hideFilters) | |
Eric
2015/01/13 19:52:52
We're not distinguishing between fatal errors and
Oleksandr
2015/03/13 10:00:27
On 2015/01/13 19:52:52, Eric wrote:
What's not cor
sergei
2015/04/13 08:06:41
I agree this function should not be in this code r
| |
163 { | |
164 ATL::CComPtr<IHTMLElement> stylePureHtmlElement; | |
165 ATL::CComQIPtr<IHTMLStyleElement> styleHtmlElement; | |
166 if (FAILED(htmlDocument2.createElement(ATL::CComBSTR(L"style"), &stylePureHt mlElement))) | |
167 { | |
168 DEBUG_GENERAL(L"Cannot create style element"); | |
169 return; | |
170 } | |
171 if (!(styleHtmlElement = stylePureHtmlElement)) | |
172 { | |
173 DEBUG_GENERAL(L"Cannot obtain IHTMLStyleElement from IHTMLElement"); | |
174 return; | |
175 } | |
176 if (FAILED(styleHtmlElement->put_type(ATL::CComBSTR("text/css")))) | |
177 { | |
178 DEBUG_GENERAL(L"Cannot set type text/css"); | |
179 return; | |
180 } | |
181 ATL::CComQIPtr<IHTMLStyleSheet> styleSheet; | |
182 // IHTMLStyleElement2 is availabe starting from IE9, Vista | |
183 ATL::CComQIPtr<IHTMLStyleElement2> styleHtmlElement2 = styleHtmlElement; | |
184 if (!styleHtmlElement2) | |
185 { | |
186 DEBUG_GENERAL(L"Cannot obtain IHTMLStyleElement2 from IHTMLStyleElement"); | |
187 return; | |
188 } | |
189 if (FAILED(styleHtmlElement2->get_sheet(&styleSheet)) || !styleSheet) | |
190 { | |
191 DEBUG_GENERAL(L"Cannot obtain IHTMLStyleSheet"); | |
192 return; | |
193 } | |
194 // IHTMLStyleSheet4 is availabe starting from IE9, Vista | |
195 ATL::CComQIPtr<IHTMLStyleSheet4> styleSheet4 = styleSheet; | |
196 if (!styleSheet4) | |
197 { | |
198 DEBUG_GENERAL(L"Cannot obtain IHTMLStyleSheet4"); | |
199 return; | |
200 } | |
201 long newIndex = 0; | |
202 std::wstring cssValue = L"{ display: none !important; }"; | |
203 for (const auto& selector : hideFilters) | |
204 { | |
205 auto cssRule = selector + cssValue; | |
206 ATL::CComBSTR selector(cssRule.size(), cssRule.c_str()); | |
207 if (SUCCEEDED(styleSheet4->insertRule(selector, newIndex, &newIndex))) | |
208 { | |
209 ++newIndex; | |
210 } | |
211 else | |
212 { | |
213 DEBUG_GENERAL(ToCString(L"Cannot add rule for selector " + cssRule)); | |
214 } | |
215 } | |
216 | |
217 ATL::CComQIPtr<IHTMLDOMNode> styleNode = stylePureHtmlElement; | |
218 if (!styleNode) | |
219 { | |
220 DEBUG_GENERAL(L"Cannot obtain IHTMLDOMNode from stylePureHtmlElement"); | |
221 return; | |
222 } | |
223 ATL::CComPtr<IHTMLElement> headHtmlElement; | |
224 // IHTMLDocument7 is availabe starting from IE9, Vista | |
225 ATL::CComQIPtr<IHTMLDocument7> htmlDocument7 = &htmlDocument2; | |
226 if (!htmlDocument7) | |
227 { | |
228 DEBUG_GENERAL(L"Cannot obtain IHTMLDocument7 from htmlDocument2"); | |
229 return; | |
230 } | |
231 if (FAILED(htmlDocument7->get_head(&headHtmlElement))) | |
232 { | |
233 DEBUG_GENERAL(L"Cannot obtain head from pDoc7"); | |
234 return; | |
235 } | |
236 ATL::CComQIPtr<IHTMLDOMNode> headNode = headHtmlElement; | |
237 if (!headNode) | |
238 { | |
239 DEBUG_GENERAL(L"Cannot obtain headNode from headHtmlElement"); | |
240 return; | |
241 } | |
242 if (FAILED(headNode->appendChild(styleNode, nullptr))) | |
243 { | |
244 DEBUG_GENERAL(L"Cannot append blocking style"); | |
245 } | |
246 } | |
247 } | |
248 | |
158 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) | 249 void CPluginTabBase::OnDownloadComplete(IWebBrowser2* browser) |
159 { | 250 { |
160 CPluginClient* client = CPluginClient::GetInstance(); | 251 CPluginClient* client = CPluginClient::GetInstance(); |
161 std::wstring url = to_wstring(GetDocumentUrl()); | 252 std::wstring url = to_wstring(GetDocumentUrl()); |
162 if (!client->IsWhitelistedUrl(url) && !client->IsElemhideWhitelistedOnDomain(u rl)) | 253 if (!client->IsWhitelistedUrl(url) && !client->IsElemhideWhitelistedOnDomain(u rl)) |
163 { | 254 { |
164 m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl() ); | 255 m_traverser->TraverseDocument(browser, GetDocumentDomain(), GetDocumentUrl() ); |
165 } | 256 } |
166 InjectABP(browser); | 257 InjectABP(browser); |
167 } | 258 } |
168 | 259 |
260 ATL::CComPtr<IWebBrowser2> GetParent(const ATL::CComPtr<IWebBrowser2>& browser) | |
Eric
2015/01/13 19:52:52
Since you're not copying the CComPtr and incurring
sergei
2015/04/13 08:06:41
fixed to use `IWebBrowser2&`.
| |
261 { | |
262 ATL::CComPtr<IWebBrowser2> retValue; | |
263 ATL::CComPtr<IDispatch> browserParentDispatch; | |
264 if (FAILED(browser->get_Parent(&browserParentDispatch)) || !browserParentDispa tch) | |
265 { | |
266 return retValue; | |
Eric
2015/01/13 19:52:52
"return nullptr" is much clearer here.
sergei
2015/04/13 08:06:41
fixed
| |
267 } | |
268 // The InternetExplorer application always returns a pointer to itself. | |
269 if (browserParentDispatch.IsEqualObject(browser)) | |
270 { | |
271 return retValue; | |
Eric
2015/01/13 19:52:52
As before "return nullptr"
sergei
2015/04/13 08:06:41
fixed
| |
272 } | |
273 ATL::CComQIPtr<IServiceProvider> parentDocumentServiceProvider = browserParent Dispatch; | |
274 if (!parentDocumentServiceProvider) | |
275 { | |
276 return retValue; | |
Eric
2015/01/13 19:52:52
return nullptr
sergei
2015/04/13 08:06:41
fixed
| |
277 } | |
Eric
2015/01/13 19:52:52
This is the right place to declare 'retValue'.
As
sergei
2015/04/13 08:06:41
fixed
| |
278 if (FAILED(parentDocumentServiceProvider->QueryService(IID_IWebBrowserApp, &re tValue)) || !retValue) | |
Oleksandr
2015/03/13 10:00:27
Why is this querying for IWebBrowserApp and not IW
sergei
2015/04/13 08:06:41
fixed
| |
279 { | |
280 // error | |
Eric
2015/01/13 19:52:52
You've got to do something here, since a failed CO
Oleksandr
2015/03/13 10:00:27
return nullptr would be better IMO
sergei
2015/04/13 08:06:41
I don't think we should expect undefined state of
| |
281 } | |
282 return retValue; | |
283 } | |
284 | |
285 bool IsFrameWhiteListed(ATL::CComPtr<IWebBrowser2> frame) | |
286 { | |
287 if (!frame) | |
288 { | |
289 return false; | |
290 } | |
291 CPluginClient* client = CPluginClient::GetInstance(); | |
292 if (!client) | |
293 { | |
294 return false; | |
Eric
2015/01/13 19:52:52
This is really a pretty serious error.
Personally
| |
295 } | |
296 auto url = GetLocationUrl(*frame); | |
297 std::vector<std::string> frameHierarchy; | |
298 for(frame = GetParent(frame); frame; frame = GetParent(frame)) | |
299 { | |
300 frameHierarchy.push_back(ToUtf8String(GetLocationUrl(*frame))); | |
301 } | |
302 return client->IsWhitelistedUrl(url, frameHierarchy) | |
303 || client->IsElemhideWhitelistedOnDomain(url, frameHierarchy); | |
304 } | |
305 | |
169 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const CString& ur l, bool isDocumentBrowser) | 306 void CPluginTabBase::OnDocumentComplete(IWebBrowser2* browser, const CString& ur l, bool isDocumentBrowser) |
170 { | 307 { |
171 CString documentUrl = GetDocumentUrl(); | 308 CString documentUrl = GetDocumentUrl(); |
172 | 309 |
173 if (isDocumentBrowser) | 310 if (isDocumentBrowser) |
174 { | 311 { |
175 if (url != documentUrl) | 312 if (url != documentUrl) |
176 { | 313 { |
177 SetDocumentUrl(url); | 314 SetDocumentUrl(url); |
178 } | 315 } |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
348 CPluginClient::LogPluginError(pluginError.GetErrorCode(), pluginError. GetErrorId(), pluginError.GetErrorSubid(), pluginError.GetErrorDescription(), tr ue, pluginError.GetProcessId(), pluginError.GetThreadId()); | 485 CPluginClient::LogPluginError(pluginError.GetErrorCode(), pluginError. GetErrorId(), pluginError.GetErrorSubid(), pluginError.GetErrorDescription(), tr ue, pluginError.GetProcessId(), pluginError.GetThreadId()); |
349 } | 486 } |
350 | 487 |
351 // Non-hanging sleep | 488 // Non-hanging sleep |
352 Sleep(50); | 489 Sleep(50); |
353 } | 490 } |
354 | 491 |
355 tabLoopIteration++; | 492 tabLoopIteration++; |
356 } | 493 } |
357 } | 494 } |
OLD | NEW |