Cleanup constellation after nll

This commit is contained in:
Connor Brewster 2018-12-06 11:59:09 -06:00
parent a2c4eba720
commit aecb48d5d1

View file

@ -1599,20 +1599,14 @@ where
EmbedderMsg::Panic(reason, backtrace), EmbedderMsg::Panic(reason, backtrace),
)); ));
let (window_size, pipeline_id, is_visible) = { let browsing_context = self.browsing_contexts.get(&browsing_context_id);
let browsing_context = self.browsing_contexts.get(&browsing_context_id); let window_size = browsing_context.and_then(|ctx| ctx.size);
let window_size = browsing_context.and_then(|ctx| ctx.size); let pipeline_id = browsing_context.map(|ctx| ctx.pipeline_id);
let pipeline_id = browsing_context.map(|ctx| ctx.pipeline_id); let is_visible = browsing_context.map(|ctx| ctx.is_visible);
let is_visible = browsing_context.map(|ctx| ctx.is_visible);
(window_size, pipeline_id, is_visible)
};
let (pipeline_url, opener) = { let pipeline = pipeline_id.and_then(|id| self.pipelines.get(&id));
let pipeline = pipeline_id.and_then(|id| self.pipelines.get(&id)); let pipeline_url = pipeline.map(|pipeline| pipeline.url.clone());
let pipeline_url = pipeline.map(|pipeline| pipeline.url.clone()); let opener = pipeline.and_then(|pipeline| pipeline.opener);
let opener = pipeline.and_then(|pipeline| pipeline.opener);
(pipeline_url, opener)
};
self.close_browsing_context_children( self.close_browsing_context_children(
browsing_context_id, browsing_context_id,
@ -1855,65 +1849,56 @@ where
replace, replace,
} = load_info.info; } = load_info.info;
let (load_data, is_private) = { // If no url is specified, reload.
// If no url is specified, reload. let old_pipeline = load_info
let old_pipeline = load_info .old_pipeline_id
.old_pipeline_id .and_then(|id| self.pipelines.get(&id));
.and_then(|id| self.pipelines.get(&id)); let load_data = load_info.load_data.unwrap_or_else(|| {
let load_data = load_info.load_data.unwrap_or_else(|| { let url = match old_pipeline {
let url = match old_pipeline { Some(old_pipeline) => old_pipeline.url.clone(),
Some(old_pipeline) => old_pipeline.url.clone(), None => ServoUrl::parse("about:blank").expect("infallible"),
None => ServoUrl::parse("about:blank").expect("infallible"),
};
// TODO - loaddata here should have referrer info (not None, None)
LoadData::new(url, Some(parent_pipeline_id), None, None)
});
let is_parent_private = {
let parent_browsing_context_id = match self.pipelines.get(&parent_pipeline_id) {
Some(pipeline) => pipeline.browsing_context_id,
None => {
return warn!(
"Script loaded url in iframe {} in closed parent pipeline {}.",
browsing_context_id, parent_pipeline_id,
)
},
};
let is_parent_private =
match self.browsing_contexts.get(&parent_browsing_context_id) {
Some(ctx) => ctx.is_private,
None => {
return warn!(
"Script loaded url in iframe {} in closed parent browsing context {}.",
browsing_context_id,
parent_browsing_context_id,
)
},
};
is_parent_private
}; };
let is_private = is_private || is_parent_private;
(load_data, is_private) // TODO - loaddata here should have referrer info (not None, None)
}; LoadData::new(url, Some(parent_pipeline_id), None, None)
});
let (replace, window_size, is_visible) = { let is_parent_private = {
let browsing_context = match self.browsing_contexts.get(&browsing_context_id) { let parent_browsing_context_id = match self.pipelines.get(&parent_pipeline_id) {
Some(ctx) => ctx, Some(pipeline) => pipeline.browsing_context_id,
None => { None => {
return warn!( return warn!(
"Script loaded url in iframe with closed browsing context {}.", "Script loaded url in iframe {} in closed parent pipeline {}.",
browsing_context_id, browsing_context_id, parent_pipeline_id,
) )
}, },
}; };
let replace = if replace { let is_parent_private = match self.browsing_contexts.get(&parent_browsing_context_id) {
Some(NeedsToReload::No(browsing_context.pipeline_id)) Some(ctx) => ctx.is_private,
} else { None => {
None return warn!(
"Script loaded url in iframe {} in closed parent browsing context {}.",
browsing_context_id, parent_browsing_context_id,
)
},
}; };
(replace, browsing_context.size, browsing_context.is_visible) is_parent_private
};
let is_private = is_private || is_parent_private;
let browsing_context = match self.browsing_contexts.get(&browsing_context_id) {
Some(ctx) => ctx,
None => {
return warn!(
"Script loaded url in iframe with closed browsing context {}.",
browsing_context_id,
)
},
};
let replace = if replace {
Some(NeedsToReload::No(browsing_context.pipeline_id))
} else {
None
}; };
// Create the new pipeline, attached to the parent and push to pending changes // Create the new pipeline, attached to the parent and push to pending changes
@ -1923,11 +1908,11 @@ where
top_level_browsing_context_id, top_level_browsing_context_id,
Some(parent_pipeline_id), Some(parent_pipeline_id),
None, None,
window_size, browsing_context.size,
load_data.clone(), load_data.clone(),
load_info.sandbox, load_info.sandbox,
is_private, is_private,
is_visible, browsing_context.is_visible,
); );
self.add_pending_change(SessionHistoryChange { self.add_pending_change(SessionHistoryChange {
top_level_browsing_context_id: top_level_browsing_context_id, top_level_browsing_context_id: top_level_browsing_context_id,
@ -1958,40 +1943,34 @@ where
// TODO: Referrer? // TODO: Referrer?
let load_data = LoadData::new(url.clone(), Some(parent_pipeline_id), None, None); let load_data = LoadData::new(url.clone(), Some(parent_pipeline_id), None, None);
let (pipeline, is_private, is_visible) = { let (script_sender, parent_browsing_context_id) =
let (script_sender, parent_browsing_context_id) = match self match self.pipelines.get(&parent_pipeline_id) {
.pipelines
.get(&parent_pipeline_id)
{
Some(pipeline) => (pipeline.event_loop.clone(), pipeline.browsing_context_id), Some(pipeline) => (pipeline.event_loop.clone(), pipeline.browsing_context_id),
None => return warn!("Script loaded url in closed iframe {}.", parent_pipeline_id), None => return warn!("Script loaded url in closed iframe {}.", parent_pipeline_id),
}; };
let (is_parent_private, is_parent_visible) = let (is_parent_private, is_parent_visible) =
match self.browsing_contexts.get(&parent_browsing_context_id) { match self.browsing_contexts.get(&parent_browsing_context_id) {
Some(ctx) => (ctx.is_private, ctx.is_visible), Some(ctx) => (ctx.is_private, ctx.is_visible),
None => { None => {
return warn!( return warn!(
"New iframe {} loaded in closed parent browsing context {}.", "New iframe {} loaded in closed parent browsing context {}.",
browsing_context_id, parent_browsing_context_id, browsing_context_id, parent_browsing_context_id,
) )
}, },
}; };
let is_private = is_private || is_parent_private; let is_private = is_private || is_parent_private;
let pipeline = Pipeline::new( let pipeline = Pipeline::new(
new_pipeline_id, new_pipeline_id,
browsing_context_id, browsing_context_id,
top_level_browsing_context_id, top_level_browsing_context_id,
None, None,
script_sender, script_sender,
layout_sender, layout_sender,
self.compositor_proxy.clone(), self.compositor_proxy.clone(),
url, url,
is_parent_visible, is_parent_visible,
load_data, load_data,
); );
(pipeline, is_private, is_parent_visible)
};
assert!(!self.pipelines.contains_key(&new_pipeline_id)); assert!(!self.pipelines.contains_key(&new_pipeline_id));
self.pipelines.insert(new_pipeline_id, pipeline); self.pipelines.insert(new_pipeline_id, pipeline);
@ -2004,7 +1983,7 @@ where
new_browsing_context_info: Some(NewBrowsingContextInfo { new_browsing_context_info: Some(NewBrowsingContextInfo {
parent_pipeline_id: Some(parent_pipeline_id), parent_pipeline_id: Some(parent_pipeline_id),
is_private: is_private, is_private: is_private,
is_visible: is_visible, is_visible: is_parent_visible,
}), }),
}); });
} }
@ -2026,42 +2005,38 @@ where
// TODO: Referrer? // TODO: Referrer?
let load_data = LoadData::new(url.clone(), None, None, None); let load_data = LoadData::new(url.clone(), None, None, None);
let (pipeline, is_private, is_visible) = { let (script_sender, opener_browsing_context_id) =
let (script_sender, opener_browsing_context_id) = match self.pipelines.get(&opener_pipeline_id) {
match self.pipelines.get(&opener_pipeline_id) { Some(pipeline) => (pipeline.event_loop.clone(), pipeline.browsing_context_id),
Some(pipeline) => (pipeline.event_loop.clone(), pipeline.browsing_context_id), None => {
None => { return warn!(
return warn!( "Auxiliary loaded url in closed iframe {}.",
"Auxiliary loaded url in closed iframe {}.", opener_pipeline_id
opener_pipeline_id )
) },
}, };
}; let (is_opener_private, is_opener_visible) =
let (is_opener_private, is_opener_visible) = match self.browsing_contexts.get(&opener_browsing_context_id) {
match self.browsing_contexts.get(&opener_browsing_context_id) { Some(ctx) => (ctx.is_private, ctx.is_visible),
Some(ctx) => (ctx.is_private, ctx.is_visible), None => {
None => { return warn!(
return warn!( "New auxiliary {} loaded in closed opener browsing context {}.",
"New auxiliary {} loaded in closed opener browsing context {}.", new_browsing_context_id, opener_browsing_context_id,
new_browsing_context_id, opener_browsing_context_id, )
) },
}, };
}; let pipeline = Pipeline::new(
let pipeline = Pipeline::new( new_pipeline_id,
new_pipeline_id, new_browsing_context_id,
new_browsing_context_id, new_top_level_browsing_context_id,
new_top_level_browsing_context_id, Some(opener_browsing_context_id),
Some(opener_browsing_context_id), script_sender,
script_sender, layout_sender,
layout_sender, self.compositor_proxy.clone(),
self.compositor_proxy.clone(), url,
url, is_opener_visible,
is_opener_visible, load_data,
load_data, );
);
(pipeline, is_opener_private, is_opener_visible)
};
assert!(!self.pipelines.contains_key(&new_pipeline_id)); assert!(!self.pipelines.contains_key(&new_pipeline_id));
self.pipelines.insert(new_pipeline_id, pipeline); self.pipelines.insert(new_pipeline_id, pipeline);
@ -2080,8 +2055,8 @@ where
new_browsing_context_info: Some(NewBrowsingContextInfo { new_browsing_context_info: Some(NewBrowsingContextInfo {
// Auxiliary browsing contexts are always top-level. // Auxiliary browsing contexts are always top-level.
parent_pipeline_id: None, parent_pipeline_id: None,
is_private: is_private, is_private: is_opener_private,
is_visible: is_visible, is_visible: is_opener_visible,
}), }),
}); });
} }