Index: third_party/WebKit/Source/core/loader/FrameLoader.cpp |
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
index 0e0560f4b55ba6693a536244a8cd4c9d10630466..53f7684b8db3ea884fdd141dbc5b29bc0ca880a9 100644 |
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
@@ -138,23 +138,6 @@ static void checkForLegacyProtocolInSubresource( |
document, UseCounter::LegacyProtocolEmbeddedAsSubresource); |
} |
-// static |
-ResourceRequest FrameLoader::resourceRequestFromHistoryItem( |
- HistoryItem* item, |
- WebCachePolicy cachePolicy) { |
- RefPtr<EncodedFormData> formData = item->formData(); |
- ResourceRequest request(item->url()); |
- request.setHTTPReferrer(item->referrer()); |
- request.setCachePolicy(cachePolicy); |
- if (formData) { |
- request.setHTTPMethod(HTTPNames::POST); |
- request.setHTTPBody(formData); |
- request.setHTTPContentType(item->formContentType()); |
- request.addHTTPOriginIfNeeded(item->referrer().referrer); |
- } |
- return request; |
-} |
- |
ResourceRequest FrameLoader::resourceRequestForReload( |
FrameLoadType frameLoadType, |
const KURL& overrideURL, |
@@ -164,10 +147,10 @@ ResourceRequest FrameLoader::resourceRequestForReload( |
frameLoadType == FrameLoadTypeReloadBypassingCache |
? WebCachePolicy::BypassingCache |
: WebCachePolicy::ValidatingCacheData; |
- if (!m_currentItem) |
+ if (!m_documentLoader || !m_documentLoader->historyItem()) |
return ResourceRequest(); |
ResourceRequest request = |
- resourceRequestFromHistoryItem(m_currentItem.get(), cachePolicy); |
+ m_documentLoader->historyItem()->generateResourceRequest(cachePolicy); |
// ClientRedirectPolicy is an indication that this load was triggered by some |
// direct interaction with the page. If this reload is not a client redirect, |
@@ -217,8 +200,6 @@ DEFINE_TRACE(FrameLoader) { |
visitor->trace(m_progressTracker); |
visitor->trace(m_documentLoader); |
visitor->trace(m_provisionalDocumentLoader); |
- visitor->trace(m_currentItem); |
- visitor->trace(m_provisionalItem); |
visitor->trace(m_deferredHistoryLoad); |
} |
@@ -277,23 +258,23 @@ void FrameLoader::setDefersLoading(bool defers) { |
} |
void FrameLoader::saveScrollState() { |
- if (!m_currentItem || !m_frame->view()) |
+ if (!m_documentLoader || !m_documentLoader->historyItem() || !m_frame->view()) |
return; |
// Shouldn't clobber anything if we might still restore later. |
- if (m_documentLoader && |
- needsHistoryItemRestore(m_documentLoader->loadType()) && |
+ if (needsHistoryItemRestore(m_documentLoader->loadType()) && |
!m_documentLoader->initialScrollState().wasScrolledByUser) |
return; |
+ HistoryItem* historyItem = m_documentLoader->historyItem(); |
if (ScrollableArea* layoutScrollableArea = |
m_frame->view()->layoutViewportScrollableArea()) |
- m_currentItem->setScrollOffset(layoutScrollableArea->getScrollOffset()); |
- m_currentItem->setVisualViewportScrollOffset(toScrollOffset( |
+ historyItem->setScrollOffset(layoutScrollableArea->getScrollOffset()); |
+ historyItem->setVisualViewportScrollOffset(toScrollOffset( |
m_frame->page()->visualViewport().visibleRect().location())); |
if (m_frame->isMainFrame()) |
- m_currentItem->setPageScaleFactor(m_frame->page()->pageScaleFactor()); |
+ historyItem->setPageScaleFactor(m_frame->page()->pageScaleFactor()); |
client()->didUpdateCurrentHistoryItem(); |
} |
@@ -396,111 +377,6 @@ void FrameLoader::replaceDocumentWhileExecutingJavaScriptURL( |
documentLoader->replaceDocumentWhileExecutingJavaScriptURL(init, source); |
} |
-void FrameLoader::clearProvisionalHistoryItem() { |
- m_provisionalItem.clear(); |
-} |
- |
-void FrameLoader::setHistoryItemStateForCommit( |
- FrameLoadType loadType, |
- HistoryCommitType historyCommitType, |
- HistoryNavigationType navigationType) { |
- HistoryItem* oldItem = m_currentItem; |
- if (isBackForwardLoadType(loadType) && m_provisionalItem) |
- m_currentItem = m_provisionalItem.release(); |
- else |
- m_currentItem = HistoryItem::create(); |
- m_currentItem->setURL(m_documentLoader->urlForHistory()); |
- m_currentItem->setDocumentState(m_frame->document()->formElementsState()); |
- m_currentItem->setReferrer(SecurityPolicy::generateReferrer( |
- m_documentLoader->getRequest().getReferrerPolicy(), m_currentItem->url(), |
- m_documentLoader->getRequest().httpReferrer())); |
- m_currentItem->setFormInfoFromRequest(m_documentLoader->getRequest()); |
- |
- // Don't propagate state from the old item to the new item if there isn't an |
- // old item (obviously), or if this is a back/forward navigation, since we |
- // explicitly want to restore the state we just committed. |
- if (!oldItem || isBackForwardLoadType(loadType)) |
- return; |
- // Don't propagate state from the old item if this is a different-document |
- // navigation, unless the before and after pages are logically related. This |
- // means they have the same url (ignoring fragment) and the new item was |
- // loaded via reload or client redirect. |
- if (navigationType == HistoryNavigationType::DifferentDocument && |
- (historyCommitType != HistoryInertCommit || |
- !equalIgnoringFragmentIdentifier(oldItem->url(), m_currentItem->url()))) |
- return; |
- m_currentItem->setDocumentSequenceNumber(oldItem->documentSequenceNumber()); |
- m_currentItem->setScrollOffset(oldItem->getScrollOffset()); |
- m_currentItem->setDidSaveScrollOrScaleState( |
- oldItem->didSaveScrollOrScaleState()); |
- m_currentItem->setVisualViewportScrollOffset( |
- oldItem->visualViewportScrollOffset()); |
- m_currentItem->setPageScaleFactor(oldItem->pageScaleFactor()); |
- m_currentItem->setScrollRestorationType(oldItem->scrollRestorationType()); |
- |
- // The item sequence number determines whether items are "the same", such |
- // back/forward navigation between items with the same item sequence number is |
- // a no-op. Only treat this as identical if the navigation did not create a |
- // back/forward entry and the url is identical or it was loaded via |
- // history.replaceState(). |
- if (historyCommitType == HistoryInertCommit && |
- (navigationType == HistoryNavigationType::HistoryApi || |
- oldItem->url() == m_currentItem->url())) { |
- m_currentItem->setStateObject(oldItem->stateObject()); |
- m_currentItem->setItemSequenceNumber(oldItem->itemSequenceNumber()); |
- } |
-} |
- |
-static HistoryCommitType loadTypeToCommitType(FrameLoadType type) { |
- switch (type) { |
- case FrameLoadTypeStandard: |
- return StandardCommit; |
- case FrameLoadTypeInitialInChildFrame: |
- case FrameLoadTypeInitialHistoryLoad: |
- return InitialCommitInChildFrame; |
- case FrameLoadTypeBackForward: |
- return BackForwardCommit; |
- default: |
- break; |
- } |
- return HistoryInertCommit; |
-} |
- |
-void FrameLoader::receivedFirstData() { |
- FrameLoadType loadType = m_documentLoader->loadType(); |
- HistoryCommitType historyCommitType = loadTypeToCommitType(loadType); |
- if (historyCommitType == StandardCommit && |
- (m_documentLoader->urlForHistory().isEmpty() || |
- (opener() && !m_currentItem && |
- m_documentLoader->originalRequest().url().isEmpty()))) |
- historyCommitType = HistoryInertCommit; |
- setHistoryItemStateForCommit(loadType, historyCommitType, |
- HistoryNavigationType::DifferentDocument); |
- |
- if (!m_stateMachine.committedMultipleRealLoads() && |
- loadType == FrameLoadTypeStandard) { |
- m_stateMachine.advanceTo( |
- FrameLoaderStateMachine::CommittedMultipleRealLoads); |
- } |
- |
- client()->dispatchDidCommitLoad(m_currentItem.get(), historyCommitType); |
- |
- // When the embedder gets notified (above) that the new navigation has |
- // committed, the embedder will drop the old Content Security Policy and |
- // therefore now is a good time to report to the embedder the Content Security |
- // Policies that have accumulated so far for the new navigation. |
- m_frame->securityContext()->contentSecurityPolicy()->reportAccumulatedHeaders( |
- client()); |
-} |
- |
-void FrameLoader::didInstallNewDocument() { |
- if (m_provisionalItem && |
- isBackForwardLoadType(m_documentLoader->loadType())) { |
- m_frame->document()->setStateForNewFormElements( |
- m_provisionalItem->getDocumentState()); |
- } |
-} |
- |
void FrameLoader::finishedParsing() { |
if (m_stateMachine.creatingInitialEmptyDocument()) |
return; |
@@ -695,12 +571,6 @@ void FrameLoader::updateForSameDocumentNavigation( |
Document* initiatingDocument) { |
TRACE_EVENT1("blink", "FrameLoader::updateForSameDocumentNavigation", "url", |
newURL.getString().ascii().data()); |
- // Update the data source's request with the new URL to fake the URL change |
- m_frame->document()->setURL(newURL); |
- documentLoader()->setReplacesCurrentHistoryItem(type != |
- FrameLoadTypeStandard); |
- documentLoader()->updateForSameDocumentNavigation( |
- newURL, sameDocumentNavigationSource); |
// Generate start and stop notifications only when loader is completed so that |
// we don't fire them for fragment redirection that happens in window.onload |
@@ -710,26 +580,12 @@ void FrameLoader::updateForSameDocumentNavigation( |
if (m_frame->document()->loadEventFinished() && !m_provisionalDocumentLoader) |
client()->didStartLoading(NavigationWithinSameDocument); |
- HistoryCommitType historyCommitType = loadTypeToCommitType(type); |
- if (!m_currentItem) |
- historyCommitType = HistoryInertCommit; |
- if (m_frame->settings()->getHistoryEntryRequiresUserGesture() && |
- initiatingDocument && |
- !initiatingDocument->frame()->hasReceivedUserGesture()) { |
- historyCommitType = HistoryInertCommit; |
- } |
+ // Update the data source's request with the new URL to fake the URL change |
+ m_frame->document()->setURL(newURL); |
+ documentLoader()->updateForSameDocumentNavigation( |
+ newURL, sameDocumentNavigationSource, std::move(data), |
+ scrollRestorationType, type, initiatingDocument); |
- setHistoryItemStateForCommit( |
- type, historyCommitType, |
- sameDocumentNavigationSource == SameDocumentNavigationHistoryApi |
- ? HistoryNavigationType::HistoryApi |
- : HistoryNavigationType::Fragment); |
- if (sameDocumentNavigationSource == SameDocumentNavigationHistoryApi) { |
- m_currentItem->setStateObject(std::move(data)); |
- m_currentItem->setScrollRestorationType(scrollRestorationType); |
- } |
- client()->dispatchDidNavigateWithinPage( |
- m_currentItem.get(), historyCommitType, !!initiatingDocument); |
client()->dispatchDidReceiveTitle(m_frame->document()->title()); |
if (m_frame->document()->loadEventFinished() && !m_provisionalDocumentLoader) |
client()->didStopLoading(); |
@@ -748,7 +604,7 @@ void FrameLoader::loadInSameDocument( |
const KURL& url, |
PassRefPtr<SerializedScriptValue> stateObject, |
FrameLoadType frameLoadType, |
- HistoryLoadType historyLoadType, |
+ HistoryItem* historyItem, |
ClientRedirectPolicy clientRedirect, |
Document* initiatingDocument) { |
// If we have a state object, we cannot also be a new navigation. |
@@ -773,6 +629,8 @@ void FrameLoader::loadInSameDocument( |
} |
m_documentLoader->setIsClientRedirect(clientRedirect == |
ClientRedirectPolicy::ClientRedirect); |
+ if (historyItem) |
+ m_documentLoader->setItemForHistoryNavigation(historyItem); |
updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, nullptr, |
ScrollRestorationAuto, frameLoadType, |
initiatingDocument); |
@@ -785,7 +643,7 @@ void FrameLoader::loadInSameDocument( |
? std::move(stateObject) |
: SerializedScriptValue::nullValue()); |
- if (historyLoadType == HistorySameDocumentLoad) |
+ if (historyItem) |
restoreScrollPositionAndViewStateForLoadType(frameLoadType); |
// We need to scroll to the fragment whether or not a hash change occurred, |
@@ -824,13 +682,11 @@ FrameLoadType FrameLoader::determineFrameLoadType( |
if (m_frame->tree().parent() && |
!m_stateMachine.committedFirstRealDocumentLoad()) |
return FrameLoadTypeInitialInChildFrame; |
- if (!m_frame->tree().parent() && !client()->backForwardLength()) |
+ if (!m_frame->tree().parent() && !client()->backForwardLength()) { |
+ if (opener() && request.resourceRequest().url().isEmpty()) |
+ return FrameLoadTypeReplaceCurrentItem; |
return FrameLoadTypeStandard; |
- if (m_provisionalDocumentLoader && |
- request.substituteData().failingURL() == |
- m_provisionalDocumentLoader->url() && |
- m_provisionalDocumentLoader->loadType() == FrameLoadTypeBackForward) |
- return FrameLoadTypeBackForward; |
+ } |
if (request.resourceRequest().getCachePolicy() == |
WebCachePolicy::ValidatingCacheData) |
return FrameLoadTypeReload; |
@@ -864,6 +720,11 @@ FrameLoadType FrameLoader::determineFrameLoadType( |
!request.originDocument()->frame()->hasReceivedUserGesture()) |
return FrameLoadTypeReplaceCurrentItem; |
+ if (request.resourceRequest().url().isEmpty() && |
+ request.substituteData().failingURL().isEmpty()) { |
+ return FrameLoadTypeReplaceCurrentItem; |
+ } |
+ |
return FrameLoadTypeStandard; |
} |
@@ -1014,11 +875,6 @@ void FrameLoader::load(const FrameLoadRequest& passedRequest, |
if (!prepareRequestForThisFrame(request)) |
return; |
- if (isBackForwardLoadType(frameLoadType)) { |
- DCHECK(historyItem); |
- m_provisionalItem = historyItem; |
- } |
- |
// Form submissions appear to need their special-case of finding the target at |
// schedule rather than at fire. |
Frame* targetFrame = request.form() |
@@ -1086,7 +942,7 @@ void FrameLoader::load(const FrameLoadRequest& passedRequest, |
newLoadType = FrameLoadTypeReplaceCurrentItem; |
} |
- loadInSameDocument(url, stateObject, newLoadType, historyLoadType, |
+ loadInSameDocument(url, stateObject, newLoadType, historyItem, |
request.clientRedirect(), request.originDocument()); |
return; |
} |
@@ -1099,7 +955,7 @@ void FrameLoader::load(const FrameLoadRequest& passedRequest, |
if (request.resourceRequest().isSameDocumentNavigation()) |
return; |
- startLoad(request, newLoadType, policy); |
+ startLoad(request, newLoadType, policy, historyItem); |
} |
SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) { |
@@ -1156,8 +1012,8 @@ void FrameLoader::stopAllLoaders() { |
// committing an empty document. In that case, emulate a failed navigation. |
if (!m_provisionalDocumentLoader && m_documentLoader && |
m_frame->isLoading()) { |
- loadFailed(m_documentLoader.get(), |
- ResourceError::cancelledError(m_documentLoader->url())); |
+ m_documentLoader->loadFailed( |
+ ResourceError::cancelledError(m_documentLoader->url())); |
} |
m_inStopAllLoaders = false; |
@@ -1227,6 +1083,8 @@ bool FrameLoader::prepareForCommit() { |
if (m_frame->document()) |
m_frame->document()->shutdown(); |
m_documentLoader = m_provisionalDocumentLoader.release(); |
+ if (m_documentLoader) |
+ m_documentLoader->markAsCommitted(); |
takeObjectSnapshot(); |
return true; |
@@ -1292,18 +1150,19 @@ void FrameLoader::restoreScrollPositionAndViewState() { |
void FrameLoader::restoreScrollPositionAndViewStateForLoadType( |
FrameLoadType loadType) { |
FrameView* view = m_frame->view(); |
- if (!view || !view->layoutViewportScrollableArea() || !m_currentItem || |
+ if (!view || !view->layoutViewportScrollableArea() || |
!m_stateMachine.committedFirstRealDocumentLoad()) { |
return; |
} |
if (!needsHistoryItemRestore(loadType)) |
return; |
- if (!m_currentItem->didSaveScrollOrScaleState()) |
+ HistoryItem* historyItem = m_documentLoader->historyItem(); |
+ if (!historyItem || !historyItem->didSaveScrollOrScaleState()) |
return; |
bool shouldRestoreScroll = |
- m_currentItem->scrollRestorationType() != ScrollRestorationManual; |
- bool shouldRestoreScale = m_currentItem->pageScaleFactor(); |
+ historyItem->scrollRestorationType() != ScrollRestorationManual; |
+ bool shouldRestoreScale = historyItem->pageScaleFactor(); |
// This tries to balance: |
// 1. restoring as soon as possible |
@@ -1315,7 +1174,7 @@ void FrameLoader::restoreScrollPositionAndViewStateForLoadType( |
// previous height |
bool canRestoreWithoutClamping = |
view->layoutViewportScrollableArea()->clampScrollOffset( |
- m_currentItem->getScrollOffset()) == m_currentItem->getScrollOffset(); |
+ historyItem->getScrollOffset()) == historyItem->getScrollOffset(); |
bool canRestoreWithoutAnnoyingUser = |
!documentLoader()->initialScrollState().wasScrolledByUser && |
(canRestoreWithoutClamping || !m_frame->isLoading() || |
@@ -1325,13 +1184,13 @@ void FrameLoader::restoreScrollPositionAndViewStateForLoadType( |
if (shouldRestoreScroll) { |
view->layoutViewportScrollableArea()->setScrollOffset( |
- m_currentItem->getScrollOffset(), ProgrammaticScroll); |
+ historyItem->getScrollOffset(), ProgrammaticScroll); |
} |
// For main frame restore scale and visual viewport position |
if (m_frame->isMainFrame()) { |
ScrollOffset visualViewportOffset( |
- m_currentItem->visualViewportScrollOffset()); |
+ historyItem->visualViewportScrollOffset()); |
// If the visual viewport's offset is (-1, -1) it means the history item |
// is an old version of HistoryItem so distribute the scroll between |
@@ -1339,16 +1198,16 @@ void FrameLoader::restoreScrollPositionAndViewStateForLoadType( |
if (visualViewportOffset.width() == -1 && |
visualViewportOffset.height() == -1) { |
visualViewportOffset = |
- m_currentItem->getScrollOffset() - |
+ historyItem->getScrollOffset() - |
view->layoutViewportScrollableArea()->getScrollOffset(); |
} |
VisualViewport& visualViewport = m_frame->page()->visualViewport(); |
if (shouldRestoreScale && shouldRestoreScroll) { |
- visualViewport.setScaleAndLocation(m_currentItem->pageScaleFactor(), |
+ visualViewport.setScaleAndLocation(historyItem->pageScaleFactor(), |
FloatPoint(visualViewportOffset)); |
} else if (shouldRestoreScale) { |
- visualViewport.setScale(m_currentItem->pageScaleFactor()); |
+ visualViewport.setScale(historyItem->pageScaleFactor()); |
} else if (shouldRestoreScroll) { |
visualViewport.setLocation(FloatPoint(visualViewportOffset)); |
} |
@@ -1383,34 +1242,9 @@ void FrameLoader::detach() { |
m_detached = true; |
} |
-void FrameLoader::loadFailed(DocumentLoader* loader, |
- const ResourceError& error) { |
- if (!error.isCancellation() && m_frame->owner()) { |
- // FIXME: For now, fallback content doesn't work cross process. |
- if (m_frame->owner()->isLocal()) |
- m_frame->deprecatedLocalOwner()->renderFallbackContent(); |
- } |
- |
- HistoryCommitType historyCommitType = |
- loadTypeToCommitType(loader->loadType()); |
- if (loader == m_provisionalDocumentLoader) { |
- if (!m_provisionalDocumentLoader->didStart()) |
- probe::frameClearedScheduledClientNavigation(m_frame); |
- m_provisionalDocumentLoader->setSentDidFinishLoad(); |
- client()->dispatchDidFailProvisionalLoad(error, historyCommitType); |
- if (loader != m_provisionalDocumentLoader) |
- return; |
- detachDocumentLoader(m_provisionalDocumentLoader); |
- } else { |
- DCHECK_EQ(loader, m_documentLoader); |
- if (m_frame->document()->parser()) |
- m_frame->document()->parser()->stopParsing(); |
- if (!m_documentLoader->sentDidFinishLoad()) { |
- m_documentLoader->setSentDidFinishLoad(); |
- client()->dispatchDidFailLoad(error, historyCommitType); |
- } |
- } |
- checkCompleted(); |
+void FrameLoader::detachProvisionalDocumentLoader(DocumentLoader* loader) { |
+ DCHECK_EQ(loader, m_provisionalDocumentLoader); |
+ detachDocumentLoader(m_provisionalDocumentLoader); |
} |
bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, |
@@ -1456,10 +1290,10 @@ void FrameLoader::processFragment(const KURL& url, |
bool shouldScrollToFragment = |
(loadStartType == NavigationWithinSameDocument && |
!isBackForwardLoadType(frameLoadType)) || |
- (documentLoader() && |
- !documentLoader()->initialScrollState().didRestoreFromHistory && |
- !(m_currentItem && |
- m_currentItem->scrollRestorationType() == ScrollRestorationManual)); |
+ (!documentLoader()->initialScrollState().didRestoreFromHistory && |
+ !(documentLoader()->historyItem() && |
+ documentLoader()->historyItem()->scrollRestorationType() == |
+ ScrollRestorationManual)); |
view->processUrlFragment(url, shouldScrollToFragment |
? FrameView::UrlFragmentScroll |
@@ -1615,7 +1449,8 @@ NavigationPolicy FrameLoader::checkLoadCanStart( |
void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, |
FrameLoadType type, |
- NavigationPolicy navigationPolicy) { |
+ NavigationPolicy navigationPolicy, |
+ HistoryItem* historyItem) { |
DCHECK(client()->hasWebView()); |
ResourceRequest& resourceRequest = frameLoadRequest.resourceRequest(); |
NavigationType navigationType = determineNavigationType( |
@@ -1676,6 +1511,12 @@ void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, |
m_provisionalDocumentLoader->appendRedirect( |
m_provisionalDocumentLoader->getRequest().url()); |
+ |
+ if (isBackForwardLoadType(type)) { |
+ DCHECK(historyItem); |
+ m_provisionalDocumentLoader->setItemForHistoryNavigation(historyItem); |
+ } |
+ |
// TODO(ananta): |
// We should get rid of the dependency on the DocumentLoader in consumers of |
// the didStartProvisionalLoad() notification. |
@@ -1709,7 +1550,8 @@ void FrameLoader::applyUserAgent(ResourceRequest& request) { |
} |
bool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const { |
- return m_currentItem && url == m_currentItem->url(); |
+ return m_documentLoader->historyItem() && |
+ url == m_documentLoader->historyItem()->url(); |
} |
bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const { |
@@ -1906,8 +1748,12 @@ DocumentLoader* FrameLoader::createDocumentLoader( |
loader->setLoadType(loadType); |
loader->setNavigationType(navigationType); |
- loader->setReplacesCurrentHistoryItem(loadType == |
- FrameLoadTypeReplaceCurrentItem); |
+ // TODO(japhet): This is needed because the browser process DCHECKs if the |
+ // first entry we commit in a new frame has replacement set. It's unclear |
+ // whether the DCHECK is right, investigate removing this special case. |
+ bool replaceCurrentItem = loadType == FrameLoadTypeReplaceCurrentItem && |
+ (!opener() || !request.url().isEmpty()); |
+ loader->setReplacesCurrentHistoryItem(replaceCurrentItem); |
return loader; |
} |