mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Create new image cache per document (#36832)
Rather than sharing the full image cache in a script_thread, the image cache is now unique per document. This ensures that CSP factors no longer affect whether the image is retrieved from the cache incorrectly. To do so, the thread_pool is shared across all caches, but the store is fresh. Except for the place_holder{image,url}, which are cloned. That's because the `rippy_data` is only available in the constellation and no longer accessible at the point that we need to create the document in the script_thread. Contrary to the description in #36505, the script_thread still has an image_cache for this reason: so it has access to the store and thread_pool to clone it. With these changes, the two CSP tests no longer flake. Confirmed with running the following commmand: ``` ./mach test-wpt tests/wpt/tests/content-security-policy/generic/ --rerun=10 ``` Fixes #36505 Signed-off-by: Tim van der Lippe <tvanderlippe@gmail.com>
This commit is contained in:
parent
3db0194e5a
commit
8a837778d9
14 changed files with 68 additions and 95 deletions
|
@ -452,6 +452,8 @@ impl Layout for LayoutThread {
|
||||||
.map(|tree| tree.conditional_size_of(ops))
|
.map(|tree| tree.conditional_size_of(ops))
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
reports.push(self.image_cache.memory_report(formatted_url, ops));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_quirks_mode(&mut self, quirks_mode: QuirksMode) {
|
fn set_quirks_mode(&mut self, quirks_mode: QuirksMode) {
|
||||||
|
|
|
@ -431,7 +431,7 @@ pub struct ImageCacheImpl {
|
||||||
store: Arc<Mutex<ImageCacheStore>>,
|
store: Arc<Mutex<ImageCacheStore>>,
|
||||||
|
|
||||||
/// Thread pool for image decoding
|
/// Thread pool for image decoding
|
||||||
thread_pool: CoreResourceThreadPool,
|
thread_pool: Arc<CoreResourceThreadPool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ImageCache for ImageCacheImpl {
|
impl ImageCache for ImageCacheImpl {
|
||||||
|
@ -454,7 +454,10 @@ impl ImageCache for ImageCacheImpl {
|
||||||
placeholder_url: ServoUrl::parse("chrome://resources/rippy.png").unwrap(),
|
placeholder_url: ServoUrl::parse("chrome://resources/rippy.png").unwrap(),
|
||||||
compositor_api,
|
compositor_api,
|
||||||
})),
|
})),
|
||||||
thread_pool: CoreResourceThreadPool::new(thread_count, "ImageCache".to_string()),
|
thread_pool: Arc::new(CoreResourceThreadPool::new(
|
||||||
|
thread_count,
|
||||||
|
"ImageCache".to_string(),
|
||||||
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -651,6 +654,25 @@ impl ImageCache for ImageCacheImpl {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_new_image_cache(
|
||||||
|
&self,
|
||||||
|
compositor_api: CrossProcessCompositorApi,
|
||||||
|
) -> Arc<dyn ImageCache> {
|
||||||
|
let store = self.store.lock().unwrap();
|
||||||
|
let placeholder_image = store.placeholder_image.clone();
|
||||||
|
let placeholder_url = store.placeholder_url.clone();
|
||||||
|
Arc::new(ImageCacheImpl {
|
||||||
|
store: Arc::new(Mutex::new(ImageCacheStore {
|
||||||
|
pending_loads: AllPendingLoads::new(),
|
||||||
|
completed_loads: HashMap::new(),
|
||||||
|
placeholder_image,
|
||||||
|
placeholder_url,
|
||||||
|
compositor_api,
|
||||||
|
})),
|
||||||
|
thread_pool: self.thread_pool.clone(),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ImageCacheImpl {
|
impl ImageCacheImpl {
|
||||||
|
|
|
@ -745,7 +745,9 @@ impl ScriptThread {
|
||||||
.senders
|
.senders
|
||||||
.pipeline_to_constellation_sender
|
.pipeline_to_constellation_sender
|
||||||
.clone(),
|
.clone(),
|
||||||
image_cache: script_thread.image_cache.clone(),
|
image_cache: script_thread
|
||||||
|
.image_cache
|
||||||
|
.create_new_image_cache(script_thread.compositor_api.clone()),
|
||||||
#[cfg(feature = "webgpu")]
|
#[cfg(feature = "webgpu")]
|
||||||
gpu_id_hub: script_thread.gpu_id_hub.clone(),
|
gpu_id_hub: script_thread.gpu_id_hub.clone(),
|
||||||
inherited_secure_context: script_thread.inherited_secure_context,
|
inherited_secure_context: script_thread.inherited_secure_context,
|
||||||
|
@ -2443,8 +2445,6 @@ impl ScriptThread {
|
||||||
|
|
||||||
let prefix = format!("url({urls})");
|
let prefix = format!("url({urls})");
|
||||||
reports.extend(self.get_cx().get_reports(prefix.clone(), ops));
|
reports.extend(self.get_cx().get_reports(prefix.clone(), ops));
|
||||||
|
|
||||||
reports.push(self.image_cache.memory_report(&prefix, ops));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
reports_chan.send(ProcessReports::new(reports));
|
reports_chan.send(ProcessReports::new(reports));
|
||||||
|
@ -3145,13 +3145,17 @@ impl ScriptThread {
|
||||||
self.resource_threads.clone(),
|
self.resource_threads.clone(),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
let image_cache = self
|
||||||
|
.image_cache
|
||||||
|
.create_new_image_cache(self.compositor_api.clone());
|
||||||
|
|
||||||
let layout_config = LayoutConfig {
|
let layout_config = LayoutConfig {
|
||||||
id: incomplete.pipeline_id,
|
id: incomplete.pipeline_id,
|
||||||
webview_id: incomplete.webview_id,
|
webview_id: incomplete.webview_id,
|
||||||
url: final_url.clone(),
|
url: final_url.clone(),
|
||||||
is_iframe: incomplete.parent_info.is_some(),
|
is_iframe: incomplete.parent_info.is_some(),
|
||||||
script_chan: self.senders.constellation_sender.clone(),
|
script_chan: self.senders.constellation_sender.clone(),
|
||||||
image_cache: self.image_cache.clone(),
|
image_cache: image_cache.clone(),
|
||||||
font_context: font_context.clone(),
|
font_context: font_context.clone(),
|
||||||
time_profiler_chan: self.senders.time_profiler_sender.clone(),
|
time_profiler_chan: self.senders.time_profiler_sender.clone(),
|
||||||
compositor_api: self.compositor_api.clone(),
|
compositor_api: self.compositor_api.clone(),
|
||||||
|
@ -3166,7 +3170,7 @@ impl ScriptThread {
|
||||||
self.layout_factory.create(layout_config),
|
self.layout_factory.create(layout_config),
|
||||||
font_context,
|
font_context,
|
||||||
self.senders.image_cache_sender.clone(),
|
self.senders.image_cache_sender.clone(),
|
||||||
self.image_cache.clone(),
|
image_cache.clone(),
|
||||||
self.resource_threads.clone(),
|
self.resource_threads.clone(),
|
||||||
#[cfg(feature = "bluetooth")]
|
#[cfg(feature = "bluetooth")]
|
||||||
self.senders.bluetooth_sender.clone(),
|
self.senders.bluetooth_sender.clone(),
|
||||||
|
|
|
@ -141,4 +141,10 @@ pub trait ImageCache: Sync + Send {
|
||||||
|
|
||||||
/// Inform the image cache about a response for a pending request.
|
/// Inform the image cache about a response for a pending request.
|
||||||
fn notify_pending_response(&self, id: PendingImageId, action: FetchResponseMsg);
|
fn notify_pending_response(&self, id: PendingImageId, action: FetchResponseMsg);
|
||||||
|
|
||||||
|
/// Create new image cache based on this one, while reusing the existing thread_pool.
|
||||||
|
fn create_new_image_cache(
|
||||||
|
&self,
|
||||||
|
compositor_api: CrossProcessCompositorApi,
|
||||||
|
) -> Arc<dyn ImageCache>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,12 @@
|
||||||
[invalid-characters-in-policy.html]
|
[invalid-characters-in-policy.html]
|
||||||
[Should not load image with 'none' CSP - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Should not load image with 'none' CSP - HTTP header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Non-ASCII character in directive value should not affect other directives. - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Non-ASCII character in directive value should not affect other directives. - HTTP header]
|
[Non-ASCII character in directive value should not affect other directives. - HTTP header]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Non-ASCII character in directive name should not affect other directives. - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Non-ASCII character in directive name should not affect other directives. - HTTP header]
|
[Non-ASCII character in directive name should not affect other directives. - HTTP header]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[Non-ASCII character in directive value should drop the whole directive. - meta tag]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[Non-ASCII quote character in directive value should drop the whole directive. - meta tag]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -6,50 +6,5 @@
|
||||||
[U+000C FF should be properly parsed inside directive value - HTTP header]
|
[U+000C FF should be properly parsed inside directive value - HTTP header]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
[Should not load image with 'none' CSP - meta tag]
|
[U+00A0 NBSP should not be parsed inside directive value - meta tag]
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Should not load image with 'none' CSP - HTTP header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0009 TAB should be properly parsed between directive name and value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0009 TAB should be properly parsed between directive name and value - HTTP header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+000C FF should be properly parsed between directive name and value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+000A LF should be properly parsed between directive name and value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+000D CR should be properly parsed between directive name and value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0020 SPACE should be properly parsed between directive name and value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0020 SPACE should be properly parsed between directive name and value - HTTP header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0009 TAB should be properly parsed inside directive value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0009 TAB should be properly parsed inside directive value - HTTP header]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+000C FF should be properly parsed inside directive value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+000A LF should be properly parsed inside directive value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+000D CR should be properly parsed inside directive value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0020 SPACE should be properly parsed inside directive value - meta tag]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[U+0020 SPACE should be properly parsed inside directive value - HTTP header]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
|
@ -16,9 +16,3 @@
|
||||||
|
|
||||||
[History navigation in iframe: data URL document is navigated back from history cross-origin.]
|
[History navigation in iframe: data URL document is navigated back from history cross-origin.]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[History navigation in iframe: srcdoc iframe is navigated back from history same-origin.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[History navigation in iframe: srcdoc iframe is navigated back from history cross-origin.]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -4,3 +4,15 @@
|
||||||
|
|
||||||
[<iframe sandbox src='blob:...'>'s inherits policy. (opaque origin sandbox)]
|
[<iframe sandbox src='blob:...'>'s inherits policy. (opaque origin sandbox)]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[window about:blank inherits policy.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[<iframe src='blob:...'>'s inherits policy.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[window url='blob:...' inherits policy.]
|
||||||
|
expected: FAIL
|
||||||
|
|
||||||
|
[window url='javascript:...'>'s inherits policy (static <img> is blocked)]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
[iframe-srcdoc-inheritance.html]
|
|
||||||
expected: TIMEOUT
|
|
||||||
[Second image should be blocked]
|
|
||||||
expected: NOTRUN
|
|
|
@ -2,3 +2,6 @@
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
[location.reload() of srcdoc iframe.]
|
[location.reload() of srcdoc iframe.]
|
||||||
expected: TIMEOUT
|
expected: TIMEOUT
|
||||||
|
|
||||||
|
[location.reload() of blob URL iframe.]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
[background-image-shared-stylesheet.html]
|
|
||||||
expected: TIMEOUT
|
|
|
@ -1,4 +1,3 @@
|
||||||
[stale-image.html]
|
[stale-image.html]
|
||||||
expected: TIMEOUT
|
|
||||||
[Cache returns stale resource]
|
[Cache returns stale resource]
|
||||||
expected: TIMEOUT
|
expected: FAIL
|
||||||
|
|
|
@ -7,3 +7,6 @@
|
||||||
|
|
||||||
[The line height calculation quirk, <table><tr><td id=test><img src="{png}"> <img src="{png}"><tr><td id=ref>x<tr><td id=s_ref>x</table>]
|
[The line height calculation quirk, <table><tr><td id=test><img src="{png}"> <img src="{png}"><tr><td id=ref>x<tr><td id=s_ref>x</table>]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
[The line height calculation quirk, #test img { padding:1px }<div id=test><img src="{png}"></div><img id=ref src="{png}" height=3><div id=s_ref>x</div>]
|
||||||
|
expected: FAIL
|
||||||
|
|
|
@ -1,18 +1,3 @@
|
||||||
[table-cell-width-calculation.html]
|
[table-cell-width-calculation.html]
|
||||||
[The table cell width calculation quirk, basic]
|
[The table cell width calculation quirk, the quirk shouldn't apply for <video poster>]
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[The table cell width calculation quirk, inline-block]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[The table cell width calculation quirk, img in span]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[The table cell width calculation quirk, the don't-wrap rule is only for the purpose of calculating the width of the cell]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[The table cell width calculation quirk, display:table-cell on span]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[The table cell width calculation quirk, display:table-cell on span, wbr]
|
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue