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

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

Issue 28983004: Split the frame tree logic out of HistoryItem (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/loader/FrameLoader.h ('k') | Source/core/loader/FrameLoaderTypes.h » ('j') | 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, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
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) 2008 Alp Toker <alp@atoker.com> 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com>
6 * Copyright (C) Research In Motion Limited 2009. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com>
8 * Copyright (C) 2011 Google Inc. All rights reserved. 8 * Copyright (C) 2011 Google Inc. All rights reserved.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 #include "core/loader/DocumentLoadTiming.h" 62 #include "core/loader/DocumentLoadTiming.h"
63 #include "core/loader/DocumentLoader.h" 63 #include "core/loader/DocumentLoader.h"
64 #include "core/loader/FormState.h" 64 #include "core/loader/FormState.h"
65 #include "core/loader/FormSubmission.h" 65 #include "core/loader/FormSubmission.h"
66 #include "core/loader/FrameFetchContext.h" 66 #include "core/loader/FrameFetchContext.h"
67 #include "core/loader/FrameLoadRequest.h" 67 #include "core/loader/FrameLoadRequest.h"
68 #include "core/loader/FrameLoaderClient.h" 68 #include "core/loader/FrameLoaderClient.h"
69 #include "core/loader/ProgressTracker.h" 69 #include "core/loader/ProgressTracker.h"
70 #include "core/loader/UniqueIdentifier.h" 70 #include "core/loader/UniqueIdentifier.h"
71 #include "core/loader/appcache/ApplicationCacheHost.h" 71 #include "core/loader/appcache/ApplicationCacheHost.h"
72 #include "core/page/BackForwardClient.h"
72 #include "core/page/Chrome.h" 73 #include "core/page/Chrome.h"
73 #include "core/page/ChromeClient.h" 74 #include "core/page/ChromeClient.h"
74 #include "core/page/CreateWindow.h" 75 #include "core/page/CreateWindow.h"
75 #include "core/page/EventHandler.h" 76 #include "core/page/EventHandler.h"
76 #include "core/page/FrameTree.h" 77 #include "core/page/FrameTree.h"
77 #include "core/page/Page.h" 78 #include "core/page/Page.h"
78 #include "core/page/Settings.h" 79 #include "core/page/Settings.h"
79 #include "core/page/WindowFeatures.h" 80 #include "core/page/WindowFeatures.h"
80 #include "core/platform/ScrollAnimator.h" 81 #include "core/platform/ScrollAnimator.h"
81 #include "core/xml/parser/XMLDocumentParser.h" 82 #include "core/xml/parser/XMLDocumentParser.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 { 136 {
136 } 137 }
137 138
138 Frame* m_frame; 139 Frame* m_frame;
139 bool m_inProgress; 140 bool m_inProgress;
140 }; 141 };
141 142
142 FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client) 143 FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client)
143 : m_frame(frame) 144 : m_frame(frame)
144 , m_client(client) 145 , m_client(client)
145 , m_history(frame)
146 , m_mixedContentChecker(frame) 146 , m_mixedContentChecker(frame)
147 , m_state(FrameStateProvisional) 147 , m_state(FrameStateProvisional)
148 , m_loadType(FrameLoadTypeStandard) 148 , m_loadType(FrameLoadTypeStandard)
149 , m_fetchContext(FrameFetchContext::create(frame)) 149 , m_fetchContext(FrameFetchContext::create(frame))
150 , m_inStopAllLoaders(false) 150 , m_inStopAllLoaders(false)
151 , m_isComplete(false) 151 , m_isComplete(false)
152 , m_checkTimer(this, &FrameLoader::checkTimerFired) 152 , m_checkTimer(this, &FrameLoader::checkTimerFired)
153 , m_shouldCallCheckCompleted(false) 153 , m_shouldCallCheckCompleted(false)
154 , m_opener(0) 154 , m_opener(0)
155 , m_didAccessInitialDocument(false) 155 , m_didAccessInitialDocument(false)
(...skipping 17 matching lines...) Expand all
173 { 173 {
174 // This somewhat odd set of steps gives the frame an initial empty document. 174 // This somewhat odd set of steps gives the frame an initial empty document.
175 m_provisionalDocumentLoader = m_client->createDocumentLoader(ResourceRequest (KURL(ParsedURLString, emptyString())), SubstituteData()); 175 m_provisionalDocumentLoader = m_client->createDocumentLoader(ResourceRequest (KURL(ParsedURLString, emptyString())), SubstituteData());
176 m_provisionalDocumentLoader->setFrame(m_frame); 176 m_provisionalDocumentLoader->setFrame(m_frame);
177 m_provisionalDocumentLoader->startLoadingMainResource(); 177 m_provisionalDocumentLoader->startLoadingMainResource();
178 m_frame->document()->cancelParsing(); 178 m_frame->document()->cancelParsing();
179 m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocu ment); 179 m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocu ment);
180 m_progressTracker = FrameProgressTracker::create(m_frame); 180 m_progressTracker = FrameProgressTracker::create(m_frame);
181 } 181 }
182 182
183 HistoryController* FrameLoader::history() const
184 {
185 return m_frame->page() ? m_frame->page()->history() : 0;
186 }
187
183 void FrameLoader::setDefersLoading(bool defers) 188 void FrameLoader::setDefersLoading(bool defers)
184 { 189 {
185 if (m_documentLoader) 190 if (m_documentLoader)
186 m_documentLoader->setDefersLoading(defers); 191 m_documentLoader->setDefersLoading(defers);
187 if (m_provisionalDocumentLoader) 192 if (m_provisionalDocumentLoader)
188 m_provisionalDocumentLoader->setDefersLoading(defers); 193 m_provisionalDocumentLoader->setDefersLoading(defers);
189 if (m_policyDocumentLoader) 194 if (m_policyDocumentLoader)
190 m_policyDocumentLoader->setDefersLoading(defers); 195 m_policyDocumentLoader->setDefersLoading(defers);
191 history()->setDefersLoading(defers); 196 history()->setDefersLoading(defers);
192 197
(...skipping 20 matching lines...) Expand all
213 // FIXME: Should the DatabaseManager watch for something like ActiveDOMO bject::stop() rather than being special-cased here? 218 // FIXME: Should the DatabaseManager watch for something like ActiveDOMO bject::stop() rather than being special-cased here?
214 DatabaseManager::manager().stopDatabases(doc, 0); 219 DatabaseManager::manager().stopDatabases(doc, 0);
215 } 220 }
216 221
217 // FIXME: This will cancel redirection timer, which really needs to be resta rted when restoring the frame from b/f cache. 222 // FIXME: This will cancel redirection timer, which really needs to be resta rted when restoring the frame from b/f cache.
218 m_frame->navigationScheduler().cancel(); 223 m_frame->navigationScheduler().cancel();
219 } 224 }
220 225
221 bool FrameLoader::closeURL() 226 bool FrameLoader::closeURL()
222 { 227 {
223 history()->saveDocumentAndScrollState(); 228 if (m_frame->page())
229 history()->saveDocumentAndScrollState(m_frame);
224 230
225 // Should only send the pagehide event here if the current document exists. 231 // Should only send the pagehide event here if the current document exists.
226 if (m_frame->document()) 232 if (m_frame->document())
227 m_frame->document()->dispatchUnloadEvents(); 233 m_frame->document()->dispatchUnloadEvents();
228 stopLoading(); 234 stopLoading();
229 235
230 m_frame->editor().clearUndoRedoOperations(); 236 m_frame->editor().clearUndoRedoOperations();
231 return true; 237 return true;
232 } 238 }
233 239
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 void FrameLoader::setOutgoingReferrer(const KURL& url) 310 void FrameLoader::setOutgoingReferrer(const KURL& url)
305 { 311 {
306 m_outgoingReferrer = url.strippedForUseAsReferrer(); 312 m_outgoingReferrer = url.strippedForUseAsReferrer();
307 } 313 }
308 314
309 void FrameLoader::didBeginDocument(bool dispatch) 315 void FrameLoader::didBeginDocument(bool dispatch)
310 { 316 {
311 m_isComplete = false; 317 m_isComplete = false;
312 m_frame->document()->setReadyState(Document::Loading); 318 m_frame->document()->setReadyState(Document::Loading);
313 319
314 if (history()->currentItem() && m_loadType == FrameLoadTypeBackForward) 320 if (history()->currentItem(m_frame) && m_loadType == FrameLoadTypeBackForwar d)
315 m_frame->domWindow()->statePopped(history()->currentItem()->stateObject( )); 321 m_frame->domWindow()->statePopped(history()->currentItem(m_frame)->state Object());
316 322
317 if (dispatch) 323 if (dispatch)
318 dispatchDidClearWindowObjectsInAllWorlds(); 324 dispatchDidClearWindowObjectsInAllWorlds();
319 325
320 m_frame->document()->initContentSecurityPolicy(m_documentLoader ? ContentSec urityPolicyResponseHeaders(m_documentLoader->response()) : ContentSecurityPolicy ResponseHeaders()); 326 m_frame->document()->initContentSecurityPolicy(m_documentLoader ? ContentSec urityPolicyResponseHeaders(m_documentLoader->response()) : ContentSecurityPolicy ResponseHeaders());
321 327
322 Settings* settings = m_frame->document()->settings(); 328 Settings* settings = m_frame->document()->settings();
323 if (settings) { 329 if (settings) {
324 m_frame->document()->fetcher()->setImagesEnabled(settings->areImagesEnab led()); 330 m_frame->document()->fetcher()->setImagesEnabled(settings->areImagesEnab led());
325 m_frame->document()->fetcher()->setAutoLoadImages(settings->loadsImagesA utomatically()); 331 m_frame->document()->fetcher()->setAutoLoadImages(settings->loadsImagesA utomatically());
326 } 332 }
327 333
328 if (m_documentLoader) { 334 if (m_documentLoader) {
329 String dnsPrefetchControl = m_documentLoader->response().httpHeaderField ("X-DNS-Prefetch-Control"); 335 String dnsPrefetchControl = m_documentLoader->response().httpHeaderField ("X-DNS-Prefetch-Control");
330 if (!dnsPrefetchControl.isEmpty()) 336 if (!dnsPrefetchControl.isEmpty())
331 m_frame->document()->parseDNSPrefetchControlHeader(dnsPrefetchContro l); 337 m_frame->document()->parseDNSPrefetchControlHeader(dnsPrefetchContro l);
332 338
333 String headerContentLanguage = m_documentLoader->response().httpHeaderFi eld("Content-Language"); 339 String headerContentLanguage = m_documentLoader->response().httpHeaderFi eld("Content-Language");
334 if (!headerContentLanguage.isEmpty()) { 340 if (!headerContentLanguage.isEmpty()) {
335 size_t commaIndex = headerContentLanguage.find(','); 341 size_t commaIndex = headerContentLanguage.find(',');
336 headerContentLanguage.truncate(commaIndex); // kNotFound == -1 == do n't truncate 342 headerContentLanguage.truncate(commaIndex); // kNotFound == -1 == do n't truncate
337 headerContentLanguage = headerContentLanguage.stripWhiteSpace(isHTML Space<UChar>); 343 headerContentLanguage = headerContentLanguage.stripWhiteSpace(isHTML Space<UChar>);
338 if (!headerContentLanguage.isEmpty()) 344 if (!headerContentLanguage.isEmpty())
339 m_frame->document()->setContentLanguage(headerContentLanguage); 345 m_frame->document()->setContentLanguage(headerContentLanguage);
340 } 346 }
341 } 347 }
342 348
343 history()->restoreDocumentState(); 349 history()->restoreDocumentState(m_frame);
344 } 350 }
345 351
346 void FrameLoader::finishedParsing() 352 void FrameLoader::finishedParsing()
347 { 353 {
348 if (m_stateMachine.creatingInitialEmptyDocument()) 354 if (m_stateMachine.creatingInitialEmptyDocument())
349 return; 355 return;
350 356
351 // This can be called from the Frame's destructor, in which case we shouldn' t protect ourselves 357 // This can be called from the Frame's destructor, in which case we shouldn' t protect ourselves
352 // because doing so will cause us to re-enter the destructor when protector goes out of scope. 358 // because doing so will cause us to re-enter the destructor when protector goes out of scope.
353 // Null-checking the FrameView indicates whether or not we're in the destruc tor. 359 // Null-checking the FrameView indicates whether or not we're in the destruc tor.
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 // Update the data source's request with the new URL to fake the URL change 519 // Update the data source's request with the new URL to fake the URL change
514 KURL oldURL = m_frame->document()->url(); 520 KURL oldURL = m_frame->document()->url();
515 m_frame->document()->setURL(newURL); 521 m_frame->document()->setURL(newURL);
516 setOutgoingReferrer(newURL); 522 setOutgoingReferrer(newURL);
517 documentLoader()->replaceRequestURLForSameDocumentNavigation(newURL); 523 documentLoader()->replaceRequestURLForSameDocumentNavigation(newURL);
518 524
519 // updateBackForwardListForFragmentScroll() must happen after 525 // updateBackForwardListForFragmentScroll() must happen after
520 // replaceRequestURLForSameDocumentNavigation(), since we add based on 526 // replaceRequestURLForSameDocumentNavigation(), since we add based on
521 // the current request. 527 // the current request.
522 if (updateBackForwardList == UpdateBackForwardList) 528 if (updateBackForwardList == UpdateBackForwardList)
523 history()->updateBackForwardListForFragmentScroll(); 529 history()->updateBackForwardListForFragmentScroll(m_frame);
524 530
525 if (sameDocumentNavigationSource == SameDocumentNavigationDefault) 531 if (sameDocumentNavigationSource == SameDocumentNavigationDefault)
526 history()->updateForSameDocumentNavigation(); 532 history()->updateForSameDocumentNavigation(m_frame);
527 else if (sameDocumentNavigationSource == SameDocumentNavigationPushState) 533 else if (sameDocumentNavigationSource == SameDocumentNavigationPushState)
528 history()->pushState(data, newURL.string()); 534 history()->pushState(m_frame, data, newURL.string());
529 else if (sameDocumentNavigationSource == SameDocumentNavigationReplaceState) 535 else if (sameDocumentNavigationSource == SameDocumentNavigationReplaceState)
530 history()->replaceState(data, newURL.string()); 536 history()->replaceState(m_frame, data, newURL.string());
531 else 537 else
532 ASSERT_NOT_REACHED(); 538 ASSERT_NOT_REACHED();
533 539
534 // Generate start and stop notifications only when loader is completed so th at we 540 // Generate start and stop notifications only when loader is completed so th at we
535 // don't fire them for fragment redirection that happens in window.onload ha ndler. 541 // don't fire them for fragment redirection that happens in window.onload ha ndler.
536 // See https://bugs.webkit.org/show_bug.cgi?id=31838 542 // See https://bugs.webkit.org/show_bug.cgi?id=31838
537 if (m_frame->document()->loadEventFinished()) 543 if (m_frame->document()->loadEventFinished())
538 m_client->postProgressStartedNotification(); 544 m_client->postProgressStartedNotification();
539 545
540 m_documentLoader->clearRedirectChain(); 546 m_documentLoader->clearRedirectChain();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 if (m_frame->view()) 602 if (m_frame->view())
597 m_frame->view()->maintainScrollPositionAtAnchor(0); 603 m_frame->view()->maintainScrollPositionAtAnchor(0);
598 } 604 }
599 605
600 void FrameLoader::started() 606 void FrameLoader::started()
601 { 607 {
602 for (Frame* frame = m_frame; frame; frame = frame->tree().parent()) 608 for (Frame* frame = m_frame; frame; frame = frame->tree().parent())
603 frame->loader().m_isComplete = false; 609 frame->loader().m_isComplete = false;
604 } 610 }
605 611
606 void FrameLoader::prepareForHistoryNavigation()
607 {
608 // If there is no currentItem, but we still want to engage in
609 // history navigation we need to manufacture one, and update
610 // the state machine of this frame to impersonate having
611 // loaded it.
612 RefPtr<HistoryItem> currentItem = history()->currentItem();
613 if (!currentItem) {
614 insertDummyHistoryItem();
615 ASSERT(stateMachine()->isDisplayingInitialEmptyDocument());
616 stateMachine()->advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoa d);
617 }
618 }
619
620 void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSen dReferrer shouldSendReferrer) 612 void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSen dReferrer shouldSendReferrer)
621 { 613 {
622 if (shouldSendReferrer == NeverSendReferrer) { 614 if (shouldSendReferrer == NeverSendReferrer) {
623 request.clearHTTPReferrer(); 615 request.clearHTTPReferrer();
624 return; 616 return;
625 } 617 }
626 618
627 String argsReferrer(request.httpReferrer()); 619 String argsReferrer(request.httpReferrer());
628 if (argsReferrer.isEmpty()) 620 if (argsReferrer.isEmpty())
629 argsReferrer = outgoingReferrer(); 621 argsReferrer = outgoingReferrer();
(...skipping 11 matching lines...) Expand all
641 // See https://bugs.webkit.org/show_bug.cgi?id=32383 for the original motiva tion for this. 633 // See https://bugs.webkit.org/show_bug.cgi?id=32383 for the original motiva tion for this.
642 if (!m_frame->tree().parent() || UserGestureIndicator::processingUserGesture ()) 634 if (!m_frame->tree().parent() || UserGestureIndicator::processingUserGesture ())
643 return false; 635 return false;
644 return request.formState() && request.formState()->formSubmissionTrigger() = = SubmittedByJavaScript; 636 return request.formState() && request.formState()->formSubmissionTrigger() = = SubmittedByJavaScript;
645 } 637 }
646 638
647 FrameLoadType FrameLoader::determineFrameLoadType(const FrameLoadRequest& reques t) 639 FrameLoadType FrameLoader::determineFrameLoadType(const FrameLoadRequest& reques t)
648 { 640 {
649 if (m_frame->tree().parent() && !m_stateMachine.startedFirstRealLoad()) 641 if (m_frame->tree().parent() && !m_stateMachine.startedFirstRealLoad())
650 return FrameLoadTypeInitialInChildFrame; 642 return FrameLoadTypeInitialInChildFrame;
651 if (!m_frame->tree().parent() && !history()->currentItem()) 643 if (!m_frame->tree().parent() && !m_frame->page()->backForward().backForward ListCount())
652 return FrameLoadTypeStandard; 644 return FrameLoadTypeStandard;
653 if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData) 645 if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData)
654 return FrameLoadTypeReload; 646 return FrameLoadTypeReload;
655 if (request.lockBackForwardList() || isScriptTriggeredFormSubmissionInChildF rame(request)) 647 if (request.lockBackForwardList() || isScriptTriggeredFormSubmissionInChildF rame(request))
656 return FrameLoadTypeRedirectWithLockedBackForwardList; 648 return FrameLoadTypeRedirectWithLockedBackForwardList;
657 if (!request.requester() && shouldTreatURLAsSameAsCurrent(request.resourceRe quest().url())) 649 if (!request.requester() && shouldTreatURLAsSameAsCurrent(request.resourceRe quest().url()))
658 return FrameLoadTypeSame; 650 return FrameLoadTypeSame;
659 if (shouldTreatURLAsSameAsCurrent(request.substituteData().failingURL()) && m_loadType == FrameLoadTypeReload) 651 if (shouldTreatURLAsSameAsCurrent(request.substituteData().failingURL()) && m_loadType == FrameLoadTypeReload)
660 return FrameLoadTypeReload; 652 return FrameLoadTypeReload;
661 return FrameLoadTypeStandard; 653 return FrameLoadTypeStandard;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 742
751 frame->document()->addConsoleMessage(SecurityMessageSource, ErrorMessageLeve l, "Not allowed to load local resource: " + url); 743 frame->document()->addConsoleMessage(SecurityMessageSource, ErrorMessageLeve l, "Not allowed to load local resource: " + url);
752 } 744 }
753 745
754 void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, con st String& overrideEncoding) 746 void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, con st String& overrideEncoding)
755 { 747 {
756 DocumentLoader* documentLoader = activeDocumentLoader(); 748 DocumentLoader* documentLoader = activeDocumentLoader();
757 if (!documentLoader) 749 if (!documentLoader)
758 return; 750 return;
759 751
760 if (m_state == FrameStateProvisional)
761 insertDummyHistoryItem();
762
763 ResourceRequest request = documentLoader->request(); 752 ResourceRequest request = documentLoader->request();
764 // FIXME: We need to reset cache policy to prevent it from being incorrectly propagted to the reload. 753 // FIXME: We need to reset cache policy to prevent it from being incorrectly propagted to the reload.
765 // Do we need to propagate anything other than the url? 754 // Do we need to propagate anything other than the url?
766 request.setCachePolicy(UseProtocolCachePolicy); 755 request.setCachePolicy(UseProtocolCachePolicy);
767 if (!overrideURL.isEmpty()) 756 if (!overrideURL.isEmpty())
768 request.setURL(overrideURL); 757 request.setURL(overrideURL);
769 else if (!documentLoader->unreachableURL().isEmpty()) 758 else if (!documentLoader->unreachableURL().isEmpty())
770 request.setURL(documentLoader->unreachableURL()); 759 request.setURL(documentLoader->unreachableURL());
771 760
772 FrameLoadType type = reloadPolicy == EndToEndReload ? FrameLoadTypeReloadFro mOrigin : FrameLoadTypeReload; 761 FrameLoadType type = reloadPolicy == EndToEndReload ? FrameLoadTypeReloadFro mOrigin : FrameLoadTypeReload;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 if (pdl != m_provisionalDocumentLoader) 860 if (pdl != m_provisionalDocumentLoader)
872 return; 861 return;
873 if (m_documentLoader) 862 if (m_documentLoader)
874 m_documentLoader->detachFromFrame(); 863 m_documentLoader->detachFromFrame();
875 m_documentLoader = m_provisionalDocumentLoader.release(); 864 m_documentLoader = m_provisionalDocumentLoader.release();
876 m_state = FrameStateCommittedPage; 865 m_state = FrameStateCommittedPage;
877 866
878 if (isLoadingMainFrame()) 867 if (isLoadingMainFrame())
879 m_frame->page()->chrome().client().needTouchEvents(false); 868 m_frame->page()->chrome().client().needTouchEvents(false);
880 869
881 history()->updateForCommit(); 870 history()->updateForCommit(m_frame);
882 m_client->transitionToCommittedForNewPage(); 871 m_client->transitionToCommittedForNewPage();
883 872
884 m_frame->navigationScheduler().cancel(); 873 m_frame->navigationScheduler().cancel();
885 m_frame->editor().clearLastEditCommand(); 874 m_frame->editor().clearLastEditCommand();
886 875
887 // If we are still in the process of initializing an empty document then 876 // If we are still in the process of initializing an empty document then
888 // its frame is not in a consistent state for rendering, so avoid setJSStatu sBarText 877 // its frame is not in a consistent state for rendering, so avoid setJSStatu sBarText
889 // since it may cause clients to attempt to render the frame. 878 // since it may cause clients to attempt to render the frame.
890 if (!m_stateMachine.creatingInitialEmptyDocument()) { 879 if (!m_stateMachine.creatingInitialEmptyDocument()) {
891 DOMWindow* window = m_frame->domWindow(); 880 DOMWindow* window = m_frame->domWindow();
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 975
987 m_state = FrameStateComplete; 976 m_state = FrameStateComplete;
988 977
989 // FIXME: Is this subsequent work important if we already navigated away? 978 // FIXME: Is this subsequent work important if we already navigated away?
990 // Maybe there are bugs because of that, or extra work we can skip because 979 // Maybe there are bugs because of that, or extra work we can skip because
991 // the new page is ready. 980 // the new page is ready.
992 981
993 // If the user had a scroll point, scroll to it, overriding the anchor point if any. 982 // If the user had a scroll point, scroll to it, overriding the anchor point if any.
994 if (m_frame->page()) { 983 if (m_frame->page()) {
995 if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeRelo ad || m_loadType == FrameLoadTypeReloadFromOrigin) 984 if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeRelo ad || m_loadType == FrameLoadTypeReloadFromOrigin)
996 history()->restoreScrollPositionAndViewState(); 985 history()->restoreScrollPositionAndViewState(m_frame);
997 } 986 }
998 987
999 if (!m_stateMachine.committedFirstRealDocumentLoad()) 988 if (!m_stateMachine.committedFirstRealDocumentLoad())
1000 return; 989 return;
1001 990
1002 m_progressTracker->progressCompleted(); 991 m_progressTracker->progressCompleted();
1003 992
1004 const ResourceError& error = m_documentLoader->mainDocumentError(); 993 const ResourceError& error = m_documentLoader->mainDocumentError();
1005 if (!error.isNull()) 994 if (!error.isNull())
1006 m_client->dispatchDidFailLoad(error); 995 m_client->dispatchDidFailLoad(error);
1007 else 996 else
1008 m_client->dispatchDidFinishLoad(); 997 m_client->dispatchDidFinishLoad();
1009 m_loadType = FrameLoadTypeStandard; 998 m_loadType = FrameLoadTypeStandard;
1010 } 999 }
1011 1000
1012 void FrameLoader::didFirstLayout() 1001 void FrameLoader::didFirstLayout()
1013 { 1002 {
1014 if (!m_frame->page()) 1003 if (!m_frame->page())
1015 return; 1004 return;
1016 1005
1017 if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload | | m_loadType == FrameLoadTypeReloadFromOrigin) 1006 if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload | | m_loadType == FrameLoadTypeReloadFromOrigin)
1018 history()->restoreScrollPositionAndViewState(); 1007 history()->restoreScrollPositionAndViewState(m_frame);
1019 } 1008 }
1020 1009
1021 void FrameLoader::detachChildren() 1010 void FrameLoader::detachChildren()
1022 { 1011 {
1023 typedef Vector<RefPtr<Frame> > FrameVector; 1012 typedef Vector<RefPtr<Frame> > FrameVector;
1024 FrameVector childrenToDetach; 1013 FrameVector childrenToDetach;
1025 childrenToDetach.reserveCapacity(m_frame->tree().childCount()); 1014 childrenToDetach.reserveCapacity(m_frame->tree().childCount());
1026 for (Frame* child = m_frame->tree().lastChild(); child; child = child->tree( ).previousSibling()) 1015 for (Frame* child = m_frame->tree().lastChild(); child; child = child->tree( ).previousSibling())
1027 childrenToDetach.append(child); 1016 childrenToDetach.append(child);
1028 FrameVector::iterator end = childrenToDetach.end(); 1017 FrameVector::iterator end = childrenToDetach.end();
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 if (!m_documentLoader->shouldContinueForNavigationPolicy(request, DocumentLo ader::PolicyCheckFragment)) 1204 if (!m_documentLoader->shouldContinueForNavigationPolicy(request, DocumentLo ader::PolicyCheckFragment))
1216 return; 1205 return;
1217 1206
1218 // If we have a provisional request for a different document, a fragment scr oll should cancel it. 1207 // If we have a provisional request for a different document, a fragment scr oll should cancel it.
1219 if (m_provisionalDocumentLoader && !equalIgnoringFragmentIdentifier(m_provis ionalDocumentLoader->request().url(), request.url())) { 1208 if (m_provisionalDocumentLoader && !equalIgnoringFragmentIdentifier(m_provis ionalDocumentLoader->request().url(), request.url())) {
1220 m_provisionalDocumentLoader->stopLoading(); 1209 m_provisionalDocumentLoader->stopLoading();
1221 if (m_provisionalDocumentLoader) 1210 if (m_provisionalDocumentLoader)
1222 m_provisionalDocumentLoader->detachFromFrame(); 1211 m_provisionalDocumentLoader->detachFromFrame();
1223 m_provisionalDocumentLoader = 0; 1212 m_provisionalDocumentLoader = 0;
1224 } 1213 }
1225 history()->setProvisionalItem(0); 1214 history()->clearProvisionalEntry();
1226 loadInSameDocument(request.url(), 0, isNewNavigation, clientRedirect); 1215 loadInSameDocument(request.url(), 0, isNewNavigation, clientRedirect);
1227 } 1216 }
1228 1217
1229 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const S tring& httpMethod, FrameLoadType loadType, const KURL& url) 1218 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const S tring& httpMethod, FrameLoadType loadType, const KURL& url)
1230 { 1219 {
1231 ASSERT(loadType != FrameLoadTypeBackForward); 1220 ASSERT(loadType != FrameLoadTypeBackForward);
1232 ASSERT(loadType != FrameLoadTypeReloadFromOrigin); 1221 ASSERT(loadType != FrameLoadTypeReloadFromOrigin);
1233 // We don't do this if we are submitting a form with method other than "GET" , explicitly reloading, 1222 // We don't do this if we are submitting a form with method other than "GET" , explicitly reloading,
1234 // currently displaying a frameset, or if the URL does not have a fragment. 1223 // currently displaying a frameset, or if the URL does not have a fragment.
1235 return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET")) 1224 return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET"))
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1408 m_frame->document()->addConsoleMessageWithRequestIdentifier(JSMessageSou rce, ErrorMessageLevel, "Invalid 'X-Frame-Options' header encountered when loadi ng '" + url.elidedString() + "': '" + content + "' is not a recognized directive . The header will be ignored.", requestIdentifier); 1397 m_frame->document()->addConsoleMessageWithRequestIdentifier(JSMessageSou rce, ErrorMessageLevel, "Invalid 'X-Frame-Options' header encountered when loadi ng '" + url.elidedString() + "': '" + content + "' is not a recognized directive . The header will be ignored.", requestIdentifier);
1409 return false; 1398 return false;
1410 default: 1399 default:
1411 ASSERT_NOT_REACHED(); 1400 ASSERT_NOT_REACHED();
1412 return false; 1401 return false;
1413 } 1402 }
1414 } 1403 }
1415 1404
1416 bool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const 1405 bool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const
1417 { 1406 {
1418 if (!history()->currentItem()) 1407 HistoryItem* item = history()->currentItem(m_frame);
1408 if (!item)
1419 return false; 1409 return false;
1420 return url == history()->currentItem()->url() || url == history()->currentIt em()->originalURL(); 1410 return url == item->url() || url == item->originalURL();
1421 } 1411 }
1422 1412
1423 bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const 1413 bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const
1424 { 1414 {
1425 if (!equalIgnoringCase(url.string(), "about:srcdoc")) 1415 if (!equalIgnoringCase(url.string(), "about:srcdoc"))
1426 return false; 1416 return false;
1427 HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement(); 1417 HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement();
1428 if (!ownerElement) 1418 if (!ownerElement)
1429 return false; 1419 return false;
1430 if (!ownerElement->hasTagName(iframeTag)) 1420 if (!ownerElement->hasTagName(iframeTag))
(...skipping 23 matching lines...) Expand all
1454 } 1444 }
1455 } 1445 }
1456 ASSERT(frame != m_frame); 1446 ASSERT(frame != m_frame);
1457 } 1447 }
1458 1448
1459 if (!activeDocument->canNavigate(frame)) 1449 if (!activeDocument->canNavigate(frame))
1460 return 0; 1450 return 0;
1461 return frame; 1451 return frame;
1462 } 1452 }
1463 1453
1464 void FrameLoader::loadHistoryItem(HistoryItem* item) 1454 void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoad Type)
1465 { 1455 {
1466 HistoryItem* currentItem = history()->currentItem(); 1456 if (historyLoadType == HistorySameDocumentLoad) {
1467
1468 if (currentItem && item->shouldDoSameDocumentNavigationTo(currentItem)) {
1469 history()->setCurrentItem(item);
1470 loadInSameDocument(item->url(), item->stateObject(), false, NotClientRed irect); 1457 loadInSameDocument(item->url(), item->stateObject(), false, NotClientRed irect);
1471 return; 1458 return;
1472 } 1459 }
1473 1460
1474 // Remember this item so we can traverse any child items as child frames loa d
1475 history()->setProvisionalItem(item);
1476
1477 RefPtr<FormData> formData = item->formData(); 1461 RefPtr<FormData> formData = item->formData();
1478 ResourceRequest request(item->url()); 1462 ResourceRequest request(item->url());
1479 request.setHTTPReferrer(item->referrer()); 1463 request.setHTTPReferrer(item->referrer());
1480 if (formData) { 1464 if (formData) {
1481 request.setHTTPMethod("POST"); 1465 request.setHTTPMethod("POST");
1482 request.setHTTPBody(formData); 1466 request.setHTTPBody(formData);
1483 request.setHTTPContentType(item->formContentType()); 1467 request.setHTTPContentType(item->formContentType());
1484 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString (item->referrer()); 1468 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString (item->referrer());
1485 addHTTPOriginIfNeeded(request, securityOrigin->toString()); 1469 addHTTPOriginIfNeeded(request, securityOrigin->toString());
1486 } 1470 }
1487 1471
1488 loadWithNavigationAction(NavigationAction(request, FrameLoadTypeBackForward, formData), FrameLoadTypeBackForward, 0, SubstituteData()); 1472 loadWithNavigationAction(NavigationAction(request, FrameLoadTypeBackForward, formData), FrameLoadTypeBackForward, 0, SubstituteData());
1489 } 1473 }
1490 1474
1491 void FrameLoader::insertDummyHistoryItem()
1492 {
1493 RefPtr<HistoryItem> currentItem = HistoryItem::create();
1494 history()->setCurrentItem(currentItem.get());
1495 }
1496
1497 void FrameLoader::dispatchDocumentElementAvailable() 1475 void FrameLoader::dispatchDocumentElementAvailable()
1498 { 1476 {
1499 m_client->documentElementAvailable(); 1477 m_client->documentElementAvailable();
1500 } 1478 }
1501 1479
1502 void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() 1480 void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds()
1503 { 1481 {
1504 if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript)) 1482 if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript))
1505 return; 1483 return;
1506 1484
(...skipping 20 matching lines...) Expand all
1527 { 1505 {
1528 SandboxFlags flags = m_forcedSandboxFlags; 1506 SandboxFlags flags = m_forcedSandboxFlags;
1529 if (Frame* parentFrame = m_frame->tree().parent()) 1507 if (Frame* parentFrame = m_frame->tree().parent())
1530 flags |= parentFrame->document()->sandboxFlags(); 1508 flags |= parentFrame->document()->sandboxFlags();
1531 if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement()) 1509 if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement())
1532 flags |= ownerElement->sandboxFlags(); 1510 flags |= ownerElement->sandboxFlags();
1533 return flags; 1511 return flags;
1534 } 1512 }
1535 1513
1536 } // namespace WebCore 1514 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/loader/FrameLoader.h ('k') | Source/core/loader/FrameLoaderTypes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698