mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Auto merge of #14845 - jdm:restyle-ood, r=emilio
Avoid restyling elements that aren't in a document - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #14480 - [X] There are tests for these changes <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14845) <!-- Reviewable:end -->
This commit is contained in:
commit
2fe914e2fa
5 changed files with 49 additions and 3 deletions
|
@ -66,7 +66,7 @@ use dom::keyboardevent::KeyboardEvent;
|
|||
use dom::location::Location;
|
||||
use dom::messageevent::MessageEvent;
|
||||
use dom::mouseevent::MouseEvent;
|
||||
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage, window_from_node};
|
||||
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage, window_from_node, IS_IN_DOC, LayoutNodeHelpers};
|
||||
use dom::nodeiterator::NodeIterator;
|
||||
use dom::nodelist::NodeList;
|
||||
use dom::pagetransitionevent::PageTransitionEvent;
|
||||
|
@ -1788,7 +1788,12 @@ impl LayoutDocumentHelpers for LayoutJS<Document> {
|
|||
#[allow(unrooted_must_root)]
|
||||
unsafe fn drain_pending_restyles(&self) -> Vec<(LayoutJS<Element>, PendingRestyle)> {
|
||||
let mut elements = (*self.unsafe_get()).pending_restyles.borrow_mut_for_layout();
|
||||
let result = elements.drain().map(|(k, v)| (k.to_layout(), v)).collect();
|
||||
// Elements were in a document when they were adding to this list, but that
|
||||
// may no longer be true when the next layout occurs.
|
||||
let result = elements.drain()
|
||||
.map(|(k, v)| (k.to_layout(), v))
|
||||
.filter(|&(ref k, _)| k.upcast::<Node>().get_flag(IS_IN_DOC))
|
||||
.collect();
|
||||
result
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ use dom::bindings::js::LayoutJS;
|
|||
use dom::characterdata::LayoutCharacterDataHelpers;
|
||||
use dom::document::{Document, LayoutDocumentHelpers, PendingRestyle};
|
||||
use dom::element::{Element, LayoutElementHelpers, RawLayoutElementHelpers};
|
||||
use dom::node::{CAN_BE_FRAGMENTED, DIRTY_ON_VIEWPORT_SIZE_CHANGE, HAS_DIRTY_DESCENDANTS};
|
||||
use dom::node::{CAN_BE_FRAGMENTED, DIRTY_ON_VIEWPORT_SIZE_CHANGE, HAS_DIRTY_DESCENDANTS, IS_IN_DOC};
|
||||
use dom::node::{LayoutNodeHelpers, Node};
|
||||
use dom::text::Text;
|
||||
use gfx_traits::ByteIndex;
|
||||
|
@ -404,6 +404,7 @@ impl<'le> TElement for ServoLayoutElement<'le> {
|
|||
}
|
||||
|
||||
unsafe fn set_dirty_descendants(&self) {
|
||||
debug_assert!(self.as_node().node.get_flag(IS_IN_DOC));
|
||||
self.as_node().node.set_flag(HAS_DIRTY_DESCENDANTS, true)
|
||||
}
|
||||
|
||||
|
|
|
@ -6438,6 +6438,18 @@
|
|||
"url": "/_mozilla/mozilla/iframe/resize_after_load.html"
|
||||
}
|
||||
],
|
||||
"mozilla/restyle-out-of-document.html": [
|
||||
{
|
||||
"path": "mozilla/restyle-out-of-document.html",
|
||||
"references": [
|
||||
[
|
||||
"/_mozilla/mozilla/restyle-out-of-document-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
"url": "/_mozilla/mozilla/restyle-out-of-document.html"
|
||||
}
|
||||
],
|
||||
"mozilla/scrolling_div_background_borders.html": [
|
||||
{
|
||||
"path": "mozilla/scrolling_div_background_borders.html",
|
||||
|
@ -21732,6 +21744,18 @@
|
|||
"url": "/_mozilla/mozilla/iframe/resize_after_load.html"
|
||||
}
|
||||
],
|
||||
"mozilla/restyle-out-of-document.html": [
|
||||
{
|
||||
"path": "mozilla/restyle-out-of-document.html",
|
||||
"references": [
|
||||
[
|
||||
"/_mozilla/mozilla/restyle-out-of-document-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
"url": "/_mozilla/mozilla/restyle-out-of-document.html"
|
||||
}
|
||||
],
|
||||
"mozilla/scrolling_div_background_borders.html": [
|
||||
{
|
||||
"path": "mozilla/scrolling_div_background_borders.html",
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<span>Visible content.</span>
|
13
tests/wpt/mozilla/tests/mozilla/restyle-out-of-document.html
Normal file
13
tests/wpt/mozilla/tests/mozilla/restyle-out-of-document.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>Verify that dirtying an element and removing it from the document before it's restyled doesn't mess up layout</title>
|
||||
<link rel='match' href='restyle-out-of-document-ref.html'>
|
||||
<div><strong>Removed content.</strong></div>
|
||||
<span>Visible content.</span>
|
||||
<script>
|
||||
addEventListener('load', function() {
|
||||
var d = document.querySelector('div');
|
||||
d.firstChild.style.display = "none";
|
||||
d.remove();
|
||||
}, true);
|
||||
</script>
|
Loading…
Add table
Add a link
Reference in a new issue