Commit 562eb981 authored by jochen@chromium.org's avatar jochen@chromium.org

Artifically delay the load finished signal until after dom content loaded

The webNavigation API defines that the signals always arrive in that order.
However, the frame loader can finish loading the document before the parser
actually finished parsing. To work around this, we delay the finished load
signal until after parsing has finished.

BUG=230767
TEST=WebNavigationApiTest.SrcDoc doesn't fail flakily

Review URL: https://codereview.chromium.org/13929020

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@194539 0039d316-1c4b-4281-b951-d872f2087c98
parent d4062453
......@@ -105,6 +105,7 @@ void FrameNavigationState::TrackFrame(FrameID frame_id,
frame_state.is_navigating = true;
frame_state.is_committed = false;
frame_state.is_server_redirected = false;
frame_state.is_parsing = true;
if (!is_main_frame) {
frame_state.parent_frame_num = parent_frame_id.frame_num;
} else {
......@@ -229,6 +230,18 @@ bool FrameNavigationState::GetNavigationCompleted(FrameID frame_id) const {
!frame_state->second.is_navigating);
}
void FrameNavigationState::SetParsingFinished(FrameID frame_id) {
DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
frame_state_map_[frame_id].is_parsing = false;
}
bool FrameNavigationState::GetParsingFinished(FrameID frame_id) const {
FrameIdToStateMap::const_iterator frame_state =
frame_state_map_.find(frame_id);
return (frame_state == frame_state_map_.end() ||
!frame_state->second.is_parsing);
}
void FrameNavigationState::SetNavigationCommitted(FrameID frame_id) {
DCHECK(frame_state_map_.find(frame_id) != frame_state_map_.end());
frame_state_map_[frame_id].is_committed = true;
......
......@@ -99,6 +99,12 @@ class FrameNavigationState {
// True if the frame is currently not navigating.
bool GetNavigationCompleted(FrameID frame_id) const;
// Marks a frame as having finished parsing.
void SetParsingFinished(FrameID frame_id);
// True if the frame has finished parsing.
bool GetParsingFinished(FrameID frame_id) const;
// Marks a frame as having committed its navigation, i.e. the onCommitted
// event was fired for this frame.
void SetNavigationCommitted(FrameID frame_id);
......@@ -128,6 +134,7 @@ class FrameNavigationState {
bool is_navigating; // True if there is a navigation going on.
bool is_committed; // True if the navigation is already committed.
bool is_server_redirected; // True if a server redirect happened.
bool is_parsing; // True if the frame is still parsing.
int64 parent_frame_num;
GURL url; // URL of this frame.
};
......
......@@ -528,10 +528,22 @@ void WebNavigationTabObserver::DocumentLoadedInFrame(
FrameNavigationState::FrameID frame_id(frame_num, render_view_host);
if (!navigation_state_.CanSendEvents(frame_id))
return;
navigation_state_.SetParsingFinished(frame_id);
helpers::DispatchOnDOMContentLoaded(web_contents(),
navigation_state_.GetUrl(frame_id),
navigation_state_.IsMainFrame(frame_id),
frame_num);
if (!navigation_state_.GetNavigationCompleted(frame_id))
return;
// The load might already have finished by the time we finished parsing. For
// compatibility reasons, we artifically delay the load completed signal until
// after parsing was completed.
helpers::DispatchOnCompleted(web_contents(),
navigation_state_.GetUrl(frame_id),
navigation_state_.IsMainFrame(frame_id),
frame_num);
}
void WebNavigationTabObserver::DidFinishLoad(
......@@ -559,6 +571,12 @@ void WebNavigationTabObserver::DidFinishLoad(
<< "validated URL is " << validated_url << " but we expected "
<< navigation_state_.GetUrl(frame_id);
DCHECK_EQ(navigation_state_.IsMainFrame(frame_id), is_main_frame);
// The load might already have finished by the time we finished parsing. For
// compatibility reasons, we artifically delay the load completed signal until
// after parsing was completed.
if (!navigation_state_.GetParsingFinished(frame_id))
return;
helpers::DispatchOnCompleted(web_contents(),
navigation_state_.GetUrl(frame_id),
is_main_frame,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment