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

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

Issue 12090050: Revert 138962 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1397/
Patch Set: Created 7 years, 10 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/WebCore/loader/FrameLoader.h ('k') | Source/WebCore/loader/MainResourceLoader.cpp » ('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 836 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 } 847 }
848 #endif // ENABLE(WEB_ARCHIVE) 848 #endif // ENABLE(WEB_ARCHIVE)
849 849
850 HistoryItem* parentItem = history()->currentItem(); 850 HistoryItem* parentItem = history()->currentItem();
851 // If we're moving in the back/forward list, we might want to replace the co ntent 851 // If we're moving in the back/forward list, we might want to replace the co ntent
852 // of this child frame with whatever was there at that point. 852 // of this child frame with whatever was there at that point.
853 if (parentItem && parentItem->children().size() && isBackForwardLoadType(loa dType()) 853 if (parentItem && parentItem->children().size() && isBackForwardLoadType(loa dType())
854 && !m_frame->document()->loadEventFinished()) { 854 && !m_frame->document()->loadEventFinished()) {
855 HistoryItem* childItem = parentItem->childItemWithTarget(childFrame->tre e()->uniqueName()); 855 HistoryItem* childItem = parentItem->childItemWithTarget(childFrame->tre e()->uniqueName());
856 if (childItem) { 856 if (childItem) {
857 childFrame->loader()->loadDifferentDocumentItem(childItem, loadType( ), MayAttemptCacheOnlyLoadForFormSubmissionItem); 857 childFrame->loader()->loadDifferentDocumentItem(childItem, loadType( ));
858 return; 858 return;
859 } 859 }
860 } 860 }
861 861
862 childFrame->loader()->loadURL(url, referer, "_self", false, FrameLoadTypeRed irectWithLockedBackForwardList, 0, 0); 862 childFrame->loader()->loadURL(url, referer, "_self", false, FrameLoadTypeRed irectWithLockedBackForwardList, 0, 0);
863 } 863 }
864 864
865 #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML) 865 #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML)
866 void FrameLoader::loadArchive(PassRefPtr<Archive> archive) 866 void FrameLoader::loadArchive(PassRefPtr<Archive> archive)
867 { 867 {
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
1456 void FrameLoader::reloadWithOverrideEncoding(const String& encoding) 1456 void FrameLoader::reloadWithOverrideEncoding(const String& encoding)
1457 { 1457 {
1458 if (!m_documentLoader) 1458 if (!m_documentLoader)
1459 return; 1459 return;
1460 1460
1461 ResourceRequest request = m_documentLoader->request(); 1461 ResourceRequest request = m_documentLoader->request();
1462 KURL unreachableURL = m_documentLoader->unreachableURL(); 1462 KURL unreachableURL = m_documentLoader->unreachableURL();
1463 if (!unreachableURL.isEmpty()) 1463 if (!unreachableURL.isEmpty())
1464 request.setURL(unreachableURL); 1464 request.setURL(unreachableURL);
1465 1465
1466 // FIXME: If the resource is a result of form submission and is not cached, the form will be silently resubmitted.
1467 // We should ask the user for confirmation in this case.
1468 request.setCachePolicy(ReturnCacheDataElseLoad); 1466 request.setCachePolicy(ReturnCacheDataElseLoad);
1469 1467
1470 RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, defa ultSubstituteDataForURL(request.url())); 1468 RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, defa ultSubstituteDataForURL(request.url()));
1471 setPolicyDocumentLoader(loader.get()); 1469 setPolicyDocumentLoader(loader.get());
1472 1470
1473 loader->setOverrideEncoding(encoding); 1471 loader->setOverrideEncoding(encoding);
1474 1472
1475 loadWithDocumentLoader(loader.get(), FrameLoadTypeReload, 0); 1473 loadWithDocumentLoader(loader.get(), FrameLoadTypeReload, 0);
1476 } 1474 }
1477 1475
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after
2415 m_client->detachedFromParent3(); 2413 m_client->detachedFromParent3();
2416 } 2414 }
2417 2415
2418 void FrameLoader::addExtraFieldsToSubresourceRequest(ResourceRequest& request) 2416 void FrameLoader::addExtraFieldsToSubresourceRequest(ResourceRequest& request)
2419 { 2417 {
2420 addExtraFieldsToRequest(request, m_loadType, false); 2418 addExtraFieldsToRequest(request, m_loadType, false);
2421 } 2419 }
2422 2420
2423 void FrameLoader::addExtraFieldsToMainResourceRequest(ResourceRequest& request) 2421 void FrameLoader::addExtraFieldsToMainResourceRequest(ResourceRequest& request)
2424 { 2422 {
2425 // FIXME: Using m_loadType seems wrong for some callers.
2426 // If we are only preparing to load the main resource, that is previous load 's load type!
2427 addExtraFieldsToRequest(request, m_loadType, true); 2423 addExtraFieldsToRequest(request, m_loadType, true);
2428 } 2424 }
2429 2425
2430 void FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadTyp e loadType, bool mainResource) 2426 void FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadTyp e loadType, bool mainResource)
2431 { 2427 {
2432 // Don't set the cookie policy URL if it's already been set. 2428 // Don't set the cookie policy URL if it's already been set.
2433 // But make sure to set it on all requests regardless of protocol, as it has significance beyond the cookie policy (<rdar://problem/6616664>). 2429 // But make sure to set it on all requests, as it has significance beyond th e cookie policy for all protocols (<rdar://problem/6616664>).
2434 if (request.firstPartyForCookies().isEmpty()) { 2430 if (request.firstPartyForCookies().isEmpty()) {
2435 if (mainResource && isLoadingMainFrame()) 2431 if (mainResource && isLoadingMainFrame())
2436 request.setFirstPartyForCookies(request.url()); 2432 request.setFirstPartyForCookies(request.url());
2437 else if (Document* document = m_frame->document()) 2433 else if (Document* document = m_frame->document())
2438 request.setFirstPartyForCookies(document->firstPartyForCookies()); 2434 request.setFirstPartyForCookies(document->firstPartyForCookies());
2439 } 2435 }
2440 2436
2441 // The remaining modifications are only necessary for HTTP and HTTPS. 2437 // The remaining modifications are only necessary for HTTP and HTTPS.
2442 if (!request.url().isEmpty() && !request.url().protocolIsInHTTPFamily()) 2438 if (!request.url().isEmpty() && !request.url().protocolIsInHTTPFamily())
2443 return; 2439 return;
2444 2440
2445 applyUserAgent(request); 2441 applyUserAgent(request);
2446 2442
2443 // If we inherit cache policy from a main resource, we use the DocumentLoade r's
2444 // original request cache policy for two reasons:
2445 // 1. For POST requests, we mutate the cache policy for the main resource,
2446 // but we do not want this to apply to subresources
2447 // 2. Delegates that modify the cache policy using willSendRequest: should
2448 // not affect any other resources. Such changes need to be done
2449 // per request.
2447 if (!mainResource) { 2450 if (!mainResource) {
2448 if (request.isConditional()) 2451 if (request.isConditional())
2449 request.setCachePolicy(ReloadIgnoringCacheData); 2452 request.setCachePolicy(ReloadIgnoringCacheData);
2450 else if (documentLoader()->isLoadingInAPISense()) { 2453 else if (documentLoader()->isLoadingInAPISense())
2451 // If we inherit cache policy from a main resource, we use the Docum entLoader's 2454 request.setCachePolicy(documentLoader()->originalRequest().cachePoli cy());
2452 // original request cache policy for two reasons: 2455 else
2453 // 1. For POST requests, we mutate the cache policy for the main res ource,
2454 // but we do not want this to apply to subresources
2455 // 2. Delegates that modify the cache policy using willSendRequest: should
2456 // not affect any other resources. Such changes need to be done
2457 // per request.
2458 ResourceRequestCachePolicy mainDocumentOriginalCachePolicy = documen tLoader()->originalRequest().cachePolicy();
2459 // Back-forward navigations try to load main resource from cache onl y to avoid re-submitting form data, and start over (with a warning dialog) if th at fails.
2460 // This policy is set on initial request too, but should not be inhe rited.
2461 ResourceRequestCachePolicy subresourceCachePolicy = (mainDocumentOri ginalCachePolicy == ReturnCacheDataDontLoad) ? ReturnCacheDataElseLoad : mainDoc umentOriginalCachePolicy;
2462 request.setCachePolicy(subresourceCachePolicy);
2463 } else
2464 request.setCachePolicy(UseProtocolCachePolicy); 2456 request.setCachePolicy(UseProtocolCachePolicy);
2465
2466 // FIXME: Other FrameLoader functions have duplicated code for setting cache policy of main request when reloading.
2467 // It seems better to manage it explicitly than to hide the logic inside add ExtraFieldsToRequest().
2468 } else if (loadType == FrameLoadTypeReload || loadType == FrameLoadTypeReloa dFromOrigin || request.isConditional()) 2457 } else if (loadType == FrameLoadTypeReload || loadType == FrameLoadTypeReloa dFromOrigin || request.isConditional())
2469 request.setCachePolicy(ReloadIgnoringCacheData); 2458 request.setCachePolicy(ReloadIgnoringCacheData);
2470 2459 else if (isBackForwardLoadType(loadType) && m_stateMachine.committedFirstRea lDocumentLoad())
2460 request.setCachePolicy(ReturnCacheDataElseLoad);
2461
2471 if (request.cachePolicy() == ReloadIgnoringCacheData) { 2462 if (request.cachePolicy() == ReloadIgnoringCacheData) {
2472 if (loadType == FrameLoadTypeReload) 2463 if (loadType == FrameLoadTypeReload)
2473 request.setHTTPHeaderField("Cache-Control", "max-age=0"); 2464 request.setHTTPHeaderField("Cache-Control", "max-age=0");
2474 else if (loadType == FrameLoadTypeReloadFromOrigin) { 2465 else if (loadType == FrameLoadTypeReloadFromOrigin) {
2475 request.setHTTPHeaderField("Cache-Control", "no-cache"); 2466 request.setHTTPHeaderField("Cache-Control", "no-cache");
2476 request.setHTTPHeaderField("Pragma", "no-cache"); 2467 request.setHTTPHeaderField("Pragma", "no-cache");
2477 } 2468 }
2478 } 2469 }
2479 2470
2480 if (mainResource) 2471 if (mainResource)
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after
3044 // loadInSameDocument() actually changes the URL and notifies load delegates of a "fake" load 3035 // loadInSameDocument() actually changes the URL and notifies load delegates of a "fake" load
3045 loadInSameDocument(item->url(), item->stateObject(), false); 3036 loadInSameDocument(item->url(), item->stateObject(), false);
3046 3037
3047 // Restore user view state from the current history item here since we don't do a normal load. 3038 // Restore user view state from the current history item here since we don't do a normal load.
3048 history()->restoreScrollPositionAndViewState(); 3039 history()->restoreScrollPositionAndViewState();
3049 } 3040 }
3050 3041
3051 // FIXME: This function should really be split into a couple pieces, some of 3042 // FIXME: This function should really be split into a couple pieces, some of
3052 // which should be methods of HistoryController and some of which should be 3043 // which should be methods of HistoryController and some of which should be
3053 // methods of FrameLoader. 3044 // methods of FrameLoader.
3054 void FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loa dType, FormSubmissionCacheLoadPolicy cacheLoadPolicy) 3045 void FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loa dType)
3055 { 3046 {
3056 // Remember this item so we can traverse any child items as child frames loa d 3047 // Remember this item so we can traverse any child items as child frames loa d
3057 history()->setProvisionalItem(item); 3048 history()->setProvisionalItem(item);
3058 3049
3059 if (CachedPage* cachedPage = pageCache()->get(item)) { 3050 if (CachedPage* cachedPage = pageCache()->get(item)) {
3060 loadWithDocumentLoader(cachedPage->documentLoader(), loadType, 0); 3051 loadWithDocumentLoader(cachedPage->documentLoader(), loadType, 0);
3061 return; 3052 return;
3062 } 3053 }
3063 3054
3064 KURL itemURL = item->url(); 3055 KURL itemURL = item->url();
(...skipping 14 matching lines...) Expand all
3079 formData->generateFiles(m_frame->document()); 3070 formData->generateFiles(m_frame->document());
3080 3071
3081 request.setHTTPMethod("POST"); 3072 request.setHTTPMethod("POST");
3082 request.setHTTPBody(formData); 3073 request.setHTTPBody(formData);
3083 request.setHTTPContentType(item->formContentType()); 3074 request.setHTTPContentType(item->formContentType());
3084 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString (item->referrer()); 3075 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString (item->referrer());
3085 addHTTPOriginIfNeeded(request, securityOrigin->toString()); 3076 addHTTPOriginIfNeeded(request, securityOrigin->toString());
3086 3077
3087 // Make sure to add extra fields to the request after the Origin header is added for the FormData case. 3078 // Make sure to add extra fields to the request after the Origin header is added for the FormData case.
3088 // See https://bugs.webkit.org/show_bug.cgi?id=22194 for more discussion . 3079 // See https://bugs.webkit.org/show_bug.cgi?id=22194 for more discussion .
3089 addExtraFieldsToRequest(request, loadType, true); 3080 addExtraFieldsToRequest(request, m_loadType, true);
3090 3081
3091 // FIXME: Slight hack to test if the NSURL cache contains the page we're going to. 3082 // FIXME: Slight hack to test if the NSURL cache contains the page we're going to.
3092 // We want to know this before talking to the policy delegate, since it affects whether 3083 // We want to know this before talking to the policy delegate, since it affects whether
3093 // we show the DoYouReallyWantToRepost nag. 3084 // we show the DoYouReallyWantToRepost nag.
3094 // 3085 //
3095 // This trick has a small bug (3123893) where we might find a cache hit, but then 3086 // This trick has a small bug (3123893) where we might find a cache hit, but then
3096 // have the item vanish when we try to use it in the ensuing nav. This should be 3087 // have the item vanish when we try to use it in the ensuing nav. This should be
3097 // extremely rare, but in that case the user will get an error on the na vigation. 3088 // extremely rare, but in that case the user will get an error on the na vigation.
3098 3089
3099 if (cacheLoadPolicy == MayAttemptCacheOnlyLoadForFormSubmissionItem) { 3090 if (ResourceHandle::willLoadFromCache(request, m_frame))
3100 request.setCachePolicy(ReturnCacheDataDontLoad);
3101 action = NavigationAction(request, loadType, false); 3091 action = NavigationAction(request, loadType, false);
3102 } else { 3092 else {
3103 request.setCachePolicy(ReturnCacheDataElseLoad); 3093 request.setCachePolicy(ReloadIgnoringCacheData);
3104 action = NavigationAction(request, NavigationTypeFormResubmitted); 3094 action = NavigationAction(request, NavigationTypeFormResubmitted);
3105 } 3095 }
3106 } else { 3096 } else {
3107 switch (loadType) { 3097 switch (loadType) {
3108 case FrameLoadTypeReload: 3098 case FrameLoadTypeReload:
3109 case FrameLoadTypeReloadFromOrigin: 3099 case FrameLoadTypeReloadFromOrigin:
3110 request.setCachePolicy(ReloadIgnoringCacheData); 3100 request.setCachePolicy(ReloadIgnoringCacheData);
3111 break; 3101 break;
3112 case FrameLoadTypeBack: 3102 case FrameLoadTypeBack:
3113 case FrameLoadTypeForward: 3103 case FrameLoadTypeForward:
3114 case FrameLoadTypeIndexedBackForward: 3104 case FrameLoadTypeIndexedBackForward:
3115 // If the first load within a frame is a navigation within a bac k/forward list that was attached 3105 // If the first load within a frame is a navigation within a bac k/forward list that was attached
3116 // without any of the items being loaded then we should use the default caching policy (<rdar://problem/8131355>). 3106 // without any of the items being loaded then we should use the default caching policy (<rdar://problem/8131355>).
3117 if (m_stateMachine.committedFirstRealDocumentLoad()) 3107 if (m_stateMachine.committedFirstRealDocumentLoad() && !itemURL. protocolIs("https"))
3118 request.setCachePolicy(ReturnCacheDataElseLoad); 3108 request.setCachePolicy(ReturnCacheDataElseLoad);
3119 break; 3109 break;
3120 case FrameLoadTypeStandard: 3110 case FrameLoadTypeStandard:
3121 case FrameLoadTypeRedirectWithLockedBackForwardList: 3111 case FrameLoadTypeRedirectWithLockedBackForwardList:
3122 break; 3112 break;
3123 case FrameLoadTypeSame: 3113 case FrameLoadTypeSame:
3124 default: 3114 default:
3125 ASSERT_NOT_REACHED(); 3115 ASSERT_NOT_REACHED();
3126 } 3116 }
3127 3117
3128 addExtraFieldsToRequest(request, loadType, true); 3118 addExtraFieldsToRequest(request, m_loadType, true);
3129 3119
3130 ResourceRequest requestForOriginalURL(request); 3120 ResourceRequest requestForOriginalURL(request);
3131 requestForOriginalURL.setURL(itemOriginalURL); 3121 requestForOriginalURL.setURL(itemOriginalURL);
3132 action = NavigationAction(requestForOriginalURL, loadType, false); 3122 action = NavigationAction(requestForOriginalURL, loadType, false);
3133 } 3123 }
3134 3124
3135 loadWithNavigationAction(request, action, false, loadType, 0); 3125 loadWithNavigationAction(request, action, false, loadType, 0);
3136 } 3126 }
3137 3127
3138 // Loads content into this frame, as specified by history item 3128 // Loads content into this frame, as specified by history item
3139 void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType) 3129 void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
3140 { 3130 {
3141 m_requestedHistoryItem = item; 3131 m_requestedHistoryItem = item;
3142 HistoryItem* currentItem = history()->currentItem(); 3132 HistoryItem* currentItem = history()->currentItem();
3143 bool sameDocumentNavigation = currentItem && item->shouldDoSameDocumentNavig ationTo(currentItem); 3133 bool sameDocumentNavigation = currentItem && item->shouldDoSameDocumentNavig ationTo(currentItem);
3144 3134
3145 if (sameDocumentNavigation) 3135 if (sameDocumentNavigation)
3146 loadSameDocumentItem(item); 3136 loadSameDocumentItem(item);
3147 else 3137 else
3148 loadDifferentDocumentItem(item, loadType, MayAttemptCacheOnlyLoadForForm SubmissionItem); 3138 loadDifferentDocumentItem(item, loadType);
3149 }
3150
3151 void FrameLoader::retryAfterFailedCacheOnlyMainResourceLoad()
3152 {
3153 ASSERT(m_state == FrameStateProvisional);
3154 ASSERT(!m_loadingFromCachedPage);
3155 // We only use cache-only loads to avoid resubmitting forms.
3156 ASSERT(isBackForwardLoadType(m_loadType));
3157 ASSERT(m_history.provisionalItem()->formData());
3158 ASSERT(m_history.provisionalItem() == m_requestedHistoryItem.get());
3159
3160 FrameLoadType loadType = m_loadType;
3161 HistoryItem* item = m_history.provisionalItem();
3162
3163 stopAllLoaders(ShouldNotClearProvisionalItem);
3164 loadDifferentDocumentItem(item, loadType, MayNotAttemptCacheOnlyLoadForFormS ubmissionItem);
3165 } 3139 }
3166 3140
3167 ResourceError FrameLoader::cancelledError(const ResourceRequest& request) const 3141 ResourceError FrameLoader::cancelledError(const ResourceRequest& request) const
3168 { 3142 {
3169 ResourceError error = m_client->cancelledError(request); 3143 ResourceError error = m_client->cancelledError(request);
3170 error.setIsCancellation(true); 3144 error.setIsCancellation(true);
3171 return error; 3145 return error;
3172 } 3146 }
3173 3147
3174 void FrameLoader::setTitle(const StringWithDirection& title) 3148 void FrameLoader::setTitle(const StringWithDirection& title)
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
3394 FloatRect newWindowRect = DOMWindow::adjustWindowRect(page, windowRect); 3368 FloatRect newWindowRect = DOMWindow::adjustWindowRect(page, windowRect);
3395 3369
3396 page->chrome()->setWindowRect(newWindowRect); 3370 page->chrome()->setWindowRect(newWindowRect);
3397 page->chrome()->show(); 3371 page->chrome()->show();
3398 3372
3399 created = true; 3373 created = true;
3400 return frame; 3374 return frame;
3401 } 3375 }
3402 3376
3403 } // namespace WebCore 3377 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/loader/FrameLoader.h ('k') | Source/WebCore/loader/MainResourceLoader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698