Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / loader / FrameLoader.cpp
index d818758..6887bdd 100644 (file)
@@ -291,15 +291,13 @@ void FrameLoader::clear()
         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;
@@ -308,16 +306,17 @@ void FrameLoader::setHistoryItemStateForCommit(HistoryItemPolicy historyItemPoli
     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:
@@ -332,16 +331,14 @@ void FrameLoader::receivedFirstData()
 {
     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);
@@ -566,13 +563,8 @@ void FrameLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocume
     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())
@@ -653,7 +645,7 @@ void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSen
         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());
 }
@@ -776,23 +768,34 @@ void FrameLoader::reportLocalLoadFailed(Frame* frame, const String& url)
     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()
@@ -1036,8 +1039,6 @@ void FrameLoader::closeAndRemoveChild(Frame* child)
         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.
@@ -1412,20 +1413,7 @@ void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoad
         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()
@@ -1443,7 +1431,7 @@ void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds()
     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());
 }