m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad);
}
-void FrameLoader::setHistoryItemStateForCommit(HistoryItemPolicy historyItemPolicy, bool isPushOrReplaceState, PassRefPtr<SerializedScriptValue> stateObject)
+void FrameLoader::setHistoryItemStateForCommit(HistoryCommitType historyCommitType, bool isPushOrReplaceState, PassRefPtr<SerializedScriptValue> stateObject)
{
if (m_provisionalItem)
m_currentItem = m_provisionalItem.release();
- if (m_currentItem && historyItemPolicy != CreateNewHistoryItem && m_currentItem->url() == m_documentLoader->url() && !isPushOrReplaceState)
- return;
- if (!m_currentItem || historyItemPolicy == CreateNewHistoryItem)
+ if (!m_currentItem || historyCommitType == StandardCommit)
m_currentItem = HistoryItem::create();
- else if (!isPushOrReplaceState)
+ else if (!isPushOrReplaceState && m_documentLoader->url() != m_currentItem->url())
m_currentItem->generateNewSequenceNumbers();
const KURL& unreachableURL = m_documentLoader->unreachableURL();
const KURL& url = unreachableURL.isEmpty() ? m_documentLoader->url() : unreachableURL;
m_currentItem->setTarget(m_frame->tree().uniqueName());
m_currentItem->setTargetFrameID(m_frame->frameID());
m_currentItem->setOriginalURLString(originalURL.string());
- m_currentItem->setStateObject(stateObject);
- m_currentItem->setReferrer(m_documentLoader->request().httpReferrer());
+ if (isPushOrReplaceState)
+ m_currentItem->setStateObject(stateObject);
+ m_currentItem->setReferrer(Referrer(m_documentLoader->request().httpReferrer(), m_documentLoader->request().referrerPolicy()));
m_currentItem->setFormInfoFromRequest(isPushOrReplaceState ? ResourceRequest() : m_documentLoader->request());
}
-static HistoryCommitType loadTypeToCommitType(FrameLoadType type, bool isStandardLoadWithValidURL)
+static HistoryCommitType loadTypeToCommitType(FrameLoadType type, bool isValidHistoryURL)
{
switch (type) {
case FrameLoadTypeStandard:
- return isStandardLoadWithValidURL ? StandardCommit : HistoryInertCommit;
+ return isValidHistoryURL ? StandardCommit : HistoryInertCommit;
case FrameLoadTypeInitialInChildFrame:
return InitialCommitInChildFrame;
case FrameLoadTypeBackForward:
{
if (m_stateMachine.creatingInitialEmptyDocument())
return;
- HistoryItemPolicy historyItemPolicy = DoNotCreateNewHistoryItem;
- bool isStandardLoadWithValidURL = m_loadType == FrameLoadTypeStandard && m_documentLoader->isURLValidForNewHistoryEntry();
- if ((!m_currentItem && m_loadType == FrameLoadTypeInitialInChildFrame) || isStandardLoadWithValidURL)
- historyItemPolicy = CreateNewHistoryItem;
- setHistoryItemStateForCommit(historyItemPolicy);
+
+ HistoryCommitType historyCommitType = loadTypeToCommitType(m_loadType, m_documentLoader->isURLValidForNewHistoryEntry());
+ setHistoryItemStateForCommit(historyCommitType);
if (!m_stateMachine.committedMultipleRealLoads() && m_loadType == FrameLoadTypeStandard)
m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedMultipleRealLoads);
- m_client->dispatchDidCommitLoad(m_frame, m_currentItem.get(), loadTypeToCommitType(m_loadType, isStandardLoadWithValidURL));
+ m_client->dispatchDidCommitLoad(m_frame, m_currentItem.get(), historyCommitType);
InspectorInstrumentation::didCommitLoad(m_frame, m_documentLoader.get());
m_frame->page()->didCommitLoad(m_frame);
if (m_frame->document()->loadEventFinished())
m_client->postProgressStartedNotification(NavigationWithinSameDocument);
- HistoryCommitType historyCommitType = HistoryInertCommit;
- HistoryItemPolicy historyItemPolicy = DoNotCreateNewHistoryItem;
- if (updateBackForwardList == UpdateBackForwardList || (sameDocumentNavigationSource == SameDocumentNavigationPushState && m_currentItem)) {
- historyCommitType = StandardCommit;
- historyItemPolicy = CreateNewHistoryItem;
- }
- setHistoryItemStateForCommit(historyItemPolicy, sameDocumentNavigationSource != SameDocumentNavigationDefault, data);
+ HistoryCommitType historyCommitType = updateBackForwardList == UpdateBackForwardList && m_currentItem ? StandardCommit : HistoryInertCommit;
+ setHistoryItemStateForCommit(historyCommitType, sameDocumentNavigationSource == SameDocumentNavigationHistoryApi, data);
m_client->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitType);
m_client->dispatchDidReceiveTitle(m_frame->document()->title());
if (m_frame->document()->loadEventFinished())
argsReferrer = originDocument->outgoingReferrer();
String referrer = SecurityPolicy::generateReferrerHeader(originDocument->referrerPolicy(), request.url(), argsReferrer);
- request.setHTTPReferrer(AtomicString(referrer));
+ request.setHTTPReferrer(Referrer(referrer, originDocument->referrerPolicy()));
RefPtr<SecurityOrigin> referrerOrigin = SecurityOrigin::createFromString(referrer);
addHTTPOriginIfNeeded(request, referrerOrigin->toAtomicString());
}
frame->document()->addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, "Not allowed to load local resource: " + url);
}
+static ResourceRequest requestFromHistoryItem(HistoryItem* item, ResourceRequestCachePolicy cachePolicy)
+{
+ RefPtr<FormData> formData = item->formData();
+ ResourceRequest request(item->url(), item->referrer());
+ request.setCachePolicy(cachePolicy);
+ if (formData) {
+ request.setHTTPMethod("POST");
+ request.setHTTPBody(formData);
+ request.setHTTPContentType(item->formContentType());
+ RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString(item->referrer().referrer);
+ FrameLoader::addHTTPOriginIfNeeded(request, securityOrigin->toAtomicString());
+ }
+ return request;
+}
+
void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, const AtomicString& overrideEncoding)
{
- if (!m_documentLoader)
+ if (!m_currentItem)
return;
- ResourceRequest request = m_documentLoader->request();
- // FIXME: We need to reset cache policy to prevent it from being incorrectly propagted to the reload.
- // Do we need to propagate anything other than the url?
- request.setCachePolicy(UseProtocolCachePolicy);
- if (!overrideURL.isEmpty())
+ ResourceRequest request = requestFromHistoryItem(m_currentItem.get(), ReloadIgnoringCacheData);
+ if (!overrideURL.isEmpty()) {
request.setURL(overrideURL);
- else if (!m_documentLoader->unreachableURL().isEmpty())
- request.setURL(m_documentLoader->unreachableURL());
+ request.clearHTTPReferrer();
+ }
FrameLoadType type = reloadPolicy == EndToEndReload ? FrameLoadTypeReloadFromOrigin : FrameLoadTypeReload;
- NavigationAction action(request, type, request.httpMethod() == "POST");
- loadWithNavigationAction(action, type, 0, SubstituteData(), NotClientRedirect, overrideEncoding);
+ loadWithNavigationAction(NavigationAction(request, type), type, 0, SubstituteData(), NotClientRedirect, overrideEncoding);
}
void FrameLoader::stopAllLoaders()
child->page()->decrementSubframeCount();
child->willDetachFrameHost();
child->loader().detachClient();
-
- m_frame->tree().removeChild(child);
}
// Called every time a resource is completely loaded or an error is received.
restoreScrollPositionAndViewState(ForcedRestoreForSameDocumentHistoryNavigation);
return;
}
-
- RefPtr<FormData> formData = item->formData();
- ResourceRequest request(item->url());
- request.setHTTPReferrer(item->referrer());
- request.setCachePolicy(cachePolicy);
- if (formData) {
- request.setHTTPMethod("POST");
- request.setHTTPBody(formData);
- request.setHTTPContentType(item->formContentType());
- RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString(item->referrer());
- addHTTPOriginIfNeeded(request, securityOrigin->toAtomicString());
- }
-
- loadWithNavigationAction(NavigationAction(request, FrameLoadTypeBackForward, formData), FrameLoadTypeBackForward, 0, SubstituteData());
+ loadWithNavigationAction(NavigationAction(requestFromHistoryItem(item, cachePolicy), FrameLoadTypeBackForward), FrameLoadTypeBackForward, 0, SubstituteData());
}
void FrameLoader::dispatchDocumentElementAvailable()
InspectorInstrumentation::didClearWindowObjectInMainWorld(m_frame);
Vector<RefPtr<DOMWrapperWorld> > worlds;
- DOMWrapperWorld::getAllWorlds(worlds);
+ DOMWrapperWorld::getAllWorldsInMainThread(worlds);
for (size_t i = 0; i < worlds.size(); ++i)
m_client->dispatchDidClearWindowObjectInWorld(worlds[i].get());
}