Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Side by Side Diff: third_party/WebKit/Source/web/OpenedFrameTracker.cpp

Issue 1408073006: Gracefully handle a self-referential opener in frame swap. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove friend declaration. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "web/OpenedFrameTracker.h" 6 #include "web/OpenedFrameTracker.h"
7 7
8 #include "platform/heap/Handle.h" 8 #include "platform/heap/Handle.h"
9 #include "public/web/WebFrame.h" 9 #include "public/web/WebFrame.h"
10 10
11 namespace blink { 11 namespace blink {
12 12
13 OpenedFrameTracker::OpenedFrameTracker() 13 OpenedFrameTracker::OpenedFrameTracker()
14 { 14 {
15 } 15 }
16 16
17 OpenedFrameTracker::~OpenedFrameTracker() 17 OpenedFrameTracker::~OpenedFrameTracker()
18 { 18 {
19 #if !ENABLE(OILPAN) 19 #if !ENABLE(OILPAN)
20 // Oilpan takes care of clearing weak m_opener fields during GC. 20 // Oilpan takes care of clearing weak m_opener fields during GC.
21 updateOpener(0); 21 transferTo(nullptr);
22 #endif 22 #endif
23 } 23 }
24 24
25 bool OpenedFrameTracker::isEmpty() const 25 bool OpenedFrameTracker::isEmpty() const
26 { 26 {
27 return m_openedFrames.isEmpty(); 27 return m_openedFrames.isEmpty();
28 } 28 }
29 29
30 void OpenedFrameTracker::add(WebFrame* frame) 30 void OpenedFrameTracker::add(WebFrame* frame)
31 { 31 {
32 m_openedFrames.add(frame); 32 m_openedFrames.add(frame);
33 } 33 }
34 34
35 void OpenedFrameTracker::remove(WebFrame* frame) 35 void OpenedFrameTracker::remove(WebFrame* frame)
36 { 36 {
37 m_openedFrames.remove(frame); 37 m_openedFrames.remove(frame);
38 } 38 }
39 39
40 void OpenedFrameTracker::updateOpener(WebFrame* frame) 40 void OpenedFrameTracker::transferTo(WebFrame* opener)
41 { 41 {
42 HashSet<WebFrame*>::iterator end = m_openedFrames.end(); 42 HashSet<WebFrame*> frames(m_openedFrames);
alexmos 2015/10/27 19:09:51 nit: is it worth adding a comment about why the co
dcheng 2015/10/27 19:11:16 Yeah, probably worth commenting. I'll add it and C
43 for (HashSet<WebFrame*>::iterator it = m_openedFrames.begin(); it != end; ++ it) 43 for (WebFrame* frame : frames)
44 (*it)->m_opener = frame; 44 frame->setOpener(opener);
45 } 45 }
46 46
47 template <typename VisitorDispatcher> 47 template <typename VisitorDispatcher>
48 ALWAYS_INLINE void OpenedFrameTracker::traceFramesImpl(VisitorDispatcher visitor ) 48 ALWAYS_INLINE void OpenedFrameTracker::traceFramesImpl(VisitorDispatcher visitor )
49 { 49 {
50 #if ENABLE(OILPAN) 50 #if ENABLE(OILPAN)
51 HashSet<WebFrame*>::iterator end = m_openedFrames.end(); 51 HashSet<WebFrame*>::iterator end = m_openedFrames.end();
52 for (HashSet<WebFrame*>::iterator it = m_openedFrames.begin(); it != end; ++ it) 52 for (HashSet<WebFrame*>::iterator it = m_openedFrames.begin(); it != end; ++ it)
53 WebFrame::traceFrame(visitor, *it); 53 WebFrame::traceFrame(visitor, *it);
54 #endif 54 #endif
55 } 55 }
56 56
57 void OpenedFrameTracker::traceFrames(Visitor* visitor) { traceFramesImpl(visitor ); } 57 void OpenedFrameTracker::traceFrames(Visitor* visitor) { traceFramesImpl(visitor ); }
58 void OpenedFrameTracker::traceFrames(InlinedGlobalMarkingVisitor visitor) { trac eFramesImpl(visitor); } 58 void OpenedFrameTracker::traceFrames(InlinedGlobalMarkingVisitor visitor) { trac eFramesImpl(visitor); }
59 59
60 } // namespace blink 60 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/web/OpenedFrameTracker.h ('k') | third_party/WebKit/Source/web/WebFrame.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698