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

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: Add comment 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 // Copy the set of opened frames, since changing the owner will mutate this set.
43 for (HashSet<WebFrame*>::iterator it = m_openedFrames.begin(); it != end; ++ it) 43 HashSet<WebFrame*> frames(m_openedFrames);
44 (*it)->m_opener = frame; 44 for (WebFrame* frame : frames)
45 frame->setOpener(opener);
45 } 46 }
46 47
47 template <typename VisitorDispatcher> 48 template <typename VisitorDispatcher>
48 ALWAYS_INLINE void OpenedFrameTracker::traceFramesImpl(VisitorDispatcher visitor ) 49 ALWAYS_INLINE void OpenedFrameTracker::traceFramesImpl(VisitorDispatcher visitor )
49 { 50 {
50 #if ENABLE(OILPAN) 51 #if ENABLE(OILPAN)
51 HashSet<WebFrame*>::iterator end = m_openedFrames.end(); 52 HashSet<WebFrame*>::iterator end = m_openedFrames.end();
52 for (HashSet<WebFrame*>::iterator it = m_openedFrames.begin(); it != end; ++ it) 53 for (HashSet<WebFrame*>::iterator it = m_openedFrames.begin(); it != end; ++ it)
53 WebFrame::traceFrame(visitor, *it); 54 WebFrame::traceFrame(visitor, *it);
54 #endif 55 #endif
55 } 56 }
56 57
57 void OpenedFrameTracker::traceFrames(Visitor* visitor) { traceFramesImpl(visitor ); } 58 void OpenedFrameTracker::traceFrames(Visitor* visitor) { traceFramesImpl(visitor ); }
58 void OpenedFrameTracker::traceFrames(InlinedGlobalMarkingVisitor visitor) { trac eFramesImpl(visitor); } 59 void OpenedFrameTracker::traceFrames(InlinedGlobalMarkingVisitor visitor) { trac eFramesImpl(visitor); }
59 60
60 } // namespace blink 61 } // 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