Move most of FrameLoader::CheckCompleted() to Document
Split out the the parts that are specific to the committed Document, and
move those to a new Document::CheckCompleted(). Most current callers of
FrameLoader::CheckCompleted() will now call Document::CheckCompleted()
instead. Rename the remained of FrameLoader::CheckCompleted() to
DidFinishNavigation(), and have it handling the logic that is tied to
setting Frame::loading_ to false and firing DidStopLoading() callbacks.
BUG=
Review-Url: https://codereview.chromium.org/2809733003
Cr-Commit-Position: refs/heads/master@{#466470}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
index bb579c2..88b87d3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
@@ -21,7 +21,7 @@
/** Tests for the SearchGeolocationDisclosureInfobar. */
public class SearchGeolocationDisclosureInfoBarTest
extends ChromeActivityTestCaseBase<ChromeActivity> {
- private static final String SEARCH_PAGE = "/chrome/test/data/empty.html";
+ private static final String SEARCH_PAGE = "/chrome/test/data/android/google.html";
private static final String ENABLE_NEW_DISCLOSURE_FEATURE =
"enable-features=ConsistentOmniboxGeolocation";
private static final String DISABLE_NEW_DISCLOSURE_FEATURE =
diff --git a/third_party/WebKit/LayoutTests/http/tests/loading/doc-write-sync-third-party-script-reload-expected.txt b/third_party/WebKit/LayoutTests/http/tests/loading/doc-write-sync-third-party-script-reload-expected.txt
index 1d06d6e5..055f2cd 100644
--- a/third_party/WebKit/LayoutTests/http/tests/loading/doc-write-sync-third-party-script-reload-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/loading/doc-write-sync-third-party-script-reload-expected.txt
@@ -4,12 +4,12 @@
CONSOLE WARNING: line 47: A Parser-blocking, cross site (i.e. different eTLD+1) script, http://localhost:8000/loading/resources/js-loaded.js?reload, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message.See https://www.chromestatus.com/feature/5718547946799104 for more details.
CONSOLE ERROR: Network request for the parser-blocking, cross site (i.e. different eTLD+1) script, http://localhost:8000/loading/resources/js-loaded.js?reload, invoked via document.write was BLOCKED by the browser due to poor network connectivity.
main frame - didStartProvisionalLoadForFrame
-main frame - didFailLoadWithError
+main frame - didFinishLoadForFrame
main frame - didCommitLoadForFrame
CONSOLE WARNING: line 47: A Parser-blocking, cross site (i.e. different eTLD+1) script, http://localhost:8000/loading/resources/js-loaded.js?reload, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message.See https://www.chromestatus.com/feature/5718547946799104 for more details.
CONSOLE WARNING: line 47: A Parser-blocking, cross site (i.e. different eTLD+1) script, http://localhost:8000/loading/resources/js-loaded.js?reload, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message.See https://www.chromestatus.com/feature/5718547946799104 for more details.
main frame - didStartProvisionalLoadForFrame
-main frame - didFailLoadWithError
+main frame - didFinishLoadForFrame
main frame - didCommitLoadForFrame
CONSOLE WARNING: line 47: A Parser-blocking, cross site (i.e. different eTLD+1) script, http://localhost:8000/loading/resources/js-loaded.js?reload, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message.See https://www.chromestatus.com/feature/5718547946799104 for more details.
CONSOLE WARNING: line 47: A Parser-blocking, cross site (i.e. different eTLD+1) script, http://localhost:8000/loading/resources/js-loaded.js?reload, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message.See https://www.chromestatus.com/feature/5718547946799104 for more details.
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 4b21ebd..829e3b3f 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -488,7 +488,7 @@
this,
&Document::UpdateFocusAppearanceTimerFired),
css_target_(nullptr),
- load_event_progress_(kLoadEventNotRun),
+ load_event_progress_(kLoadEventCompleted),
start_time_(CurrentTime()),
script_runner_(ScriptRunner::Create(this)),
xml_version_("1.0"),
@@ -2770,9 +2770,6 @@
if (frame_)
frame_->Loader().DidExplicitOpen();
- if (load_event_progress_ != kLoadEventInProgress &&
- PageDismissalEventBeingDispatched() == kNoDismissal)
- load_event_progress_ = kLoadEventNotRun;
}
void Document::DetachParser() {
@@ -2787,12 +2784,11 @@
DetachParser();
SetParsingState(kFinishedParsing);
SetReadyState(kComplete);
+ SuppressLoadEvent();
}
DocumentParser* Document::ImplicitOpen(
ParserSynchronizationPolicy parser_sync_policy) {
- DetachParser();
-
RemoveChildren();
DCHECK(!focused_element_);
@@ -2806,11 +2802,16 @@
parser_sync_policy = kForceSynchronousParsing;
}
+ DetachParser();
parser_sync_policy_ = parser_sync_policy;
parser_ = CreateParser();
DocumentParserTiming::From(*this).MarkParserStart();
SetParsingState(kParsing);
SetReadyState(kLoading);
+ if (load_event_progress_ != kLoadEventInProgress &&
+ PageDismissalEventBeingDispatched() == kNoDismissal) {
+ load_event_progress_ = kLoadEventNotRun;
+ }
return parser_;
}
@@ -2952,30 +2953,15 @@
!GetScriptableDocumentParser()->IsParsing())
return;
- if (DocumentParser* parser = parser_)
- parser->Finish();
-
- if (!frame_) {
- // Because we have no frame, we don't know if all loading has completed,
- // so we just call implicitClose() immediately. FIXME: This might fire
- // the load event prematurely
- // <http://bugs.webkit.org/show_bug.cgi?id=14568>.
- ImplicitClose();
- return;
- }
-
- frame_->Loader().CheckCompleted();
+ parser_->Finish();
+ if (!parser_ || !parser_->IsParsing())
+ SetReadyState(kComplete);
+ CheckCompleted();
}
void Document::ImplicitClose() {
DCHECK(!InStyleRecalc());
- if (ProcessingLoadEvent() || !parser_)
- return;
- if (GetFrame() &&
- GetFrame()->GetNavigationScheduler().LocationChangePending()) {
- SuppressLoadEvent();
- return;
- }
+ DCHECK(parser_);
load_event_progress_ = kLoadEventInProgress;
@@ -3057,6 +3043,69 @@
AccessSVGExtensions().StartAnimations();
}
+static bool AllDescendantsAreComplete(Frame* frame) {
+ if (!frame)
+ return true;
+ for (Frame* child = frame->Tree().FirstChild(); child;
+ child = child->Tree().TraverseNext(frame)) {
+ if (child->IsLoading())
+ return false;
+ }
+ return true;
+}
+
+bool Document::ShouldComplete() {
+ return parsing_state_ == kFinishedParsing && HaveImportsLoaded() &&
+ !fetcher_->BlockingRequestCount() && !IsDelayingLoadEvent() &&
+ load_event_progress_ != kLoadEventInProgress &&
+ AllDescendantsAreComplete(frame_);
+}
+
+void Document::CheckCompleted() {
+ if (!ShouldComplete())
+ return;
+
+ if (frame_) {
+ frame_->Client()->RunScriptsAtDocumentIdle();
+
+ // Injected scripts may have disconnected this frame.
+ if (!frame_)
+ return;
+
+ // Check again, because runScriptsAtDocumentIdle() may have delayed the load
+ // event.
+ if (!ShouldComplete())
+ return;
+ }
+
+ // OK, completed. Fire load completion events as needed.
+ SetReadyState(kComplete);
+ if (LoadEventStillNeeded())
+ ImplicitClose();
+
+ // The readystatechanged or load event may have disconnected this frame.
+ if (!frame_ || !frame_->IsAttached())
+ return;
+ frame_->GetNavigationScheduler().StartTimer();
+ View()->HandleLoadCompleted();
+ // The document itself is complete, but if a child frame was restarted due to
+ // an event, this document is still considered to be in progress.
+ if (!AllDescendantsAreComplete(frame_))
+ return;
+
+ // No need to repeat if we've already notified this load as finished.
+ if (!Loader()->SentDidFinishLoad()) {
+ if (frame_->IsMainFrame())
+ ViewportDescription().ReportMobilePageStats(frame_);
+ Loader()->SetSentDidFinishLoad();
+ frame_->Client()->DispatchDidFinishLoad();
+ if (!frame_)
+ return;
+ }
+
+ frame_->Loader().DidFinishNavigation();
+}
+
bool Document::DispatchBeforeUnloadEvent(ChromeClient& chrome_client,
bool is_reload,
bool& did_allow_navigation) {
@@ -5988,8 +6037,8 @@
DCHECK(load_event_delay_count_);
--load_event_delay_count_;
- if (!load_event_delay_count_ && GetFrame())
- GetFrame()->Loader().CheckCompleted();
+ if (!load_event_delay_count_)
+ CheckCompleted();
}
void Document::CheckLoadEventSoon() {
@@ -6011,8 +6060,7 @@
}
void Document::LoadEventDelayTimerFired(TimerBase*) {
- if (GetFrame())
- GetFrame()->Loader().CheckCompleted();
+ CheckCompleted();
}
void Document::LoadPluginsSoon() {
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h
index 9da3667..9b0ab6e 100644
--- a/third_party/WebKit/Source/core/dom/Document.h
+++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -566,8 +566,8 @@
void close(ExceptionState&);
// This is used internally and does not handle exceptions.
void close();
- // implicitClose() actually does the work of closing the input stream.
- void ImplicitClose();
+
+ void CheckCompleted();
bool DispatchBeforeUnloadEvent(ChromeClient&,
bool is_reload,
@@ -680,9 +680,6 @@
enum ParsingState { kParsing, kInDOMContentLoaded, kFinishedParsing };
void SetParsingState(ParsingState);
bool Parsing() const { return parsing_state_ == kParsing; }
- bool IsInDOMContentLoaded() const {
- return parsing_state_ == kInDOMContentLoaded;
- }
bool HasFinishedParsing() const { return parsing_state_ == kFinishedParsing; }
bool ShouldScheduleLayout() const;
@@ -1050,9 +1047,6 @@
bool LoadEventStillNeeded() const {
return load_event_progress_ == kLoadEventNotRun;
}
- bool ProcessingLoadEvent() const {
- return load_event_progress_ == kLoadEventInProgress;
- }
bool LoadEventFinished() const {
return load_event_progress_ >= kLoadEventCompleted;
}
@@ -1163,7 +1157,6 @@
}
HTMLImportLoader* ImportLoader() const;
- bool HaveImportsLoaded() const;
void DidLoadAllImports();
void AdjustFloatQuadsForScrollAndAbsoluteZoom(Vector<FloatQuad>&,
@@ -1373,6 +1366,10 @@
void UpdateStyle();
void NotifyLayoutTreeOfSubtreeChanges();
+ // ImplicitClose() actually does the work of closing the input stream.
+ void ImplicitClose();
+ bool ShouldComplete();
+
void DetachParser();
void BeginLifecycleUpdatesIfRenderingReady();
@@ -1438,6 +1435,8 @@
void RunExecutionContextTask(std::unique_ptr<ExecutionContextTask>,
bool instrumenting);
+ bool HaveImportsLoaded() const;
+
DocumentLifecycle lifecycle_;
bool has_nodes_with_placeholder_style_;
diff --git a/third_party/WebKit/Source/core/dom/DocumentTest.cpp b/third_party/WebKit/Source/core/dom/DocumentTest.cpp
index 6002eb4..2c81584 100644
--- a/third_party/WebKit/Source/core/dom/DocumentTest.cpp
+++ b/third_party/WebKit/Source/core/dom/DocumentTest.cpp
@@ -727,10 +727,10 @@
MockValidationMessageClient* mock_client = new MockValidationMessageClient();
GetDocument().GetSettings()->SetScriptEnabled(true);
GetPage().SetValidationMessageClient(mock_client);
- // implicitOpen()-implicitClose() makes Document.loadEventFinished()
+ // ImplicitOpen()-CancelParsing() makes Document.loadEventFinished()
// true. It's necessary to kick unload process.
GetDocument().ImplicitOpen(kForceSynchronousParsing);
- GetDocument().ImplicitClose();
+ GetDocument().CancelParsing();
GetDocument().AppendChild(GetDocument().createElement("html"));
SetHtmlInnerHTML("<body><input required></body>");
Element* script = GetDocument().createElement("script");
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportTreeRoot.cpp b/third_party/WebKit/Source/core/html/imports/HTMLImportTreeRoot.cpp
index ed535ae..e04c8af5 100644
--- a/third_party/WebKit/Source/core/html/imports/HTMLImportTreeRoot.cpp
+++ b/third_party/WebKit/Source/core/html/imports/HTMLImportTreeRoot.cpp
@@ -51,10 +51,8 @@
void HTMLImportTreeRoot::StateDidChange() {
HTMLImport::StateDidChange();
- if (!GetState().IsReady())
- return;
- if (LocalFrame* frame = document_->GetFrame())
- frame->Loader().CheckCompleted();
+ if (GetState().IsReady())
+ document_->CheckCompleted();
}
void HTMLImportTreeRoot::ScheduleRecalcState() {
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
index c0329ed..0bb4b57 100644
--- a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
@@ -402,23 +402,31 @@
}
HistoryCommitType history_commit_type = LoadTypeToCommitType(load_type_);
- FrameLoader& loader = GetFrameLoader();
- if (state_ < kCommitted) {
- if (state_ == kNotStarted)
+ switch (state_) {
+ case kNotStarted:
probe::frameClearedScheduledClientNavigation(frame_);
- state_ = kSentDidFinishLoad;
- GetLocalFrameClient().DispatchDidFailProvisionalLoad(error,
- history_commit_type);
- if (!frame_)
- return;
- loader.DetachProvisionalDocumentLoader(this);
- } else if (state_ == kCommitted) {
- if (frame_->GetDocument()->Parser())
- frame_->GetDocument()->Parser()->StopParsing();
- state_ = kSentDidFinishLoad;
- GetLocalFrameClient().DispatchDidFailLoad(error, history_commit_type);
+ // Fall-through
+ case kProvisional:
+ state_ = kSentDidFinishLoad;
+ GetLocalFrameClient().DispatchDidFailProvisionalLoad(error,
+ history_commit_type);
+ if (frame_)
+ GetFrameLoader().DetachProvisionalDocumentLoader(this);
+ break;
+ case kCommitted:
+ if (frame_->GetDocument()->Parser())
+ frame_->GetDocument()->Parser()->StopParsing();
+ state_ = kSentDidFinishLoad;
+ GetLocalFrameClient().DispatchDidFailLoad(error, history_commit_type);
+ if (frame_)
+ frame_->GetDocument()->CheckCompleted();
+ break;
+ case kSentDidFinishLoad:
+ // TODO(japhet): Why do we need to call DidFinishNavigation() again?
+ GetFrameLoader().DidFinishNavigation();
+ break;
}
- loader.CheckCompleted();
+ DCHECK_EQ(kSentDidFinishLoad, state_);
}
void DocumentLoader::FinishedLoading(double finish_time) {
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
index 1fc2491..295d433 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
@@ -616,10 +616,11 @@
}
void FrameFetchContext::DidLoadResource(Resource* resource) {
+ if (!GetDocument())
+ return;
+ FirstMeaningfulPaintDetector::From(*GetDocument()).CheckNetworkStable();
if (resource->IsLoadEventBlockingResourceType())
- GetFrame()->Loader().CheckCompleted();
- if (GetDocument())
- FirstMeaningfulPaintDetector::From(*GetDocument()).CheckNetworkStable();
+ GetDocument()->CheckCompleted();
}
void FrameFetchContext::AddResourceTiming(const ResourceTimingInfo& info) {
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
index 3381bf4e..3d65c243 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
@@ -705,6 +705,11 @@
}
TEST_F(FrameFetchContextTest, SubResourceCachePolicy) {
+ // Reset load event state: if the load event is finished, we ignore the
+ // DocumentLoader load type.
+ document->open();
+ ASSERT_FALSE(document->LoadEventFinished());
+
// Default case
ResourceRequest request("http://www.example.com/mock");
EXPECT_EQ(WebCachePolicy::kUseProtocolCachePolicy,
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
index 304c3d4..ba8c6db 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -453,7 +453,7 @@
document_loader_ ? document_loader_->IsCommittedButEmpty() : true);
}
- CheckCompleted();
+ frame_->GetDocument()->CheckCompleted();
if (!frame_->View())
return;
@@ -465,15 +465,6 @@
kNavigationToDifferentDocument);
}
-static bool AllDescendantsAreComplete(Frame* frame) {
- for (Frame* child = frame->Tree().FirstChild(); child;
- child = child->Tree().TraverseNext(frame)) {
- if (child->IsLoading())
- return false;
- }
- return true;
-}
-
bool FrameLoader::AllAncestorsAreComplete() const {
for (Frame* ancestor = frame_; ancestor;
ancestor = ancestor->Tree().Parent()) {
@@ -483,96 +474,15 @@
return true;
}
-static bool ShouldComplete(Document* document) {
- if (!document->GetFrame())
- return false;
- if (document->Parsing() || document->IsInDOMContentLoaded())
- return false;
- if (!document->HaveImportsLoaded())
- return false;
- if (document->Fetcher()->BlockingRequestCount())
- return false;
- if (document->IsDelayingLoadEvent())
- return false;
- return AllDescendantsAreComplete(document->GetFrame());
-}
-
-static bool ShouldSendFinishNotification(LocalFrame* frame) {
- // Don't send didFinishLoad more than once per DocumentLoader.
- if (frame->Loader().GetDocumentLoader()->SentDidFinishLoad())
- return false;
-
- // We might have declined to run the load event due to an imminent
- // content-initiated navigation.
- if (!frame->GetDocument()->LoadEventFinished())
- return false;
-
- // An event might have restarted a child frame.
- if (!AllDescendantsAreComplete(frame))
- return false;
-
- // Don't notify if the frame is being detached.
- if (!frame->IsAttached())
- return false;
-
- return true;
-}
-
-static bool ShouldSendCompleteNotification(LocalFrame* frame) {
- // FIXME: We might have already sent stop notifications and be re-completing.
- if (!frame->IsLoading())
- return false;
- // Only send didStopLoading() if there are no navigations in progress at all,
- // whether committed, provisional, or pending.
- return frame->Loader().GetDocumentLoader()->SentDidFinishLoad() &&
- !frame->Loader().HasProvisionalNavigation();
-}
-
-void FrameLoader::CheckCompleted() {
- if (!ShouldComplete(frame_->GetDocument()))
+void FrameLoader::DidFinishNavigation() {
+ // We should have either finished the provisional or committed navigation if
+ // this is called. Only delcare the whole frame finished if neither is in
+ // progress.
+ DCHECK(document_loader_->SentDidFinishLoad() || !HasProvisionalNavigation());
+ if (!document_loader_->SentDidFinishLoad() || HasProvisionalNavigation())
return;
- if (Client()) {
- Client()->RunScriptsAtDocumentIdle();
-
- // Injected scripts may have disconnected this frame.
- if (!Client())
- return;
-
- // Check again, because runScriptsAtDocumentIdle() may have delayed the load
- // event.
- if (!ShouldComplete(frame_->GetDocument()))
- return;
- }
-
- // OK, completed.
- frame_->GetDocument()->SetReadyState(Document::kComplete);
- if (frame_->GetDocument()->LoadEventStillNeeded())
- frame_->GetDocument()->ImplicitClose();
-
- frame_->GetNavigationScheduler().StartTimer();
-
- if (frame_->View())
- frame_->View()->HandleLoadCompleted();
-
- // The readystatechanged or load event may have disconnected this frame.
- if (!frame_->Client())
- return;
-
- if (ShouldSendFinishNotification(frame_)) {
- // Report mobile vs. desktop page statistics. This will only report on
- // Android.
- if (frame_->IsMainFrame())
- frame_->GetDocument()->GetViewportDescription().ReportMobilePageStats(
- frame_);
- document_loader_->SetSentDidFinishLoad();
- Client()->DispatchDidFinishLoad();
- // Finishing the load can detach the frame when running layout tests.
- if (!frame_->Client())
- return;
- }
-
- if (ShouldSendCompleteNotification(frame_)) {
+ if (frame_->IsLoading()) {
progress_tracker_->ProgressCompleted();
// Retry restoring scroll offset since finishing loading disables content
// size clamping.
@@ -584,7 +494,7 @@
Frame* parent = frame_->Tree().Parent();
if (parent && parent->IsLocalFrame())
- ToLocalFrame(parent)->Loader().CheckCompleted();
+ ToLocalFrame(parent)->GetDocument()->CheckCompleted();
}
void FrameLoader::CheckTimerFired(TimerBase*) {
@@ -592,7 +502,7 @@
if (page->Suspended())
return;
}
- CheckCompleted();
+ frame_->GetDocument()->CheckCompleted();
}
void FrameLoader::ScheduleCheckCompleted() {
@@ -700,7 +610,7 @@
document_loader_->GetInitialScrollState().was_scrolled_by_user = false;
- CheckCompleted();
+ frame_->GetDocument()->CheckCompleted();
frame_->DomWindow()->StatePopped(state_object
? std::move(state_object)
@@ -1062,10 +972,9 @@
ToLocalFrame(child)->Loader().StopAllLoaders();
}
- frame_->GetDocument()->SuppressLoadEvent();
+ frame_->GetDocument()->CancelParsing();
if (document_loader_)
document_loader_->Fetcher()->StopFetching();
- frame_->GetDocument()->CancelParsing();
if (!protect_provisional_loader_)
DetachDocumentLoader(provisional_document_loader_);
@@ -1312,6 +1221,7 @@
void FrameLoader::DetachProvisionalDocumentLoader(DocumentLoader* loader) {
DCHECK_EQ(loader, provisional_document_loader_);
DetachDocumentLoader(provisional_document_loader_);
+ DidFinishNavigation();
}
bool FrameLoader::ShouldPerformFragmentNavigation(bool is_form_submission,
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.h b/third_party/WebKit/Source/core/loader/FrameLoader.h
index 7ea22eb..75155e4 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.h
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.h
@@ -159,7 +159,7 @@
void Detach();
void FinishedParsing();
- void CheckCompleted();
+ void DidFinishNavigation();
// This prepares the FrameLoader for the next commit. It will dispatch unload
// events, abort XHR requests and detach the document. Returns true if the
diff --git a/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp b/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
index 0ff8cfa..b2eaf71 100644
--- a/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
+++ b/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
@@ -507,6 +507,8 @@
Cancel();
redirect_ = redirect;
+ if (redirect_->IsLocationChange())
+ frame_->GetDocument()->SuppressLoadEvent();
StartTimer();
}
diff --git a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
index 5a33e7b..7dd63702 100644
--- a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
@@ -504,8 +504,8 @@
// the load event, but if we miss that train (deferred programmatic
// element insertion for example) we need to initialize the time container
// here.
- if (!GetDocument().Parsing() && !GetDocument().ProcessingLoadEvent() &&
- GetDocument().LoadEventFinished() && !TimeContainer()->IsStarted())
+ if (!GetDocument().Parsing() && GetDocument().LoadEventFinished() &&
+ !TimeContainer()->IsStarted())
TimeContainer()->Start();
}
}
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
index a1ec3ad..8c027254 100644
--- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
+++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
@@ -1638,7 +1638,7 @@
ClearVariablesForLoading();
- response_document_->ImplicitClose();
+ response_document_->CheckCompleted();
if (!response_document_->WellFormed())
response_document_ = nullptr;
diff --git a/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp b/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp
index 7edbe0e..6ce5f226 100644
--- a/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp
@@ -487,7 +487,7 @@
if (Parent() && Parent()->IsWebLocalFrame()) {
WebLocalFrameImpl* parent_frame =
ToWebLocalFrameImpl(Parent()->ToWebLocalFrame());
- parent_frame->GetFrame()->Loader().CheckCompleted();
+ parent_frame->GetFrame()->GetDocument()->CheckCompleted();
}
}