mirror of
https://github.com/servo/servo.git
synced 2025-07-23 15:23:42 +01:00
Cleanup constellation after nll
This commit is contained in:
parent
a2c4eba720
commit
aecb48d5d1
1 changed files with 110 additions and 135 deletions
|
@ -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,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue