diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-06-01 01:59:12 -0500 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2016-06-01 01:59:12 -0500 |
commit | 09e6f4ac546a77294d9af7fe0ff0bc344be8de91 (patch) | |
tree | 522aee4a7c0f52bfcefa177dea69725dcdbc2f91 /components/script/dom | |
parent | 5d86b9b2ae801685cbae7a1d96587a25d993fdf6 (diff) | |
parent | ff995d739c488c2dc042815610af9d9f5e2c46c7 (diff) | |
download | servo-09e6f4ac546a77294d9af7fe0ff0bc344be8de91.tar.gz servo-09e6f4ac546a77294d9af7fe0ff0bc344be8de91.zip |
Auto merge of #11428 - g-k:csstext, r=SimonSapin
csstext
- [x] These changes fix #4431.
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy --faster` reports one error for the `css_properties_accessors!` macro not having a spec link
```
$ git log -1 --format=oneline
91fb9bf1d388c3ede304a5d649dd21fe975787b0 fixup! implement cssText
$ ./mach build -d
Compiling style v0.0.1 (file:///Users/greg/servo/components/style)
Compiling gfx v0.0.1 (file:///Users/greg/servo/components/gfx)
Compiling script v0.0.1 (file:///Users/greg/servo/components/script)
Compiling layout_traits v0.0.1 (file:///Users/greg/servo/components/layout_traits)
Compiling compositing v0.0.1 (file:///Users/greg/servo/components/compositing)
Compiling glutin_app v0.0.1 (file:///Users/greg/servo/ports/glutin)
Compiling constellation v0.0.1 (file:///Users/greg/servo/components/constellation)
Compiling layout v0.0.1 (file:///Users/greg/servo/components/layout)
Compiling servo v0.0.1 (file:///Users/greg/servo/components/servo)
Build completed in 0:05:11.475584
$ ./mach test-tidy --faster
Checking files for tidiness...
./components/script/dom/cssstyledeclaration.rs:386: method declared in webidl is missing a comment with a specification link
Progress: 100% (12/12)
```
- [x] There are tests for these changes. More CSSOM tests pass, but others fail that probably shouldn't:
* `./mach test-css tests/wpt/css-tests/cssom-1_dev/html/index-002.htm` and a bunch of the other tests in `/css-tests/cssom-1_dev/html/ crash when run individually
* `./mach test-css tests/wpt/css-tests/cssom-1_dev/html/cssom-cssText-serialize.htm` fails to strip a trailing semicolon (`left: 10px` vs `left: 10px;`)
* `./mach test-css tests/wpt/css-tests/cssom-1_dev/html/index-001.htm` shared shorthand values aren't coalesced (`margin: 20px` vs. `margin: 20px 20px 20px 20px`)
* `./mach test-css tests/wpt/css-tests/cssom-1_dev/html/cssstyledeclaration-csstext.htm` also crashes and fails for `color: red;` vs. `color: RED;`, preserving declaration insertion order, whitespace in the value, and setting an unknown style property.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/11428)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/cssstyledeclaration.rs | 41 | ||||
-rw-r--r-- | components/script/dom/element.rs | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/CSSStyleDeclaration.webidl | 4 |
3 files changed, 42 insertions, 5 deletions
diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index 4da0b1a019c..101ac3ef252 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use cssparser::ToCss; use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::{self, CSSStyleDeclarationMethods}; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::GlobalRef; @@ -18,7 +19,7 @@ use std::slice; use string_cache::Atom; use style::parser::ParserContextExtraData; use style::properties::{PropertyDeclaration, Shorthand}; -use style::properties::{is_supported_property, parse_one_declaration}; +use style::properties::{is_supported_property, parse_one_declaration, parse_style_attribute}; use style::selector_impl::PseudoElement; // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface @@ -339,6 +340,42 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { rval } - // https://drafts.csswg.org/cssom/#cssstyledeclaration + // https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-csstext + fn CssText(&self) -> DOMString { + let elem = self.owner.upcast::<Element>(); + let style_attribute = elem.style_attribute().borrow(); + + if let Some(declarations) = style_attribute.as_ref() { + DOMString::from(declarations.to_css_string()) + } else { + DOMString::new() + } + } + + // https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-csstext + fn SetCssText(&self, value: DOMString) -> ErrorResult { + let window = window_from_node(self.owner.upcast::<Node>()); + let element = self.owner.upcast::<Element>(); + + // Step 1 + if self.readonly { + return Err(Error::NoModificationAllowed); + } + + // Step 3 + let decl_block = parse_style_attribute(&value, &window.get_url(), window.css_error_reporter(), + ParserContextExtraData::default()); + *element.style_attribute().borrow_mut() = if decl_block.normal.is_empty() && decl_block.important.is_empty() { + None // Step 2 + } else { + Some(decl_block) + }; + element.sync_property_with_attrs_style(); + let node = element.upcast::<Node>(); + node.dirty(NodeDamage::NodeStyleDamaged); + Ok(()) + } + + // https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-_camel_cased_attribute css_properties_accessors!(css_properties); } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 2d92c5995e3..bb97931a9d9 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -700,7 +700,7 @@ impl Element { // this sync method is called upon modification of the style_attribute property, // therefore, it should not trigger subsequent mutation events - fn sync_property_with_attrs_style(&self) { + pub fn sync_property_with_attrs_style(&self) { let style_str = if let &Some(ref declarations) = &*self.style_attribute().borrow() { declarations.to_css_string() } else { diff --git a/components/script/dom/webidls/CSSStyleDeclaration.webidl b/components/script/dom/webidls/CSSStyleDeclaration.webidl index 1d1d5223183..cf7c3ade7f2 100644 --- a/components/script/dom/webidls/CSSStyleDeclaration.webidl +++ b/components/script/dom/webidls/CSSStyleDeclaration.webidl @@ -9,8 +9,8 @@ */ interface CSSStyleDeclaration { - //[SetterThrows] - // attribute DOMString cssText; + [SetterThrows] + attribute DOMString cssText; readonly attribute unsigned long length; getter DOMString item(unsigned long index); DOMString getPropertyValue(DOMString property); |