Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: src/plugin/PluginDomTraverserBase.h

Issue 5698769010032640: Issue #1466 - fix usage of BSTR (Closed)
Left Patch Set: Created Oct. 8, 2014, 2:48 p.m.
Right Patch Set: rebased Created Jan. 29, 2015, 5:10 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « src/plugin/AdblockPlusDomTraverser.cpp ('k') | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH
4 *
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
7 * published by the Free Software Foundation.
8 *
9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */
17
1 #ifndef _PLUGIN_DOM_TRAVERSER_BASE_H_ 18 #ifndef _PLUGIN_DOM_TRAVERSER_BASE_H_
2 #define _PLUGIN_DOM_TRAVERSER_BASE_H_ 19 #define _PLUGIN_DOM_TRAVERSER_BASE_H_
3 20
4 21
5 #include "PluginTypedef.h" 22 #include "PluginTypedef.h"
6 #include "PluginTab.h" 23 #include "PluginTab.h"
7 24
8 25
9 class CPluginDomTraverserCacheBase 26 class CPluginDomTraverserCacheBase
10 { 27 {
11 public: 28 public:
12 29
13 long m_elements; 30 long m_elements;
14 31
15 CPluginDomTraverserCacheBase() : m_elements(0) {}; 32 CPluginDomTraverserCacheBase() : m_elements(0) {};
16 void Init() { m_elements=0; } 33 void Init() { m_elements=0; }
17 }; 34 };
18 35
19 template <class T> 36 template <class T>
20 class CPluginDomTraverserBase 37 class CPluginDomTraverserBase
21 { 38 {
22 39
23 public: 40 public:
24 41
25 CPluginDomTraverserBase(CPluginTab* tab); 42 CPluginDomTraverserBase(CPluginTab* tab);
26 ~CPluginDomTraverserBase(); 43 ~CPluginDomTraverserBase();
27 44
28 void TraverseHeader(bool isHeaderTraversed); 45 void TraverseHeader(bool isHeaderTraversed);
29 46
30 void TraverseDocument(IWebBrowser2* pBrowser, const std::wstring& domain, cons t CString& documentName); 47 void TraverseDocument(IWebBrowser2* pBrowser, const std::wstring& domain, cons t std::wstring& documentName);
31 void TraverseSubdocument(IWebBrowser2* pBrowser, const std::wstring& domain, c onst CString& documentName); 48 void TraverseSubdocument(IWebBrowser2* pBrowser, const std::wstring& domain, c onst CString& documentName);
32 49
33 virtual void ClearCache(); 50 virtual void ClearCache();
34 51
35 protected: 52 protected:
36 53
37 virtual bool OnIFrame(IHTMLElement* pEl, const CString& url, CString& indent) { return true; } 54 virtual bool OnIFrame(IHTMLElement* pEl, const std::wstring& url, CString& ind ent) { return true; }
38 virtual bool OnElement(IHTMLElement* pEl, const CString& tag, T* cache, bool i sDebug, CString& indent) { return true; } 55 virtual bool OnElement(IHTMLElement* pEl, const CString& tag, T* cache, bool i sDebug, CString& indent) { return true; }
39 56
40 virtual bool IsEnabled(); 57 virtual bool IsEnabled();
41 58
42 protected: 59 protected:
43 60
44 void TraverseDocument(IWebBrowser2* pBrowser, bool isMainDoc, CString indent); 61 void TraverseDocument(IWebBrowser2* pBrowser, bool isMainDoc, CString indent);
45 void TraverseChild(IHTMLElement* pEl, IWebBrowser2* pBrowser, CString& indent, bool isCached=true); 62 void TraverseChild(IHTMLElement* pEl, IWebBrowser2* pBrowser, CString& indent, bool isCached=true);
46 63
47 CComAutoCriticalSection m_criticalSection; 64 CComAutoCriticalSection m_criticalSection;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 delete [] m_cacheElements; 96 delete [] m_cacheElements;
80 } 97 }
81 98
82 template <class T> 99 template <class T>
83 void CPluginDomTraverserBase<T>::TraverseHeader(bool isHeaderTraversed) 100 void CPluginDomTraverserBase<T>::TraverseHeader(bool isHeaderTraversed)
84 { 101 {
85 m_isHeaderTraversed = isHeaderTraversed; 102 m_isHeaderTraversed = isHeaderTraversed;
86 } 103 }
87 104
88 template <class T> 105 template <class T>
89 void CPluginDomTraverserBase<T>::TraverseDocument(IWebBrowser2* pBrowser, const std::wstring& domain, const CString& documentName) 106 void CPluginDomTraverserBase<T>::TraverseDocument(IWebBrowser2* pBrowser, const std::wstring& domain, const std::wstring& documentName)
90 { 107 {
91 m_domain = domain; 108 m_domain = domain;
92 109
93 TraverseDocument(pBrowser, true, ""); 110 TraverseDocument(pBrowser, true, "");
94 } 111 }
95 112
96 113
97 template <class T> 114 template <class T>
98 void CPluginDomTraverserBase<T>::TraverseSubdocument(IWebBrowser2* pBrowser, con st std::wstring& domain, const CString& documentName) 115 void CPluginDomTraverserBase<T>::TraverseSubdocument(IWebBrowser2* pBrowser, con st std::wstring& domain, const CString& documentName)
99 { 116 {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 { 230 {
214 CComVariant vIndex(i); 231 CComVariant vIndex(i);
215 CComVariant vRetIndex; 232 CComVariant vRetIndex;
216 CComPtr<IDispatch> pFrameDispatch; 233 CComPtr<IDispatch> pFrameDispatch;
217 234
218 if (SUCCEEDED(pFrameCollection->item(vIndex, vRetIndex, &pFrameDispatch)) && pFrameDispatch) 235 if (SUCCEEDED(pFrameCollection->item(vIndex, vRetIndex, &pFrameDispatch)) && pFrameDispatch)
219 { 236 {
220 CComQIPtr<IWebBrowser2> pFrameBrowser = pFrameDispatch; 237 CComQIPtr<IWebBrowser2> pFrameBrowser = pFrameDispatch;
221 if (pFrameBrowser) 238 if (pFrameBrowser)
222 { 239 {
240 std::wstring src;
223 CComBSTR bstrSrc; 241 CComBSTR bstrSrc;
224 CString src; 242 if (SUCCEEDED(pFrameBrowser->get_LocationURL(&bstrSrc)) && bstrSrc)
225
226 if (SUCCEEDED(pFrameBrowser->get_LocationURL(&bstrSrc)))
227 { 243 {
228 src = bstrSrc; 244 src = std::wstring(bstrSrc,SysStringLen(bstrSrc));
229 CPluginClient::UnescapeUrl(src); 245 UnescapeUrl(src);
230 } 246 }
231 247 if (!src.empty())
232 if (!src.IsEmpty())
233 { 248 {
234 TraverseDocument(pFrameBrowser, false, indent); 249 TraverseDocument(pFrameBrowser, false, indent);
235 } 250 }
236 } 251 }
237 } 252 }
238 } 253 }
239 } 254 }
240 255
241 // Iframes 256 // Iframes
242 if (hasIframes) 257 if (hasIframes)
(...skipping 14 matching lines...) Expand all
257 272
258 if (SUCCEEDED(pFrameCollection->item(vIndex, vRetIndex, &pFrameDispatch)) && pFrameDispatch) 273 if (SUCCEEDED(pFrameCollection->item(vIndex, vRetIndex, &pFrameDispatch)) && pFrameDispatch)
259 { 274 {
260 CComQIPtr<IHTMLElement> pFrameEl = pFrameDispatch; 275 CComQIPtr<IHTMLElement> pFrameEl = pFrameDispatch;
261 if (pFrameEl) 276 if (pFrameEl)
262 { 277 {
263 CComVariant vAttr; 278 CComVariant vAttr;
264 279
265 if (SUCCEEDED(pFrameEl->getAttribute(ATL::CComBSTR(L"scr"), 0, &vAttr) ) && vAttr.vt == VT_BSTR && ::SysStringLen(vAttr.bstrVal) > 0) 280 if (SUCCEEDED(pFrameEl->getAttribute(ATL::CComBSTR(L"scr"), 0, &vAttr) ) && vAttr.vt == VT_BSTR && ::SysStringLen(vAttr.bstrVal) > 0)
266 { 281 {
267 CString src = vAttr.bstrVal; 282 CString srcLegacy = vAttr.bstrVal;
268 283
269 // Some times, domain is missing. Should this be added on image src' s as well?'' 284 // Some times, domain is missing. Should this be added on image src' s as well?''
270 285
271 // eg. gadgetzone.com.au 286 // eg. gadgetzone.com.au
272 if (src.Left(2) == L"//") 287 if (srcLegacy.Left(2) == L"//")
273 { 288 {
274 src = L"http:" + src; 289 srcLegacy = L"http:" + srcLegacy;
275 } 290 }
276 // eg. http://w3schools.com/html/html_examples.asp 291 // eg. http://w3schools.com/html/html_examples.asp
277 else if (src.Left(4) != L"http" && src.Left(6) != L"res://") 292 else if (srcLegacy.Left(4) != L"http" && srcLegacy.Left(6) != L"res: //")
278 { 293 {
279 src = L"http://" + to_CString(m_domain) + src; 294 srcLegacy = L"http://" + ToCString(m_domain) + srcLegacy;
280 } 295 }
281 296 std::wstring src(ToWstring(srcLegacy));
282 CPluginClient::UnescapeUrl(src); 297 UnescapeUrl(src);
283 298
284 // Check if Iframe should be traversed 299 // Check if Iframe should be traversed
285 if (OnIFrame(pFrameEl, src, indent)) 300 if (OnIFrame(pFrameEl, src, indent))
286 { 301 {
287 CComQIPtr<IWebBrowser2> pFrameBrowser = pFrameDispatch; 302 CComQIPtr<IWebBrowser2> pFrameBrowser = pFrameDispatch;
288 if (pFrameBrowser) 303 if (pFrameBrowser)
289 { 304 {
290 TraverseDocument(pFrameBrowser, false, indent); 305 TraverseDocument(pFrameBrowser, false, indent);
291 } 306 }
292 }» 307 }
293 } 308 }
294 } 309 }
295 } 310 }
296 } 311 }
297 } 312 }
298 } 313 }
299 314
300 315
301 template <class T> 316 template <class T>
302 void CPluginDomTraverserBase<T>::TraverseChild(IHTMLElement* pEl, IWebBrowser2* pBrowser, CString& indent, bool isCached) 317 void CPluginDomTraverserBase<T>::TraverseChild(IHTMLElement* pEl, IWebBrowser2* pBrowser, CString& indent, bool isCached)
303 { 318 {
304 int cacheIndex = -1; 319 int cacheIndex = -1;
305 long cacheAllElementsCount = -1; 320 long cacheAllElementsCount = -1;
306 321
307 m_criticalSection.Lock(); 322 m_criticalSection.Lock();
308 { 323 {
309 CComVariant vCacheIndex; 324 CComVariant vCacheIndex;
310 if (isCached && SUCCEEDED(pEl->getAttribute(ATL::CComBSTR(L"abp"), 0, &vCach eIndex)) && vCacheIndex.vt == VT_I4) 325 if (isCached && SUCCEEDED(pEl->getAttribute(ATL::CComBSTR(L"abp"), 0, &vCach eIndex)) && vCacheIndex.vt == VT_I4)
311 { 326 {
312 cacheIndex = vCacheIndex.intVal; 327 cacheIndex = vCacheIndex.intVal;
313 328
314 cacheAllElementsCount = m_cacheElements[cacheIndex].m_elements; 329 cacheAllElementsCount = m_cacheElements[cacheIndex].m_elements;
315 } 330 }
316 else 331 else
317 { 332 {
318 isCached = false; 333 isCached = false;
319 334
320 cacheIndex = m_cacheIndexLast++; 335 cacheIndex = m_cacheIndexLast++;
321 336
322 // Resize cache??? 337 // Resize cache???
323 if (cacheIndex >= m_cacheElementsMax) 338 if (cacheIndex >= m_cacheElementsMax)
324 { 339 {
325 T* oldCacheElements = m_cacheElements; 340 T* oldCacheElements = m_cacheElements;
326 341
327 m_cacheElements = new T[2*m_cacheElementsMax]; 342 m_cacheElements = new T[2*m_cacheElementsMax];
328 343
329 memcpy(m_cacheElements, oldCacheElements, m_cacheElementsMax*sizeof(T)); 344 memcpy(m_cacheElements, oldCacheElements, m_cacheElementsMax*sizeof(T));
330 345
331 m_cacheElementsMax *= 2; 346 m_cacheElementsMax *= 2;
332 347
333 delete [] oldCacheElements; 348 delete [] oldCacheElements;
334 } 349 }
335 350
336 m_cacheElements[cacheIndex].Init(); 351 m_cacheElements[cacheIndex].Init();
337 352
338 vCacheIndex.vt = VT_I4; 353 vCacheIndex.vt = VT_I4;
339 vCacheIndex.intVal = cacheIndex; 354 vCacheIndex.intVal = cacheIndex;
340 355
341 pEl->setAttribute(ATL::CComBSTR(L"abp"), vCacheIndex); 356 pEl->setAttribute(ATL::CComBSTR(L"abp"), vCacheIndex);
342 } 357 }
343 } 358 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 { 463 {
449 m_cacheIndexLast = 0; 464 m_cacheIndexLast = 0;
450 m_cacheDocumentHasFrames.clear(); 465 m_cacheDocumentHasFrames.clear();
451 m_cacheDocumentHasIframes.clear(); 466 m_cacheDocumentHasIframes.clear();
452 } 467 }
453 m_criticalSection.Unlock(); 468 m_criticalSection.Unlock();
454 } 469 }
455 470
456 471
457 #endif // _PLUGIN_DOM_TRAVERSER_BASE_H_ 472 #endif // _PLUGIN_DOM_TRAVERSER_BASE_H_
LEFTRIGHT

Powered by Google App Engine
This is Rietveld