mirror of
https://github.com/servo/servo.git
synced 2025-06-08 08:33:26 +00:00
Avoid Window::GetComputedStyle
when checking for display: none
This commit is contained in:
parent
1d8e78720b
commit
8d09398230
5 changed files with 10 additions and 19 deletions
|
@ -9,7 +9,6 @@ use canvas_traits::canvas::{RadialGradientStyle, RepetitionStyle, byte_swap_and_
|
||||||
use cssparser::{Parser, ParserInput, RGBA};
|
use cssparser::{Parser, ParserInput, RGBA};
|
||||||
use cssparser::Color as CSSColor;
|
use cssparser::Color as CSSColor;
|
||||||
use dom::bindings::cell::DomRefCell;
|
use dom::bindings::cell::DomRefCell;
|
||||||
use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclarationMethods;
|
|
||||||
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding;
|
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding;
|
||||||
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasFillRule;
|
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasFillRule;
|
||||||
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasImageSource;
|
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasImageSource;
|
||||||
|
@ -17,7 +16,6 @@ use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasLin
|
||||||
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasLineJoin;
|
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasLineJoin;
|
||||||
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods;
|
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods;
|
||||||
use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods;
|
use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods;
|
||||||
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
|
|
||||||
use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern;
|
use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern;
|
||||||
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
use dom::bindings::error::{Error, ErrorResult, Fallible};
|
||||||
use dom::bindings::inheritance::Castable;
|
use dom::bindings::inheritance::Castable;
|
||||||
|
@ -27,6 +25,7 @@ use dom::bindings::root::{Dom, DomRoot, LayoutDom};
|
||||||
use dom::bindings::str::DOMString;
|
use dom::bindings::str::DOMString;
|
||||||
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
|
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
|
||||||
use dom::canvaspattern::CanvasPattern;
|
use dom::canvaspattern::CanvasPattern;
|
||||||
|
use dom::element::Element;
|
||||||
use dom::globalscope::GlobalScope;
|
use dom::globalscope::GlobalScope;
|
||||||
use dom::htmlcanvaselement::HTMLCanvasElement;
|
use dom::htmlcanvaselement::HTMLCanvasElement;
|
||||||
use dom::imagedata::ImageData;
|
use dom::imagedata::ImageData;
|
||||||
|
@ -543,18 +542,11 @@ impl CanvasRenderingContext2D {
|
||||||
Some(ref canvas) => &**canvas,
|
Some(ref canvas) => &**canvas,
|
||||||
};
|
};
|
||||||
|
|
||||||
let window = window_from_node(canvas);
|
let canvas_element = canvas.upcast::<Element>();
|
||||||
|
|
||||||
let style = window.GetComputedStyle(canvas.upcast(), None);
|
match canvas_element.style() {
|
||||||
|
Some(ref s) if canvas_element.has_css_layout_box() => Ok(s.get_color().color),
|
||||||
let element_not_rendered =
|
_ => Ok(RGBA::new(0, 0, 0, 255))
|
||||||
!canvas.upcast::<Node>().is_in_doc() ||
|
|
||||||
style.GetPropertyValue(DOMString::from("display")) == "none";
|
|
||||||
|
|
||||||
if element_not_rendered {
|
|
||||||
Ok(RGBA::new(0, 0, 0, 255))
|
|
||||||
} else {
|
|
||||||
self.parse_color(&style.GetPropertyValue(DOMString::from("color")))
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_ => Err(())
|
_ => Err(())
|
||||||
|
|
|
@ -350,14 +350,14 @@ impl Element {
|
||||||
|
|
||||||
/// style will be `None` for elements in a `display: none` subtree. otherwise, the element has a
|
/// style will be `None` for elements in a `display: none` subtree. otherwise, the element has a
|
||||||
/// layout box iff it doesn't have `display: none`.
|
/// layout box iff it doesn't have `display: none`.
|
||||||
fn style(&self) -> Option<Arc<ComputedValues>> {
|
pub fn style(&self) -> Option<Arc<ComputedValues>> {
|
||||||
window_from_node(self).style_query(
|
window_from_node(self).style_query(
|
||||||
self.upcast::<Node>().to_trusted_node_address()
|
self.upcast::<Node>().to_trusted_node_address()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://drafts.csswg.org/cssom-view/#css-layout-box
|
// https://drafts.csswg.org/cssom-view/#css-layout-box
|
||||||
fn has_css_layout_box(&self) -> bool {
|
pub fn has_css_layout_box(&self) -> bool {
|
||||||
self.style()
|
self.style()
|
||||||
.map_or(false, |s| !s.get_box().clone_display().is_none())
|
.map_or(false, |s| !s.get_box().clone_display().is_none())
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId};
|
||||||
use devtools_traits::CSSError;
|
use devtools_traits::CSSError;
|
||||||
use document_loader::DocumentLoader;
|
use document_loader::DocumentLoader;
|
||||||
use dom::bindings::cell::DomRefCell;
|
use dom::bindings::cell::DomRefCell;
|
||||||
use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclarationMethods;
|
|
||||||
use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
|
use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
|
||||||
use dom::bindings::codegen::Bindings::EventBinding::EventInit;
|
use dom::bindings::codegen::Bindings::EventBinding::EventInit;
|
||||||
use dom::bindings::codegen::Bindings::TransitionEventBinding::TransitionEventInit;
|
use dom::bindings::codegen::Bindings::TransitionEventBinding::TransitionEventInit;
|
||||||
|
@ -1955,7 +1954,7 @@ impl ScriptThread {
|
||||||
node.dirty(NodeDamage::NodeStyleDamaged);
|
node.dirty(NodeDamage::NodeStyleDamaged);
|
||||||
|
|
||||||
if let Some(el) = node.downcast::<Element>() {
|
if let Some(el) = node.downcast::<Element>() {
|
||||||
if &*window.GetComputedStyle(el, None).Display() == "none" {
|
if !el.has_css_layout_box() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72327,7 +72327,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"mozilla/transitionend_safety.html": [
|
"mozilla/transitionend_safety.html": [
|
||||||
"778e43b049aa421bad7f86eb03d0955576a84ce0",
|
"16d238e94b2cc2843c9aee4210db43d496bb3114",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"mozilla/union.html": [
|
"mozilla/union.html": [
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
elem.textContent = 'hi there';
|
elem.textContent = 'hi there';
|
||||||
elem.style.transition = 'color 10ms';
|
elem.style.transition = 'color 10ms';
|
||||||
elem.style.color = 'black';
|
elem.style.color = 'black';
|
||||||
elem.ontransitionend = t.step_func_done();
|
|
||||||
|
|
||||||
t.step_timeout(function() {
|
t.step_timeout(function() {
|
||||||
elem.style.color = 'red';
|
elem.style.color = 'red';
|
||||||
|
@ -20,6 +19,7 @@
|
||||||
document.body.removeChild(elem);
|
document.body.removeChild(elem);
|
||||||
elem = null;
|
elem = null;
|
||||||
window.gc();
|
window.gc();
|
||||||
|
t.step_timeout(t.step_func_done(), 100);
|
||||||
}, 0);
|
}, 0);
|
||||||
}, 0);
|
}, 0);
|
||||||
}, 'Nodes cannot be GCed while a CSS transition is in effect.');
|
}, 'Nodes cannot be GCed while a CSS transition is in effect.');
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue