Auto merge of #21922 - Eijebong:storage, r=SimonSapin

Add support for StorageEvent.initstorageevent()

Fixes #21874

<!-- 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/21922)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-10-12 14:16:07 -04:00 committed by GitHub
commit fa94fc7146
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 29 deletions

View file

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::cell::DomRefCell;
use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use dom::bindings::codegen::Bindings::StorageEventBinding; use dom::bindings::codegen::Bindings::StorageEventBinding;
use dom::bindings::codegen::Bindings::StorageEventBinding::StorageEventMethods; use dom::bindings::codegen::Bindings::StorageEventBinding::StorageEventMethods;
@ -9,7 +10,7 @@ use dom::bindings::error::Fallible;
use dom::bindings::inheritance::Castable; use dom::bindings::inheritance::Castable;
use dom::bindings::reflector::reflect_dom_object; use dom::bindings::reflector::reflect_dom_object;
use dom::bindings::root::{DomRoot, MutNullableDom, RootedReference}; use dom::bindings::root::{DomRoot, MutNullableDom, RootedReference};
use dom::bindings::str::DOMString; use dom::bindings::str::{DOMString, USVString};
use dom::event::{Event, EventBubbles, EventCancelable}; use dom::event::{Event, EventBubbles, EventCancelable};
use dom::storage::Storage; use dom::storage::Storage;
use dom::window::Window; use dom::window::Window;
@ -19,10 +20,10 @@ use servo_atoms::Atom;
#[dom_struct] #[dom_struct]
pub struct StorageEvent { pub struct StorageEvent {
event: Event, event: Event,
key: Option<DOMString>, key: DomRefCell<Option<DOMString>>,
old_value: Option<DOMString>, old_value: DomRefCell<Option<DOMString>>,
new_value: Option<DOMString>, new_value: DomRefCell<Option<DOMString>>,
url: DOMString, url: DomRefCell<DOMString>,
storage_area: MutNullableDom<Storage>, storage_area: MutNullableDom<Storage>,
} }
@ -36,10 +37,10 @@ impl StorageEvent {
) -> StorageEvent { ) -> StorageEvent {
StorageEvent { StorageEvent {
event: Event::new_inherited(), event: Event::new_inherited(),
key: key, key: DomRefCell::new(key),
old_value: old_value, old_value: DomRefCell::new(old_value),
new_value: new_value, new_value: DomRefCell::new(new_value),
url: url, url: DomRefCell::new(url),
storage_area: MutNullableDom::new(storage_area), storage_area: MutNullableDom::new(storage_area),
} }
} }
@ -111,22 +112,22 @@ impl StorageEvent {
impl StorageEventMethods for StorageEvent { impl StorageEventMethods for StorageEvent {
// https://html.spec.whatwg.org/multipage/#dom-storageevent-key // https://html.spec.whatwg.org/multipage/#dom-storageevent-key
fn GetKey(&self) -> Option<DOMString> { fn GetKey(&self) -> Option<DOMString> {
self.key.clone() self.key.borrow().clone()
} }
// https://html.spec.whatwg.org/multipage/#dom-storageevent-oldvalue // https://html.spec.whatwg.org/multipage/#dom-storageevent-oldvalue
fn GetOldValue(&self) -> Option<DOMString> { fn GetOldValue(&self) -> Option<DOMString> {
self.old_value.clone() self.old_value.borrow().clone()
} }
// https://html.spec.whatwg.org/multipage/#dom-storageevent-newvalue // https://html.spec.whatwg.org/multipage/#dom-storageevent-newvalue
fn GetNewValue(&self) -> Option<DOMString> { fn GetNewValue(&self) -> Option<DOMString> {
self.new_value.clone() self.new_value.borrow().clone()
} }
// https://html.spec.whatwg.org/multipage/#dom-storageevent-url // https://html.spec.whatwg.org/multipage/#dom-storageevent-url
fn Url(&self) -> DOMString { fn Url(&self) -> DOMString {
self.url.clone() self.url.borrow().clone()
} }
// https://html.spec.whatwg.org/multipage/#dom-storageevent-storagearea // https://html.spec.whatwg.org/multipage/#dom-storageevent-storagearea
@ -138,4 +139,17 @@ impl StorageEventMethods for StorageEvent {
fn IsTrusted(&self) -> bool { fn IsTrusted(&self) -> bool {
self.event.IsTrusted() self.event.IsTrusted()
} }
// https://html.spec.whatwg.org/multipage/#dom-storageevent-initstorageevent
fn InitStorageEvent(&self, type_: DOMString, bubbles: bool, cancelable: bool, key:
Option<DOMString>, oldValue: Option<DOMString>, newValue:
Option<DOMString>, url: USVString, storageArea: Option<&Storage>)
{
self.event.init_event(Atom::from(type_), bool::from(bubbles), bool::from(cancelable));
*self.key.borrow_mut() = key;
*self.old_value.borrow_mut() = oldValue;
*self.new_value.borrow_mut() = newValue;
*self.url.borrow_mut() = DOMString::from_string(url.0);
self.storage_area.set(storageArea);
}
} }

View file

@ -16,6 +16,12 @@ interface StorageEvent : Event {
readonly attribute DOMString? newValue; readonly attribute DOMString? newValue;
readonly attribute DOMString url; readonly attribute DOMString url;
readonly attribute Storage? storageArea; readonly attribute Storage? storageArea;
void initStorageEvent(DOMString type, optional boolean bubbles = false,
optional boolean cancelable = false, optional DOMString? key = null, optional
DOMString? oldValue = null, optional DOMString? newValue = null, optional
USVString url = "", optional Storage? storageArea = null);
}; };
dictionary StorageEventInit : EventInit { dictionary StorageEventInit : EventInit {

View file

@ -1,16 +0,0 @@
[event_initstorageevent.html]
[initStorageEvent with 8 undefined arguments]
expected: FAIL
[initStorageEvent with 8 sensible arguments]
expected: FAIL
[initStorageEvent with 8 null arguments]
expected: FAIL
[initStorageEvent with 1 argument]
expected: FAIL
[initStorageEvent with 0 arguments]
expected: FAIL