diff options
author | Connor Brewster <brewsterc@my.caspercollege.edu> | 2016-05-03 16:10:13 -0600 |
---|---|---|
committer | Connor Brewster <brewsterc@my.caspercollege.edu> | 2016-05-11 22:11:46 -0600 |
commit | 11dd0d7c46e9b61a0d7174202ca16200c98eda1a (patch) | |
tree | e186e0ceed9ab1d4ca28bebf8cd4c2b187e8a21c /components | |
parent | 641b374f0b752671207d21941c3e5ff4e681d706 (diff) | |
download | servo-11dd0d7c46e9b61a0d7174202ca16200c98eda1a.tar.gz servo-11dd0d7c46e9b61a0d7174202ca16200c98eda1a.zip |
add popstateevent, hashchangeevent, pagetransitionevent
Diffstat (limited to 'components')
-rw-r--r-- | components/script/dom/document.rs | 9 | ||||
-rw-r--r-- | components/script/dom/hashchangeevent.rs | 87 | ||||
-rw-r--r-- | components/script/dom/mod.rs | 3 | ||||
-rw-r--r-- | components/script/dom/pagetransitionevent.rs | 76 | ||||
-rw-r--r-- | components/script/dom/popstateevent.rs | 79 | ||||
-rw-r--r-- | components/script/dom/webidls/HashChangeEvent.webidl | 15 | ||||
-rw-r--r-- | components/script/dom/webidls/PageTransitionEvent.webidl | 13 | ||||
-rw-r--r-- | components/script/dom/webidls/PopStateEvent.webidl | 13 |
8 files changed, 295 insertions, 0 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index ffb7c31de93..c2b2517d92e 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -44,6 +44,7 @@ use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; use dom::focusevent::FocusEvent; use dom::forcetouchevent::ForceTouchEvent; +use dom::hashchangeevent::HashChangeEvent; use dom::htmlanchorelement::HTMLAnchorElement; use dom::htmlappletelement::HTMLAppletElement; use dom::htmlareaelement::HTMLAreaElement; @@ -69,6 +70,8 @@ use dom::mouseevent::MouseEvent; use dom::node::{self, CloneChildrenFlag, Node, NodeDamage, window_from_node}; use dom::nodeiterator::NodeIterator; use dom::nodelist::NodeList; +use dom::pagetransitionevent::PageTransitionEvent; +use dom::popstateevent::PopStateEvent; use dom::processinginstruction::ProcessingInstruction; use dom::progressevent::ProgressEvent; use dom::range::Range; @@ -2195,6 +2198,12 @@ impl DocumentMethods for Document { Ok(Root::upcast(ErrorEvent::new_uninitialized(GlobalRef::Window(&self.window)))), "closeevent" => Ok(Root::upcast(CloseEvent::new_uninitialized(GlobalRef::Window(&self.window)))), + "popstateevent" => + Ok(Root::upcast(PopStateEvent::new_uninitialized(GlobalRef::Window(&self.window)))), + "hashchangeevent" => + Ok(Root::upcast(HashChangeEvent::new_uninitialized(GlobalRef::Window(&self.window)))), + "pagetransitionevent" => + Ok(Root::upcast(PageTransitionEvent::new_uninitialized(GlobalRef::Window(&self.window)))), _ => Err(Error::NotSupported), } diff --git a/components/script/dom/hashchangeevent.rs b/components/script/dom/hashchangeevent.rs new file mode 100644 index 00000000000..95308f17eed --- /dev/null +++ b/components/script/dom/hashchangeevent.rs @@ -0,0 +1,87 @@ +/* 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::EventBinding::EventMethods; +use dom::bindings::codegen::Bindings::HashChangeEventBinding; +use dom::bindings::codegen::Bindings::HashChangeEventBinding::HashChangeEventMethods; +use dom::bindings::error::Fallible; +use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; +use dom::bindings::js::Root; +use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::str::USVString; +use dom::event::Event; +use string_cache::Atom; +use util::str::DOMString; + +// https://html.spec.whatwg.org/multipage/#hashchangeevent +#[dom_struct] +pub struct HashChangeEvent { + event: Event, + old_url: String, + new_url: String, +} + +impl HashChangeEvent { + fn new_inherited(old_url: String, new_url: String) -> HashChangeEvent { + HashChangeEvent { + event: Event::new_inherited(), + old_url: old_url, + new_url: new_url, + } + } + + pub fn new_uninitialized(global: GlobalRef) + -> Root<HashChangeEvent> { + reflect_dom_object(box HashChangeEvent::new_inherited(String::new(), String::new()), + global, + HashChangeEventBinding::Wrap) + } + + pub fn new(global: GlobalRef, + type_: Atom, + bubbles: bool, + cancelable: bool, + old_url: String, + new_url: String) + -> Root<HashChangeEvent> { + let ev = reflect_dom_object(box HashChangeEvent::new_inherited(old_url, new_url), + global, + HashChangeEventBinding::Wrap); + { + let event = ev.upcast::<Event>(); + event.init_event(type_, bubbles, cancelable); + } + ev + } + + pub fn Constructor(global: GlobalRef, + type_: DOMString, + init: &HashChangeEventBinding::HashChangeEventInit) + -> Fallible<Root<HashChangeEvent>> { + Ok(HashChangeEvent::new(global, + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + init.oldURL.0.clone(), + init.newURL.0.clone())) + } +} + +impl HashChangeEventMethods for HashChangeEvent { + // https://html.spec.whatwg.org/multipage/#dom-hashchangeevent-oldurl + fn OldURL(&self) -> USVString { + USVString(self.old_url.clone()) + } + + // https://html.spec.whatwg.org/multipage/#dom-hashchangeevent-newurl + fn NewURL(&self) -> USVString { + USVString(self.new_url.clone()) + } + + // https://dom.spec.whatwg.org/#dom-event-istrusted + fn IsTrusted(&self) -> bool { + self.event.IsTrusted() + } +} diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 4aee5546399..cfa41a1ae19 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -264,6 +264,7 @@ pub mod filereader; pub mod focusevent; pub mod forcetouchevent; pub mod formdata; +pub mod hashchangeevent; pub mod htmlanchorelement; pub mod htmlappletelement; pub mod htmlareaelement; @@ -350,10 +351,12 @@ pub mod navigatorinfo; pub mod node; pub mod nodeiterator; pub mod nodelist; +pub mod pagetransitionevent; pub mod performance; pub mod performancetiming; pub mod plugin; pub mod pluginarray; +pub mod popstateevent; pub mod processinginstruction; pub mod progressevent; pub mod radionodelist; diff --git a/components/script/dom/pagetransitionevent.rs b/components/script/dom/pagetransitionevent.rs new file mode 100644 index 00000000000..2baa8d0693c --- /dev/null +++ b/components/script/dom/pagetransitionevent.rs @@ -0,0 +1,76 @@ +/* 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::EventBinding::EventMethods; +use dom::bindings::codegen::Bindings::PageTransitionEventBinding; +use dom::bindings::codegen::Bindings::PageTransitionEventBinding::PageTransitionEventMethods; +use dom::bindings::error::Fallible; +use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; +use dom::bindings::js::Root; +use dom::bindings::reflector::reflect_dom_object; +use dom::event::Event; +use std::cell::Cell; +use string_cache::Atom; +use util::str::DOMString; + +// https://html.spec.whatwg.org/multipage/#pagetransitionevent +#[dom_struct] +pub struct PageTransitionEvent { + event: Event, + persisted: Cell<bool>, +} + +impl PageTransitionEvent { + fn new_inherited() -> PageTransitionEvent { + PageTransitionEvent { + event: Event::new_inherited(), + persisted: Cell::new(false), + } + } + + pub fn new_uninitialized(global: GlobalRef) -> Root<PageTransitionEvent> { + reflect_dom_object(box PageTransitionEvent::new_inherited(), + global, + PageTransitionEventBinding::Wrap) + } + + pub fn new(global: GlobalRef, + type_: Atom, + bubbles: bool, + cancelable: bool, + persisted: bool) + -> Root<PageTransitionEvent> { + let ev = PageTransitionEvent::new_uninitialized(global); + ev.persisted.set(persisted); + { + let event = ev.upcast::<Event>(); + event.init_event(type_, bubbles, cancelable); + } + ev + } + + pub fn Constructor(global: GlobalRef, + type_: DOMString, + init: &PageTransitionEventBinding::PageTransitionEventInit) + -> Fallible<Root<PageTransitionEvent>> { + Ok(PageTransitionEvent::new(global, + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + init.persisted)) + } +} + +impl PageTransitionEventMethods for PageTransitionEvent { + // https://html.spec.whatwg.org/multipage/#dom-pagetransitionevent-persisted + fn Persisted(&self) -> bool { + self.persisted.get() + } + + // https://dom.spec.whatwg.org/#dom-event-istrusted + fn IsTrusted(&self) -> bool { + self.event.IsTrusted() + } +} diff --git a/components/script/dom/popstateevent.rs b/components/script/dom/popstateevent.rs new file mode 100644 index 00000000000..dd55e06b5a2 --- /dev/null +++ b/components/script/dom/popstateevent.rs @@ -0,0 +1,79 @@ +/* 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::EventBinding::EventMethods; +use dom::bindings::codegen::Bindings::PopStateEventBinding; +use dom::bindings::codegen::Bindings::PopStateEventBinding::PopStateEventMethods; +use dom::bindings::error::Fallible; +use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; +use dom::bindings::js::{MutHeapJSVal, Root}; +use dom::bindings::reflector::reflect_dom_object; +use dom::event::Event; +use js::jsapi::{HandleValue, JSContext}; +use js::jsval::JSVal; +use string_cache::Atom; +use util::str::DOMString; + +// https://html.spec.whatwg.org/multipage/#the-popstateevent-interface +#[dom_struct] +pub struct PopStateEvent { + event: Event, + #[ignore_heap_size_of = "Defined in rust-mozjs"] + state: MutHeapJSVal, +} + +impl PopStateEvent { + fn new_inherited() -> PopStateEvent { + PopStateEvent { + event: Event::new_inherited(), + state: MutHeapJSVal::new(), + } + } + + pub fn new_uninitialized(global: GlobalRef) -> Root<PopStateEvent> { + reflect_dom_object(box PopStateEvent::new_inherited(), + global, + PopStateEventBinding::Wrap) + } + + pub fn new(global: GlobalRef, + type_: Atom, + bubbles: bool, + cancelable: bool, + state: HandleValue) + -> Root<PopStateEvent> { + let ev = PopStateEvent::new_uninitialized(global); + ev.state.set(state.get()); + { + let event = ev.upcast::<Event>(); + event.init_event(type_, bubbles, cancelable); + } + ev + } + + #[allow(unsafe_code)] + pub fn Constructor(global: GlobalRef, + type_: DOMString, + init: &PopStateEventBinding::PopStateEventInit) + -> Fallible<Root<PopStateEvent>> { + Ok(PopStateEvent::new(global, + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + unsafe { HandleValue::from_marked_location(&init.state) })) + } +} + +impl PopStateEventMethods for PopStateEvent { + // https://html.spec.whatwg.org/multipage/#dom-popstateevent-state + fn State(&self, _cx: *mut JSContext) -> JSVal { + self.state.get() + } + + // https://dom.spec.whatwg.org/#dom-event-istrusted + fn IsTrusted(&self) -> bool { + self.event.IsTrusted() + } +} diff --git a/components/script/dom/webidls/HashChangeEvent.webidl b/components/script/dom/webidls/HashChangeEvent.webidl new file mode 100644 index 00000000000..924c300cdfe --- /dev/null +++ b/components/script/dom/webidls/HashChangeEvent.webidl @@ -0,0 +1,15 @@ +/* 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/. */ + +// https://html.spec.whatwg.org/multipage/#hashchangeevent +[Constructor(DOMString type, optional HashChangeEventInit eventInitDict)/*, Exposed=(Window,Worker)*/] +interface HashChangeEvent : Event { + readonly attribute USVString oldURL; + readonly attribute USVString newURL; +}; + +dictionary HashChangeEventInit : EventInit { + USVString oldURL = ""; + USVString newURL = ""; +}; diff --git a/components/script/dom/webidls/PageTransitionEvent.webidl b/components/script/dom/webidls/PageTransitionEvent.webidl new file mode 100644 index 00000000000..f96eda200f4 --- /dev/null +++ b/components/script/dom/webidls/PageTransitionEvent.webidl @@ -0,0 +1,13 @@ +/* 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/. */ + +// https://html.spec.whatwg.org/multipage/#the-pagetransitionevent-interface +[Constructor(DOMString type, optional PageTransitionEventInit eventInitDict)/*, Exposed=(Window,Worker)*/] +interface PageTransitionEvent : Event { + readonly attribute boolean persisted; +}; + +dictionary PageTransitionEventInit : EventInit { + boolean persisted = false; +}; diff --git a/components/script/dom/webidls/PopStateEvent.webidl b/components/script/dom/webidls/PopStateEvent.webidl new file mode 100644 index 00000000000..99372b392a6 --- /dev/null +++ b/components/script/dom/webidls/PopStateEvent.webidl @@ -0,0 +1,13 @@ +/* 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/. */ + +// https://html.spec.whatwg.org/multipage/#the-popstateevent-interface +[Constructor(DOMString type, optional PopStateEventInit eventInitDict)/*, Exposed=(Window,Worker)*/] +interface PopStateEvent : Event { + readonly attribute any state; +}; + +dictionary PopStateEventInit : EventInit { + any state = null; +}; |