style: relax assertions in dom::element when setting selector flags.

Fixes #16409
This commit is contained in:
Emilio Cobos Álvarez 2017-04-13 17:32:13 +08:00
parent b514168469
commit 39ab49823b
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
2 changed files with 10 additions and 1 deletions

View file

@ -780,7 +780,7 @@ impl LayoutElementHelpers for LayoutJS<Element> {
#[inline] #[inline]
#[allow(unsafe_code)] #[allow(unsafe_code)]
fn insert_selector_flags(&self, flags: ElementSelectorFlags) { fn insert_selector_flags(&self, flags: ElementSelectorFlags) {
debug_assert!(thread_state::get() == thread_state::LAYOUT); debug_assert!(thread_state::get().is_layout());
unsafe { unsafe {
let f = &(*self.unsafe_get()).selector_flags; let f = &(*self.unsafe_get()).selector_flags;
f.set(f.get() | flags); f.set(f.get() | flags);

View file

@ -930,8 +930,17 @@ pub trait MatchMethods : TElement {
let self_flags = flags.for_self(); let self_flags = flags.for_self();
if !self_flags.is_empty() { if !self_flags.is_empty() {
if element == self { if element == self {
// If this is the element we're styling, we have exclusive
// access to the element, and thus it's fine inserting them,
// even from the worker.
unsafe { element.set_selector_flags(self_flags); } unsafe { element.set_selector_flags(self_flags); }
} else { } else {
// Otherwise, this element is an ancestor of the current element
// we're styling, and thus multiple children could write to it
// if we did from here.
//
// Instead, we can read them, and post them if necessary as a
// sequential task in order for them to be processed later.
if !element.has_selector_flags(self_flags) { if !element.has_selector_flags(self_flags) {
let task = let task =
SequentialTask::set_selector_flags(element.clone(), SequentialTask::set_selector_flags(element.clone(),