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

Side by Side Diff: Source/core/loader/NavigationScheduler.cpp

Issue 1133303007: Oilpan: move NavigationScheduler's redirect actions onto the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebased Created 5 years, 7 months 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
« no previous file with comments | « Source/core/loader/NavigationScheduler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
5 * Copyright (C) 2009 Adam Barth. All rights reserved. 5 * Copyright (C) 2009 Adam Barth. All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 10 *
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 #include "core/loader/FrameLoaderStateMachine.h" 47 #include "core/loader/FrameLoaderStateMachine.h"
48 #include "core/page/Page.h" 48 #include "core/page/Page.h"
49 #include "platform/SharedBuffer.h" 49 #include "platform/SharedBuffer.h"
50 #include "platform/UserGestureIndicator.h" 50 #include "platform/UserGestureIndicator.h"
51 #include "wtf/CurrentTime.h" 51 #include "wtf/CurrentTime.h"
52 52
53 namespace blink { 53 namespace blink {
54 54
55 unsigned NavigationDisablerForBeforeUnload::s_navigationDisableCount = 0; 55 unsigned NavigationDisablerForBeforeUnload::s_navigationDisableCount = 0;
56 56
57 class ScheduledNavigation { 57 class ScheduledNavigation : public NoBaseWillBeGarbageCollectedFinalized<Schedul edNavigation> {
58 WTF_MAKE_NONCOPYABLE(ScheduledNavigation); WTF_MAKE_FAST_ALLOCATED(Scheduled Navigation); 58 WTF_MAKE_NONCOPYABLE(ScheduledNavigation); WTF_MAKE_FAST_ALLOCATED_WILL_BE_R EMOVED(ScheduledNavigation);
59 public: 59 public:
60 ScheduledNavigation(double delay, Document* originDocument, bool lockBackFor wardList, bool isLocationChange) 60 ScheduledNavigation(double delay, Document* originDocument, bool lockBackFor wardList, bool isLocationChange)
61 : m_delay(delay) 61 : m_delay(delay)
62 , m_originDocument(originDocument) 62 , m_originDocument(originDocument)
63 , m_lockBackForwardList(lockBackForwardList) 63 , m_lockBackForwardList(lockBackForwardList)
64 , m_isLocationChange(isLocationChange) 64 , m_isLocationChange(isLocationChange)
65 , m_wasUserGesture(UserGestureIndicator::processingUserGesture()) 65 , m_wasUserGesture(UserGestureIndicator::processingUserGesture())
66 { 66 {
67 if (m_wasUserGesture) 67 if (m_wasUserGesture)
68 m_userGestureToken = UserGestureIndicator::currentToken(); 68 m_userGestureToken = UserGestureIndicator::currentToken();
69 } 69 }
70 virtual ~ScheduledNavigation() { } 70 virtual ~ScheduledNavigation() { }
71 71
72 virtual void fire(LocalFrame*) = 0; 72 virtual void fire(LocalFrame*) = 0;
73 73
74 virtual bool shouldStartTimer(LocalFrame*) { return true; } 74 virtual bool shouldStartTimer(LocalFrame*) { return true; }
75 75
76 double delay() const { return m_delay; } 76 double delay() const { return m_delay; }
77 Document* originDocument() const { return m_originDocument.get(); } 77 Document* originDocument() const { return m_originDocument.get(); }
78 bool lockBackForwardList() const { return m_lockBackForwardList; } 78 bool lockBackForwardList() const { return m_lockBackForwardList; }
79 bool isLocationChange() const { return m_isLocationChange; } 79 bool isLocationChange() const { return m_isLocationChange; }
80 PassOwnPtr<UserGestureIndicator> createUserGestureIndicator() 80 PassOwnPtr<UserGestureIndicator> createUserGestureIndicator()
81 { 81 {
82 if (m_wasUserGesture && m_userGestureToken) 82 if (m_wasUserGesture && m_userGestureToken)
83 return adoptPtr(new UserGestureIndicator(m_userGestureToken)); 83 return adoptPtr(new UserGestureIndicator(m_userGestureToken));
84 return adoptPtr(new UserGestureIndicator(DefinitelyNotProcessingUserGest ure)); 84 return adoptPtr(new UserGestureIndicator(DefinitelyNotProcessingUserGest ure));
85 } 85 }
86 86
87 DEFINE_INLINE_VIRTUAL_TRACE()
88 {
89 visitor->trace(m_originDocument);
90 }
91
87 protected: 92 protected:
88 void clearUserGesture() { m_wasUserGesture = false; } 93 void clearUserGesture() { m_wasUserGesture = false; }
89 94
90 private: 95 private:
91 double m_delay; 96 double m_delay;
92 RefPtrWillBePersistent<Document> m_originDocument; 97 RefPtrWillBeMember<Document> m_originDocument;
93 bool m_lockBackForwardList; 98 bool m_lockBackForwardList;
94 bool m_isLocationChange; 99 bool m_isLocationChange;
95 bool m_wasUserGesture; 100 bool m_wasUserGesture;
96 RefPtr<UserGestureToken> m_userGestureToken; 101 RefPtr<UserGestureToken> m_userGestureToken;
97 }; 102 };
98 103
99 class ScheduledURLNavigation : public ScheduledNavigation { 104 class ScheduledURLNavigation : public ScheduledNavigation {
100 protected: 105 protected:
101 ScheduledURLNavigation(double delay, Document* originDocument, const String& url, bool lockBackForwardList, bool isLocationChange) 106 ScheduledURLNavigation(double delay, Document* originDocument, const String& url, bool lockBackForwardList, bool isLocationChange)
102 : ScheduledNavigation(delay, originDocument, lockBackForwardList, isLoca tionChange) 107 : ScheduledNavigation(delay, originDocument, lockBackForwardList, isLoca tionChange)
(...skipping 15 matching lines...) Expand all
118 123
119 String url() const { return m_url; } 124 String url() const { return m_url; }
120 125
121 private: 126 private:
122 String m_url; 127 String m_url;
123 ContentSecurityPolicyDisposition m_shouldCheckMainWorldContentSecurityPolicy ; 128 ContentSecurityPolicyDisposition m_shouldCheckMainWorldContentSecurityPolicy ;
124 }; 129 };
125 130
126 class ScheduledRedirect final : public ScheduledURLNavigation { 131 class ScheduledRedirect final : public ScheduledURLNavigation {
127 public: 132 public:
128 ScheduledRedirect(double delay, Document* originDocument, const String& url, bool lockBackForwardList) 133 static PassOwnPtrWillBeRawPtr<ScheduledRedirect> create(double delay, Docume nt* originDocument, const String& url, bool lockBackForwardList)
129 : ScheduledURLNavigation(delay, originDocument, url, lockBackForwardList , false)
130 { 134 {
131 clearUserGesture(); 135 return adoptPtrWillBeNoop(new ScheduledRedirect(delay, originDocument, u rl, lockBackForwardList));
132 } 136 }
133 137
134 virtual bool shouldStartTimer(LocalFrame* frame) override { return frame->do cument()->loadEventFinished(); } 138 virtual bool shouldStartTimer(LocalFrame* frame) override { return frame->do cument()->loadEventFinished(); }
135 139
136 virtual void fire(LocalFrame* frame) override 140 virtual void fire(LocalFrame* frame) override
137 { 141 {
138 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or(); 142 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or();
139 FrameLoadRequest request(originDocument(), url(), "_self"); 143 FrameLoadRequest request(originDocument(), url(), "_self");
140 request.setLockBackForwardList(lockBackForwardList()); 144 request.setLockBackForwardList(lockBackForwardList());
141 if (equalIgnoringFragmentIdentifier(frame->document()->url(), request.re sourceRequest().url())) 145 if (equalIgnoringFragmentIdentifier(frame->document()->url(), request.re sourceRequest().url()))
142 request.resourceRequest().setCachePolicy(ReloadIgnoringCacheData); 146 request.resourceRequest().setCachePolicy(ReloadIgnoringCacheData);
143 request.setClientRedirect(ClientRedirect); 147 request.setClientRedirect(ClientRedirect);
144 frame->loader().load(request); 148 frame->loader().load(request);
145 } 149 }
150 private:
151 ScheduledRedirect(double delay, Document* originDocument, const String& url, bool lockBackForwardList)
152 : ScheduledURLNavigation(delay, originDocument, url, lockBackForwardList , false)
153 {
154 clearUserGesture();
155 }
146 }; 156 };
147 157
148 class ScheduledLocationChange final : public ScheduledURLNavigation { 158 class ScheduledLocationChange final : public ScheduledURLNavigation {
149 public: 159 public:
160 static PassOwnPtrWillBeRawPtr<ScheduledLocationChange> create(Document* orig inDocument, const String& url, bool lockBackForwardList)
161 {
162 return adoptPtrWillBeNoop(new ScheduledLocationChange(originDocument, ur l, lockBackForwardList));
163 }
164
165 private:
150 ScheduledLocationChange(Document* originDocument, const String& url, bool lo ckBackForwardList) 166 ScheduledLocationChange(Document* originDocument, const String& url, bool lo ckBackForwardList)
151 : ScheduledURLNavigation(0.0, originDocument, url, lockBackForwardList, !protocolIsJavaScript(url)) { } 167 : ScheduledURLNavigation(0.0, originDocument, url, lockBackForwardList, !protocolIsJavaScript(url)) { }
152 }; 168 };
153 169
154 class ScheduledReload final : public ScheduledNavigation { 170 class ScheduledReload final : public ScheduledNavigation {
155 public: 171 public:
156 ScheduledReload() 172 static PassOwnPtrWillBeRawPtr<ScheduledReload> create()
157 : ScheduledNavigation(0.0, nullptr, true, true)
158 { 173 {
174 return adoptPtrWillBeNoop(new ScheduledReload);
159 } 175 }
160 176
161 virtual void fire(LocalFrame* frame) override 177 virtual void fire(LocalFrame* frame) override
162 { 178 {
163 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or(); 179 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or();
164 frame->loader().reload(NormalReload, KURL(), ClientRedirect); 180 frame->loader().reload(NormalReload, KURL(), ClientRedirect);
165 } 181 }
182
183 private:
184 ScheduledReload()
185 : ScheduledNavigation(0.0, nullptr, true, true)
186 {
187 }
166 }; 188 };
167 189
168 class ScheduledPageBlock final : public ScheduledURLNavigation { 190 class ScheduledPageBlock final : public ScheduledURLNavigation {
169 public: 191 public:
170 ScheduledPageBlock(Document* originDocument, const String& url) 192 static PassOwnPtrWillBeRawPtr<ScheduledPageBlock> create(Document* originDoc ument, const String& url)
171 : ScheduledURLNavigation(0.0, originDocument, url, true, true)
172 { 193 {
194 return adoptPtrWillBeNoop(new ScheduledPageBlock(originDocument, url));
173 } 195 }
174 196
175 virtual void fire(LocalFrame* frame) override 197 virtual void fire(LocalFrame* frame) override
176 { 198 {
177 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or(); 199 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or();
178 SubstituteData substituteData(SharedBuffer::create(), "text/plain", "UTF -8", KURL(), ForceSynchronousLoad); 200 SubstituteData substituteData(SharedBuffer::create(), "text/plain", "UTF -8", KURL(), ForceSynchronousLoad);
179 FrameLoadRequest request(originDocument(), url(), substituteData); 201 FrameLoadRequest request(originDocument(), url(), substituteData);
180 request.setLockBackForwardList(true); 202 request.setLockBackForwardList(true);
181 request.setClientRedirect(ClientRedirect); 203 request.setClientRedirect(ClientRedirect);
182 frame->loader().load(request); 204 frame->loader().load(request);
183 } 205 }
206 private:
207 ScheduledPageBlock(Document* originDocument, const String& url)
208 : ScheduledURLNavigation(0.0, originDocument, url, true, true)
209 {
210 }
211
184 }; 212 };
185 213
186 class ScheduledFormSubmission final : public ScheduledNavigation { 214 class ScheduledFormSubmission final : public ScheduledNavigation {
187 public: 215 public:
188 ScheduledFormSubmission(Document* document, PassRefPtrWillBeRawPtr<FormSubmi ssion> submission, bool lockBackForwardList) 216 static PassOwnPtrWillBeRawPtr<ScheduledFormSubmission> create(Document* docu ment, PassRefPtrWillBeRawPtr<FormSubmission> submission, bool lockBackForwardLis t)
189 : ScheduledNavigation(0, document, lockBackForwardList, true)
190 , m_submission(submission)
191 { 217 {
192 ASSERT(m_submission->form()); 218 return adoptPtrWillBeNoop(new ScheduledFormSubmission(document, submissi on, lockBackForwardList));
193 } 219 }
194 220
195 virtual void fire(LocalFrame* frame) override 221 virtual void fire(LocalFrame* frame) override
196 { 222 {
197 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or(); 223 OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicat or();
198 FrameLoadRequest frameRequest(originDocument()); 224 FrameLoadRequest frameRequest(originDocument());
199 m_submission->populateFrameLoadRequest(frameRequest); 225 m_submission->populateFrameLoadRequest(frameRequest);
200 frameRequest.setLockBackForwardList(lockBackForwardList()); 226 frameRequest.setLockBackForwardList(lockBackForwardList());
201 frameRequest.setTriggeringEvent(m_submission->event()); 227 frameRequest.setTriggeringEvent(m_submission->event());
202 frameRequest.setForm(m_submission->form()); 228 frameRequest.setForm(m_submission->form());
203 frame->loader().load(frameRequest); 229 frame->loader().load(frameRequest);
204 } 230 }
205 231
232 DEFINE_INLINE_VIRTUAL_TRACE()
233 {
234 visitor->trace(m_submission);
235 ScheduledNavigation::trace(visitor);
236 }
237
206 private: 238 private:
207 RefPtrWillBePersistent<FormSubmission> m_submission; 239 ScheduledFormSubmission(Document* document, PassRefPtrWillBeRawPtr<FormSubmi ssion> submission, bool lockBackForwardList)
240 : ScheduledNavigation(0, document, lockBackForwardList, true)
241 , m_submission(submission)
242 {
243 ASSERT(m_submission->form());
244 }
245
246 RefPtrWillBeMember<FormSubmission> m_submission;
208 }; 247 };
209 248
210 NavigationScheduler::NavigationScheduler(LocalFrame* frame) 249 NavigationScheduler::NavigationScheduler(LocalFrame* frame)
211 : m_frame(frame) 250 : m_frame(frame)
212 , m_timer(this, &NavigationScheduler::timerFired) 251 , m_timer(this, &NavigationScheduler::timerFired)
213 { 252 {
214 } 253 }
215 254
216 NavigationScheduler::~NavigationScheduler() 255 NavigationScheduler::~NavigationScheduler()
217 { 256 {
(...skipping 18 matching lines...) Expand all
236 { 275 {
237 if (!shouldScheduleNavigation(url)) 276 if (!shouldScheduleNavigation(url))
238 return; 277 return;
239 if (delay < 0 || delay > INT_MAX / 1000) 278 if (delay < 0 || delay > INT_MAX / 1000)
240 return; 279 return;
241 if (url.isEmpty()) 280 if (url.isEmpty())
242 return; 281 return;
243 282
244 // We want a new back/forward list item if the refresh timeout is > 1 second . 283 // We want a new back/forward list item if the refresh timeout is > 1 second .
245 if (!m_redirect || delay <= m_redirect->delay()) 284 if (!m_redirect || delay <= m_redirect->delay())
246 schedule(adoptPtr(new ScheduledRedirect(delay, m_frame->document(), url, delay <= 1))); 285 schedule(ScheduledRedirect::create(delay, m_frame->document(), url, dela y <= 1));
247 } 286 }
248 287
249 bool NavigationScheduler::mustLockBackForwardList(LocalFrame* targetFrame) 288 bool NavigationScheduler::mustLockBackForwardList(LocalFrame* targetFrame)
250 { 289 {
251 // Non-user navigation before the page has finished firing onload should not create a new back/forward item. 290 // Non-user navigation before the page has finished firing onload should not create a new back/forward item.
252 // See https://webkit.org/b/42861 for the original motivation for this. 291 // See https://webkit.org/b/42861 for the original motivation for this.
253 if (!UserGestureIndicator::processingUserGesture() && !targetFrame->document ()->loadEventFinished()) 292 if (!UserGestureIndicator::processingUserGesture() && !targetFrame->document ()->loadEventFinished())
254 return true; 293 return true;
255 294
256 // From the HTML5 spec for location.assign(): 295 // From the HTML5 spec for location.assign():
(...skipping 29 matching lines...) Expand all
286 if (parsedURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier (m_frame->document()->url(), parsedURL)) { 325 if (parsedURL.hasFragmentIdentifier() && equalIgnoringFragmentIdentifier (m_frame->document()->url(), parsedURL)) {
287 FrameLoadRequest request(originDocument, m_frame->document()->comple teURL(url), "_self"); 326 FrameLoadRequest request(originDocument, m_frame->document()->comple teURL(url), "_self");
288 request.setLockBackForwardList(lockBackForwardList); 327 request.setLockBackForwardList(lockBackForwardList);
289 if (lockBackForwardList) 328 if (lockBackForwardList)
290 request.setClientRedirect(ClientRedirect); 329 request.setClientRedirect(ClientRedirect);
291 m_frame->loader().load(request); 330 m_frame->loader().load(request);
292 return; 331 return;
293 } 332 }
294 } 333 }
295 334
296 schedule(adoptPtr(new ScheduledLocationChange(originDocument, url, lockBackF orwardList))); 335 schedule(ScheduledLocationChange::create(originDocument, url, lockBackForwar dList));
297 } 336 }
298 337
299 void NavigationScheduler::schedulePageBlock(Document* originDocument) 338 void NavigationScheduler::schedulePageBlock(Document* originDocument)
300 { 339 {
301 ASSERT(m_frame->page()); 340 ASSERT(m_frame->page());
302 const KURL& url = m_frame->document()->url(); 341 const KURL& url = m_frame->document()->url();
303 schedule(adoptPtr(new ScheduledPageBlock(originDocument, url))); 342 schedule(ScheduledPageBlock::create(originDocument, url));
304 } 343 }
305 344
306 void NavigationScheduler::scheduleFormSubmission(Document* document, PassRefPtrW illBeRawPtr<FormSubmission> submission) 345 void NavigationScheduler::scheduleFormSubmission(Document* document, PassRefPtrW illBeRawPtr<FormSubmission> submission)
307 { 346 {
308 ASSERT(m_frame->page()); 347 ASSERT(m_frame->page());
309 schedule(adoptPtr(new ScheduledFormSubmission(document, submission, mustLock BackForwardList(m_frame)))); 348 schedule(ScheduledFormSubmission::create(document, submission, mustLockBackF orwardList(m_frame)));
310 } 349 }
311 350
312 void NavigationScheduler::scheduleReload() 351 void NavigationScheduler::scheduleReload()
313 { 352 {
314 if (!shouldScheduleReload()) 353 if (!shouldScheduleReload())
315 return; 354 return;
316 if (m_frame->document()->url().isEmpty()) 355 if (m_frame->document()->url().isEmpty())
317 return; 356 return;
318 schedule(adoptPtr(new ScheduledReload)); 357 schedule(ScheduledReload::create());
319 } 358 }
320 359
321 void NavigationScheduler::timerFired(Timer<NavigationScheduler>*) 360 void NavigationScheduler::timerFired(Timer<NavigationScheduler>*)
322 { 361 {
323 if (!m_frame->page()) 362 if (!m_frame->page())
324 return; 363 return;
325 if (m_frame->page()->defersLoading()) { 364 if (m_frame->page()->defersLoading()) {
326 InspectorInstrumentation::frameClearedScheduledNavigation(m_frame); 365 InspectorInstrumentation::frameClearedScheduledNavigation(m_frame);
327 return; 366 return;
328 } 367 }
329 368
330 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 369 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get());
331 370
332 OwnPtr<ScheduledNavigation> redirect(m_redirect.release()); 371 OwnPtrWillBeRawPtr<ScheduledNavigation> redirect(m_redirect.release());
333 redirect->fire(m_frame); 372 redirect->fire(m_frame);
334 InspectorInstrumentation::frameClearedScheduledNavigation(m_frame); 373 InspectorInstrumentation::frameClearedScheduledNavigation(m_frame);
335 } 374 }
336 375
337 void NavigationScheduler::schedule(PassOwnPtr<ScheduledNavigation> redirect) 376 void NavigationScheduler::schedule(PassOwnPtrWillBeRawPtr<ScheduledNavigation> r edirect)
338 { 377 {
339 ASSERT(m_frame->page()); 378 ASSERT(m_frame->page());
340 379
341 // In a back/forward navigation, we sometimes restore history state to ifram es, even though the state was generated 380 // In a back/forward navigation, we sometimes restore history state to ifram es, even though the state was generated
342 // dynamically and JS will try to put something different in the iframe. In this case, we will load stale things 381 // dynamically and JS will try to put something different in the iframe. In this case, we will load stale things
343 // and/or confuse the JS when it shortly thereafter tries to schedule a loca tion change. Let the JS have its way. 382 // and/or confuse the JS when it shortly thereafter tries to schedule a loca tion change. Let the JS have its way.
344 // FIXME: This check seems out of place. 383 // FIXME: This check seems out of place.
345 if (!m_frame->loader().stateMachine()->committedFirstRealDocumentLoad() && m _frame->loader().provisionalDocumentLoader()) { 384 if (!m_frame->loader().stateMachine()->committedFirstRealDocumentLoad() && m _frame->loader().provisionalDocumentLoader()) {
346 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 385 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get());
347 m_frame->loader().provisionalDocumentLoader()->stopLoading(); 386 m_frame->loader().provisionalDocumentLoader()->stopLoading();
(...skipping 25 matching lines...) Expand all
373 { 412 {
374 if (m_timer.isActive()) 413 if (m_timer.isActive())
375 InspectorInstrumentation::frameClearedScheduledNavigation(m_frame); 414 InspectorInstrumentation::frameClearedScheduledNavigation(m_frame);
376 m_timer.stop(); 415 m_timer.stop();
377 m_redirect.clear(); 416 m_redirect.clear();
378 } 417 }
379 418
380 DEFINE_TRACE(NavigationScheduler) 419 DEFINE_TRACE(NavigationScheduler)
381 { 420 {
382 visitor->trace(m_frame); 421 visitor->trace(m_frame);
422 visitor->trace(m_redirect);
383 } 423 }
384 424
385 } // namespace blink 425 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/loader/NavigationScheduler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698