aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout/layout_task.rs28
-rw-r--r--components/script/layout_interface.rs3
-rw-r--r--components/script/script_task.rs5
3 files changed, 28 insertions, 8 deletions
diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs
index cf7ca56da00..f0d64398337 100644
--- a/components/layout/layout_task.rs
+++ b/components/layout/layout_task.rs
@@ -54,6 +54,7 @@ use script_traits::{ConstellationControlMsg, LayoutControlMsg, OpaqueScriptLayou
use sequential;
use serde_json;
use std::borrow::ToOwned;
+use std::cell::{Cell, RefCell};
use std::collections::HashMap;
use std::collections::hash_state::DefaultState;
use std::mem::transmute;
@@ -119,7 +120,7 @@ pub struct LayoutTask {
id: PipelineId,
/// The URL of the pipeline that we belong to.
- url: Url,
+ url: RefCell<Option<Url>>,
/// Is the current reflow of an iframe, as opposed to a root window?
is_iframe: bool,
@@ -404,7 +405,7 @@ impl LayoutTask {
LayoutTask {
id: id,
- url: url,
+ url: RefCell::new(Some(url)),
is_iframe: is_iframe,
port: port,
pipeline_port: pipeline_receiver,
@@ -625,6 +626,10 @@ impl LayoutTask {
Msg::CreateLayoutTask(info) => {
self.create_layout_task(info)
}
+ Msg::SetFinalUrl(final_url) => {
+ let mut url_ref_cell = self.url.borrow_mut();
+ *url_ref_cell = Some(final_url);
+ },
Msg::PrepareToExit(response_chan) => {
self.prepare_to_exit(response_chan);
return false
@@ -647,15 +652,17 @@ impl LayoutTask {
// FIXME(njn): Just measuring the display tree for now.
let rw_data = possibly_locked_rw_data.lock();
let stacking_context = rw_data.stacking_context.as_ref();
+ let ref formatted_url = *self.url.borrow().as_ref().map_or("url(None)".to_owned(),
+ |url| format!("url({})", url));
reports.push(Report {
- path: path![format!("url({})", self.url), "layout-task", "display-list"],
+ path: path![formatted_url, "layout-task", "display-list"],
kind: ReportKind::ExplicitJemallocHeapSize,
size: stacking_context.map_or(0, |sc| sc.heap_size_of_children()),
});
// The LayoutTask has a context in TLS...
reports.push(Report {
- path: path![format!("url({})", self.url), "layout-task", "local-context"],
+ path: path![formatted_url, "layout-task", "local-context"],
kind: ReportKind::ExplicitJemallocHeapSize,
size: heap_size_of_local_context(),
});
@@ -665,7 +672,7 @@ impl LayoutTask {
let sizes = traversal.heap_size_of_tls(heap_size_of_local_context);
for (i, size) in sizes.iter().enumerate() {
reports.push(Report {
- path: path![format!("url({})", self.url),
+ path: path![formatted_url,
format!("layout-worker-{}-local-context", i)],
kind: ReportKind::ExplicitJemallocHeapSize,
size: *size,
@@ -943,6 +950,8 @@ impl LayoutTask {
Some(x) => x,
};
+ debug!("layout: received layout request for: {}",
+ self.url.borrow().as_ref().map_or("None".to_owned(), |url| url.serialize()));
if log_enabled!(log::LogLevel::Debug) {
node.dump();
}
@@ -1005,9 +1014,10 @@ impl LayoutTask {
}
// Create a layout context for use throughout the following passes.
+ let url_clone = &self.url.borrow().as_ref().unwrap().clone();
let mut shared_layout_context = self.build_shared_layout_context(&*rw_data,
viewport_size_changed,
- &self.url,
+ url_clone,
data.reflow_info.goal);
if node.is_dirty() || node.has_dirty_descendants() {
@@ -1118,9 +1128,10 @@ impl LayoutTask {
page_clip_rect: MAX_RECT,
};
+ let url_clone = &self.url.borrow().as_ref().unwrap().clone();
let mut layout_context = self.build_shared_layout_context(&*rw_data,
false,
- &self.url,
+ url_clone,
reflow_info.goal);
self.perform_post_main_layout_passes(&reflow_info, &mut *rw_data, &mut layout_context);
@@ -1142,9 +1153,10 @@ impl LayoutTask {
page_clip_rect: MAX_RECT,
};
+ let url_clone = &self.url.borrow().as_ref().unwrap().clone();
let mut layout_context = self.build_shared_layout_context(&*rw_data,
false,
- &self.url,
+ url_clone,
reflow_info.goal);
if let Some(mut root_flow) = self.root_flow.clone() {
diff --git a/components/script/layout_interface.rs b/components/script/layout_interface.rs
index 4a78e23e23c..f18c850b077 100644
--- a/components/script/layout_interface.rs
+++ b/components/script/layout_interface.rs
@@ -86,6 +86,9 @@ pub enum Msg {
///
/// This basically exists to keep the script-layout dependency one-way.
CreateLayoutTask(NewLayoutTaskInfo),
+
+ /// Set the final Url.
+ SetFinalUrl(Url),
}
/// Synchronous messages that script can send to layout.
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index f0ea6bd1354..22da6c81a98 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -1549,6 +1549,11 @@ impl ScriptTask {
/// objects, parses HTML and CSS, and kicks off initial layout.
fn load(&self, metadata: Metadata, incomplete: InProgressLoad) -> ParserRoot {
let final_url = metadata.final_url.clone();
+ {
+ // send the final url to the layout task.
+ let LayoutChan(ref chan) = incomplete.layout_chan;
+ chan.send(layout_interface::Msg::SetFinalUrl(final_url.clone())).unwrap();
+ }
debug!("ScriptTask: loading {} on page {:?}", incomplete.url.serialize(), incomplete.pipeline_id);
// We should either be initializing a root page or loading a child page of an