aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/error.rs3
-rw-r--r--components/script/dom/cssstyledeclaration.rs40
-rw-r--r--components/script/dom/domexception.rs1
-rw-r--r--components/script/dom/htmlelement.rs4
-rw-r--r--components/script/dom/webidls/CSSStyleDeclaration.webidl1
5 files changed, 35 insertions, 14 deletions
diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs
index f9de48935dc..0e887a89e77 100644
--- a/components/script/dom/bindings/error.rs
+++ b/components/script/dom/bindings/error.rs
@@ -35,7 +35,8 @@ pub enum Error {
Network,
Abort,
Timeout,
- DataClone
+ DataClone,
+ NoModificationAllowedError
}
/// The return type for IDL operations that can throw DOM exceptions.
diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs
index 8eab5fcb06e..8b7228dc375 100644
--- a/components/script/dom/cssstyledeclaration.rs
+++ b/components/script/dom/cssstyledeclaration.rs
@@ -4,7 +4,9 @@
use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::{mod, CSSStyleDeclarationMethods};
use dom::bindings::codegen::InheritTypes::{NodeCast, ElementCast};
+use dom::bindings::error::Error;
use dom::bindings::error::ErrorResult;
+use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, JSRef, OptionalRootedRootable, Temporary};
use dom::bindings::utils::{Reflector, reflect_dom_object};
@@ -24,6 +26,13 @@ use std::ascii::AsciiExt;
pub struct CSSStyleDeclaration {
reflector_: Reflector,
owner: JS<HTMLElement>,
+ readonly: bool,
+}
+
+#[deriving(PartialEq)]
+pub enum CSSModificationAccess {
+ ReadWrite,
+ Readonly
}
macro_rules! css_properties(
@@ -53,15 +62,16 @@ fn serialize_value(declaration: &PropertyDeclaration) -> DOMString {
}
impl CSSStyleDeclaration {
- pub fn new_inherited(owner: JSRef<HTMLElement>) -> CSSStyleDeclaration {
+ pub fn new_inherited(owner: JSRef<HTMLElement>, modification_access: CSSModificationAccess) -> CSSStyleDeclaration {
CSSStyleDeclaration {
reflector_: Reflector::new(),
owner: JS::from_rooted(owner),
+ readonly: modification_access == CSSModificationAccess::Readonly,
}
}
- pub fn new(global: JSRef<Window>, owner: JSRef<HTMLElement>) -> Temporary<CSSStyleDeclaration> {
- reflect_dom_object(box CSSStyleDeclaration::new_inherited(owner),
+ pub fn new(global: JSRef<Window>, owner: JSRef<HTMLElement>, modification_access: CSSModificationAccess) -> Temporary<CSSStyleDeclaration> {
+ reflect_dom_object(box CSSStyleDeclaration::new_inherited(owner, modification_access),
GlobalRef::Window(global),
CSSStyleDeclarationBinding::Wrap)
}
@@ -178,7 +188,10 @@ impl<'a> CSSStyleDeclarationMethods for JSRef<'a, CSSStyleDeclaration> {
// http://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-setproperty
fn SetProperty(self, property: DOMString, value: DOMString,
priority: DOMString) -> ErrorResult {
- //TODO: disallow modifications if readonly flag is set
+ // Step 1
+ if self.readonly {
+ return Err(Error::NoModificationAllowedError);
+ }
// Step 2
let property = property.as_slice().to_ascii_lower();
@@ -190,8 +203,7 @@ impl<'a> CSSStyleDeclarationMethods for JSRef<'a, CSSStyleDeclaration> {
// Step 4
if value.is_empty() {
- self.RemoveProperty(property);
- return Ok(());
+ return self.RemoveProperty(property).map(|_| ());
}
// Step 5
@@ -234,7 +246,10 @@ impl<'a> CSSStyleDeclarationMethods for JSRef<'a, CSSStyleDeclaration> {
// http://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-setpropertypriority
fn SetPropertyPriority(self, property: DOMString, priority: DOMString) -> ErrorResult {
- //TODO: disallow modifications if readonly flag is set
+ // Step 1
+ if self.readonly {
+ return Err(Error::NoModificationAllowedError);
+ }
// Step 2
let property = property.as_slice().to_ascii_lower();
@@ -276,8 +291,11 @@ impl<'a> CSSStyleDeclarationMethods for JSRef<'a, CSSStyleDeclaration> {
}
// http://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-removeproperty
- fn RemoveProperty(self, property: DOMString) -> DOMString {
- //TODO: disallow modifications if readonly flag is set
+ fn RemoveProperty(self, property: DOMString) -> Fallible<DOMString> {
+ // Step 1
+ if self.readonly {
+ return Err(Error::NoModificationAllowedError);
+ }
// Step 2
let property = property.as_slice().to_ascii_lower();
@@ -290,7 +308,7 @@ impl<'a> CSSStyleDeclarationMethods for JSRef<'a, CSSStyleDeclaration> {
Some(longhands) => {
// Step 4
for longhand in longhands.iter() {
- self.RemoveProperty(longhand.clone());
+ try!(self.RemoveProperty(longhand.clone()));
}
}
@@ -303,7 +321,7 @@ impl<'a> CSSStyleDeclarationMethods for JSRef<'a, CSSStyleDeclaration> {
}
// Step 6
- value
+ Ok(value)
}
// http://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-cssfloat
diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs
index 71b5f2c3cee..1361d388ebe 100644
--- a/components/script/dom/domexception.rs
+++ b/components/script/dom/domexception.rs
@@ -55,6 +55,7 @@ impl DOMErrorName {
Error::Abort => DOMErrorName::AbortError,
Error::Timeout => DOMErrorName::TimeoutError,
Error::DataClone => DOMErrorName::DataCloneError,
+ Error::NoModificationAllowedError => DOMErrorName::NoModificationAllowedError,
Error::FailureUnknown => panic!(),
}
}
diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs
index 845b534ab0b..46572ed76e0 100644
--- a/components/script/dom/htmlelement.rs
+++ b/components/script/dom/htmlelement.rs
@@ -16,7 +16,7 @@ use dom::bindings::js::{JSRef, Temporary, MutNullableJS};
use dom::bindings::error::ErrorResult;
use dom::bindings::error::Error::Syntax;
use dom::bindings::utils::Reflectable;
-use dom::cssstyledeclaration::CSSStyleDeclaration;
+use dom::cssstyledeclaration::{CSSStyleDeclaration, CSSModificationAccess};
use dom::document::Document;
use dom::domstringmap::DOMStringMap;
use dom::element::{Element, ElementTypeId, ActivationElementHelpers, AttributeHandlers};
@@ -78,7 +78,7 @@ impl<'a> HTMLElementMethods for JSRef<'a, HTMLElement> {
fn Style(self) -> Temporary<CSSStyleDeclaration> {
self.style_decl.or_init(|| {
let global = window_from_node(self).root();
- CSSStyleDeclaration::new(*global, self)
+ CSSStyleDeclaration::new(*global, self, CSSModificationAccess::ReadWrite)
})
}
diff --git a/components/script/dom/webidls/CSSStyleDeclaration.webidl b/components/script/dom/webidls/CSSStyleDeclaration.webidl
index 38f20af8d4e..7f37e44cbbe 100644
--- a/components/script/dom/webidls/CSSStyleDeclaration.webidl
+++ b/components/script/dom/webidls/CSSStyleDeclaration.webidl
@@ -24,6 +24,7 @@ interface CSSStyleDeclaration {
[Throws]
void setPropertyPriority(DOMString property, [TreatNullAs=EmptyString] DOMString priority);
+ [Throws]
DOMString removeProperty(DOMString property);
//readonly attribute CSSRule? parentRule;
[SetterThrows]