diff options
author | Sumit <srivassumit@gmail.com> | 2017-03-16 15:46:45 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2017-04-05 01:52:38 -0400 |
commit | 107ac9ab56c1a4cee3e5f9828f91ab394e3e8eee (patch) | |
tree | d65a403aaf42a086904eb86a9e9c22b2a6a5cdf5 | |
parent | 5421d833de30e0c963bc6241120263897d4fc68c (diff) | |
download | servo-107ac9ab56c1a4cee3e5f9828f91ab394e3e8eee.tar.gz servo-107ac9ab56c1a4cee3e5f9828f91ab394e3e8eee.zip |
Implement basic interface for MutationObserver and MutationRecord.
-rw-r--r-- | components/script/dom/mod.rs | 2 | ||||
-rw-r--r-- | components/script/dom/mutationobserver.rs | 40 | ||||
-rw-r--r-- | components/script/dom/mutationrecord.rs | 34 | ||||
-rw-r--r-- | components/script/dom/webidls/MutationObserver.webidl | 27 | ||||
-rw-r--r-- | components/script/dom/webidls/MutationRecord.webidl | 24 | ||||
-rw-r--r-- | components/script/script_thread.rs | 15 | ||||
-rw-r--r-- | resources/prefs.json | 1 | ||||
-rw-r--r-- | tests/wpt/metadata/dom/nodes/__dir__.ini | 2 |
8 files changed, 145 insertions, 0 deletions
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 7b96ea2523d..2cfcfc894ea 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -378,6 +378,8 @@ pub mod messageevent; pub mod mimetype; pub mod mimetypearray; pub mod mouseevent; +pub mod mutationobserver; +pub mod mutationrecord; pub mod namednodemap; pub mod navigator; pub mod navigatorinfo; diff --git a/components/script/dom/mutationobserver.rs b/components/script/dom/mutationobserver.rs new file mode 100644 index 00000000000..4dc745c1ce8 --- /dev/null +++ b/components/script/dom/mutationobserver.rs @@ -0,0 +1,40 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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 dom::bindings::codegen::Bindings::MutationObserverBinding; +use dom::bindings::codegen::Bindings::MutationObserverBinding::MutationCallback; +use dom::bindings::error::Fallible; +use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; +use dom::window::Window; +use dom_struct::dom_struct; +use script_thread::ScriptThread; +use std::rc::Rc; + +#[dom_struct] +pub struct MutationObserver { + reflector_: Reflector, + #[ignore_heap_size_of = "can't measure Rc values"] + callback: Rc<MutationCallback>, +} + +impl MutationObserver { + fn new(global: &Window, callback: Rc<MutationCallback>) -> Root<MutationObserver> { + let boxed_observer = box MutationObserver::new_inherited(callback); + reflect_dom_object(boxed_observer, global, MutationObserverBinding::Wrap) + } + + fn new_inherited(callback: Rc<MutationCallback>) -> MutationObserver { + MutationObserver { + reflector_: Reflector::new(), + callback: callback, + } + } + + pub fn Constructor(global: &Window, callback: Rc<MutationCallback>) -> Fallible<Root<MutationObserver>> { + let observer = MutationObserver::new(global, callback); + ScriptThread::add_mutation_observer(&*observer); + Ok(observer) + } +} diff --git a/components/script/dom/mutationrecord.rs b/components/script/dom/mutationrecord.rs new file mode 100644 index 00000000000..c39d61ef18a --- /dev/null +++ b/components/script/dom/mutationrecord.rs @@ -0,0 +1,34 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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 dom::bindings::codegen::Bindings::MutationRecordBinding::MutationRecordBinding::MutationRecordMethods; +use dom::bindings::js::{JS, Root}; +use dom::bindings::reflector::Reflector; +use dom::bindings::str::DOMString; +use dom::node::Node; +use dom_struct::dom_struct; + +#[dom_struct] +pub struct MutationRecord { + reflector_: Reflector, + + //property for record type + record_type: DOMString, + + //property for target node + target: JS<Node>, +} + +impl MutationRecordMethods for MutationRecord { + // https://dom.spec.whatwg.org/#dom-mutationrecord-type + fn Type(&self) -> DOMString { + self.record_type.clone() + } + + // https://dom.spec.whatwg.org/#dom-mutationrecord-target + fn Target(&self) -> Root<Node> { + return Root::from_ref(&*self.target); + } + +} diff --git a/components/script/dom/webidls/MutationObserver.webidl b/components/script/dom/webidls/MutationObserver.webidl new file mode 100644 index 00000000000..dbcfa945d4a --- /dev/null +++ b/components/script/dom/webidls/MutationObserver.webidl @@ -0,0 +1,27 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ +/* + * The origin of this IDL file is: + * https://dom.spec.whatwg.org/#mutationobserver + */ + +// https://dom.spec.whatwg.org/#mutationobserver +[Pref="dom.mutation_observer.enabled", Constructor(MutationCallback callback)] +interface MutationObserver { + //void observe(Node target, optional MutationObserverInit options); + //void disconnect(); + //sequence<MutationRecord> takeRecords(); +}; + +callback MutationCallback = void (sequence<MutationRecord> mutations, MutationObserver observer); + +dictionary MutationObserverInit { + boolean childList = false; + boolean attributes; + boolean characterData; + boolean subtree = false; + boolean attributeOldValue; + boolean characterDataOldValue; + sequence<DOMString> attributeFilter; +}; diff --git a/components/script/dom/webidls/MutationRecord.webidl b/components/script/dom/webidls/MutationRecord.webidl new file mode 100644 index 00000000000..286801bf2ab --- /dev/null +++ b/components/script/dom/webidls/MutationRecord.webidl @@ -0,0 +1,24 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ +/* + * The origin of this IDL file is: + * https://dom.spec.whatwg.org/#mutationrecord + */ + +// https://dom.spec.whatwg.org/#mutationrecord +[Pref="dom.mutation_observer.enabled", Exposed=Window] +interface MutationRecord { + readonly attribute DOMString type; + [SameObject] + readonly attribute Node target; + //[SameObject] + //readonly attribute NodeList addedNodes; + //[SameObject] + //readonly attribute NodeList removedNodes; + //readonly attribute Node? previousSibling; + //readonly attribute Node? nextSibling; + //readonly attribute DOMString? attributeName; + //readonly attribute DOMString? attributeNamespace; + //readonly attribute DOMString? oldValue; +}; diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 87cf0920b5e..955887addf4 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -46,6 +46,7 @@ use dom::event::{Event, EventBubbles, EventCancelable}; use dom::globalscope::GlobalScope; use dom::htmlanchorelement::HTMLAnchorElement; use dom::htmliframeelement::HTMLIFrameElement; +use dom::mutationobserver::MutationObserver; use dom::node::{Node, NodeDamage, window_from_node}; use dom::serviceworker::TrustedServiceWorkerAddress; use dom::serviceworkerregistration::ServiceWorkerRegistration; @@ -480,6 +481,9 @@ pub struct ScriptThread { microtask_queue: MicrotaskQueue, + /// The unit of related similar-origin browsing contexts' list of MutationObserver objects + mutation_observers: DOMRefCell<Vec<JS<MutationObserver>>>, + /// A handle to the webvr thread, if available webvr_thread: Option<IpcSender<WebVRMsg>>, @@ -570,6 +574,15 @@ impl ScriptThreadFactory for ScriptThread { } impl ScriptThread { + pub fn add_mutation_observer(observer: &MutationObserver) { + SCRIPT_THREAD_ROOT.with(|root| { + let script_thread = unsafe { &*root.get().unwrap() }; + script_thread.mutation_observers + .borrow_mut() + .push(JS::from_ref(observer)); + }) + } + pub fn mark_document_with_no_blocked_loads(doc: &Document) { SCRIPT_THREAD_ROOT.with(|root| { let script_thread = unsafe { &*root.get().unwrap() }; @@ -722,6 +735,8 @@ impl ScriptThread { microtask_queue: MicrotaskQueue::default(), + mutation_observers: Default::default(), + layout_to_constellation_chan: state.layout_to_constellation_chan, webvr_thread: state.webvr_thread, diff --git a/resources/prefs.json b/resources/prefs.json index 278c5c4f8bf..021354d0cb6 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -4,6 +4,7 @@ "dom.forcetouch.enabled": false, "dom.mouseevent.which.enabled": false, "dom.mozbrowser.enabled": false, + "dom.mutation_observer.enabled": false, "dom.permissions.enabled": false, "dom.permissions.testing.allowed_in_nonsecure_contexts": false, "dom.serviceworker.timeout_seconds": 60, diff --git a/tests/wpt/metadata/dom/nodes/__dir__.ini b/tests/wpt/metadata/dom/nodes/__dir__.ini new file mode 100644 index 00000000000..9aec2255c10 --- /dev/null +++ b/tests/wpt/metadata/dom/nodes/__dir__.ini @@ -0,0 +1,2 @@ +prefs: ["dom.mutation_observer.enabled:true"] + |