Skip to content

Commit

Permalink
Make nested browsing context navigations check the loaded status of t…
Browse files Browse the repository at this point in the history
…he active document of the nested browsing context.
  • Loading branch information
jdm committed Mar 8, 2019
1 parent edfd15c commit c2ce7d7
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 5 deletions.
39 changes: 37 additions & 2 deletions components/constellation/constellation.rs
Expand Up @@ -922,6 +922,14 @@ where
}

fn add_pending_change(&mut self, change: SessionHistoryChange) {
debug!(
"adding pending session history change with {}",
if change.replace.is_some() {
"replacement"
} else {
"no replacement"
},
);
self.handle_load_start_msg(
change.top_level_browsing_context_id,
change.browsing_context_id,
Expand Down Expand Up @@ -1915,13 +1923,29 @@ where
top_level_browsing_context_id,
new_pipeline_id,
is_private,
replace,
mut replace,
} = load_info.info;

// If no url is specified, reload.
let old_pipeline = load_info
.old_pipeline_id
.and_then(|id| self.pipelines.get(&id));

// Replacement enabled also takes into account whether the document is "completely loaded",
// see https://html.spec.whatwg.org/multipage/#the-iframe-element:completely-loaded
debug!("checking old pipeline? {:?}", load_info.old_pipeline_id);
if let Some(old_pipeline) = old_pipeline {
replace |= !old_pipeline.completely_loaded;
debug!(
"old pipeline is {}completely loaded",
if old_pipeline.completely_loaded {
""
} else {
"not "
}
);
}

let load_data = load_info.load_data.unwrap_or_else(|| {
let url = match old_pipeline {
Some(old_pipeline) => old_pipeline.url.clone(),
Expand Down Expand Up @@ -1964,6 +1988,7 @@ where
);
},
};

let replace = if replace {
Some(NeedsToReload::No(browsing_context.pipeline_id))
} else {
Expand Down Expand Up @@ -2214,7 +2239,12 @@ where
load_data: LoadData,
replace: bool,
) -> Option<PipelineId> {
debug!("Loading {} in pipeline {}.", load_data.url, source_id);
debug!(
"Loading {} in pipeline {}, {}replacing.",
load_data.url,
source_id,
if replace { "" } else { "not " }
);
// If this load targets an iframe, its framing element may exist
// in a separate script thread than the framed document that initiated
// the new load. The framing element must be notified about the
Expand Down Expand Up @@ -2376,6 +2406,11 @@ where
self.webdriver.load_channel = None;
}

if let Some(pipeline) = self.pipelines.get_mut(&pipeline_id) {
debug!("marking pipeline {:?} as loaded", pipeline_id);
pipeline.completely_loaded = true;
}

// Notify the embedder that the TopLevelBrowsingContext current document
// has finished loading.
// We need to make sure the pipeline that has finished loading is the current
Expand Down
4 changes: 4 additions & 0 deletions components/constellation/pipeline.rs
Expand Up @@ -89,6 +89,9 @@ pub struct Pipeline {

/// The history states owned by this pipeline.
pub history_states: HashSet<HistoryStateId>,

/// Has this pipeline received a notification that it is completely loaded?
pub completely_loaded: bool,
}

/// Initial setup data needed to construct a pipeline.
Expand Down Expand Up @@ -355,6 +358,7 @@ impl Pipeline {
load_data: load_data,
history_state_id: None,
history_states: HashSet::new(),
completely_loaded: false,
};

pipeline.notify_visibility(is_visible);
Expand Down
2 changes: 2 additions & 0 deletions components/constellation/session_history.rs
Expand Up @@ -37,6 +37,7 @@ impl JointSessionHistory {
}

pub fn push_diff(&mut self, diff: SessionHistoryDiff) -> Vec<SessionHistoryDiff> {
debug!("pushing a past entry; removing future");
self.past.push(diff);
mem::replace(&mut self.future, vec![])
}
Expand Down Expand Up @@ -85,6 +86,7 @@ impl JointSessionHistory {
}

pub fn remove_entries_for_browsing_context(&mut self, context_id: BrowsingContextId) {
debug!("removing entries for context {}", context_id);
self.past.retain(|diff| match diff {
SessionHistoryDiff::BrowsingContextDiff {
browsing_context_id,
Expand Down
4 changes: 1 addition & 3 deletions components/script/dom/htmliframeelement.rs
Expand Up @@ -278,9 +278,7 @@ impl HTMLIFrameElement {
// see https://html.spec.whatwg.org/multipage/#the-iframe-element:about:blank-3
let is_about_blank =
pipeline_id.is_some() && pipeline_id == self.about_blank_pipeline_id.get();
// Replacement enabled also takes into account whether the document is "completely loaded",
// see https://html.spec.whatwg.org/multipage/#the-iframe-element:completely-loaded
let replace = is_about_blank || !document.is_completely_loaded();
let replace = is_about_blank;
self.navigate_or_reload_child_browsing_context(
Some(load_data),
NavigationType::Regular,
Expand Down
28 changes: 28 additions & 0 deletions tests/wpt/mozilla/meta/MANIFEST.json
Expand Up @@ -10459,6 +10459,11 @@
{}
]
],
"mozilla/resources/first.html": [
[
{}
]
],
"mozilla/resources/http-cache.js": [
[
{}
Expand Down Expand Up @@ -10499,6 +10504,11 @@
{}
]
],
"mozilla/resources/second.html": [
[
{}
]
],
"mozilla/resources/ssl.https.html": [
[
{}
Expand Down Expand Up @@ -12659,6 +12669,12 @@
{}
]
],
"mozilla/history.html": [
[
"/_mozilla/mozilla/history.html",
{}
]
],
"mozilla/hit-test-background.html": [
[
"/_mozilla/mozilla/hit-test-background.html",
Expand Down Expand Up @@ -19424,6 +19440,10 @@
"9baa0cdcd5abad00b321e8b9351a1bc162783ed5",
"support"
],
"mozilla/history.html": [
"130307f1e9c8bc4c5ee6fff4d5fef8fda89a1564",
"testharness"
],
"mozilla/hit-test-background.html": [
"5212954e4ee6ecb684212e7373e24a2268434b1c",
"testharness"
Expand Down Expand Up @@ -19796,6 +19816,10 @@
"5f0242874cfa47b84af35325ad651690cd9fb790",
"support"
],
"mozilla/resources/first.html": [
"b4359ad2855339999cfeda0c2681a51da6fdd940",
"support"
],
"mozilla/resources/http-cache.js": [
"34aaacf536f31e4d9ae003cb0891ede965201f08",
"support"
Expand Down Expand Up @@ -19828,6 +19852,10 @@
"b0883f382e1a80609b7b2c7904e701fbe6760b14",
"support"
],
"mozilla/resources/second.html": [
"c4fbe534ed193e1d192c0338997a8d9da8eb6406",
"support"
],
"mozilla/resources/ssl.https.html": [
"8faa57c0c47c4fdf27c052d059b28ee1088235e9",
"support"
Expand Down
25 changes: 25 additions & 0 deletions tests/wpt/mozilla/tests/mozilla/history.html
@@ -0,0 +1,25 @@
<!doctype html>
<meta charset="utf-8">
<title>Traversing history causes iframe contentWindow to update</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<iframe src="resources/first.html"></iframe>
<script>
var iframe = document.querySelector('iframe');
var t = async_test();
onload = t.step_func(function() {
iframe.onload = t.step_func(function() {
assert_true(iframe.contentWindow.location.href.endsWith('second.html'));
iframe.contentWindow.history.back();
t.step_timeout(function() {
assert_true(iframe.contentWindow.location.href.endsWith('first.html'));
iframe.contentWindow.history.forward();
t.step_timeout(function() {
assert_true(iframe.contentWindow.location.href.endsWith('second.html'));
t.done();
}, 1000);
}, 1000);
});
iframe.src = "resources/second.html";
});
</script>
1 change: 1 addition & 0 deletions tests/wpt/mozilla/tests/mozilla/resources/first.html
@@ -0,0 +1 @@
<body>hello world</body>
1 change: 1 addition & 0 deletions tests/wpt/mozilla/tests/mozilla/resources/second.html
@@ -0,0 +1 @@
<body>goodbye world</body>

0 comments on commit c2ce7d7

Please sign in to comment.