diff options
-rw-r--r-- | components/net/storage_task.rs | 15 | ||||
-rw-r--r-- | components/net_traits/storage_task.rs | 3 | ||||
-rw-r--r-- | components/script/dom/storage.rs | 6 | ||||
-rw-r--r-- | tests/wpt/metadata/MANIFEST.json | 6 | ||||
-rw-r--r-- | tests/wpt/web-platform-tests/dom/collections/storage-supported-property-names.html | 23 |
5 files changed, 50 insertions, 3 deletions
diff --git a/components/net/storage_task.rs b/components/net/storage_task.rs index c56efa28398..25be0ff07bc 100644 --- a/components/net/storage_task.rs +++ b/components/net/storage_task.rs @@ -53,6 +53,9 @@ impl StorageManager { StorageTaskMsg::Key(sender, url, storage_type, index) => { self.key(sender, url, storage_type, index) } + StorageTaskMsg::Keys(sender, url, storage_type) => { + self.keys(sender, url, storage_type) + } StorageTaskMsg::SetItem(sender, url, storage_type, name, value) => { self.set_item(sender, url, storage_type, name, value) } @@ -106,6 +109,18 @@ impl StorageManager { .map(|key| key.clone())).unwrap(); } + fn keys(&self, + sender: IpcSender<Vec<DOMString>>, + url: Url, + storage_type: StorageType) { + let origin = self.origin_as_string(url); + let data = self.select_data(storage_type); + let keys = data.get(&origin) + .map_or(vec![], |entry| entry.keys().cloned().collect()); + + sender.send(keys).unwrap(); + } + /// Sends Some(old_value) in case there was a previous value with the same key name but with different /// value name, otherwise sends None fn set_item(&mut self, diff --git a/components/net_traits/storage_task.rs b/components/net_traits/storage_task.rs index 129be8e79d2..99bbe8a1d5d 100644 --- a/components/net_traits/storage_task.rs +++ b/components/net_traits/storage_task.rs @@ -21,6 +21,9 @@ pub enum StorageTaskMsg { /// gets the name of the key at the specified index in the associated storage data Key(IpcSender<Option<DOMString>>, Url, StorageType, u32), + /// Gets the available keys in the associated storage data + Keys(IpcSender<Vec<DOMString>>, Url, StorageType), + /// gets the value associated with the given key in the associated storage data GetItem(IpcSender<Option<DOMString>>, Url, StorageType, DOMString), diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs index 5c64bf7fe8b..4c7ac10d773 100644 --- a/components/script/dom/storage.rs +++ b/components/script/dom/storage.rs @@ -116,8 +116,10 @@ impl StorageMethods for Storage { // https://html.spec.whatwg.org/multipage/#the-storage-interface:supported-property-names fn SupportedPropertyNames(&self) -> Vec<DOMString> { - // FIXME: unimplemented (https://github.com/servo/servo/issues/7273) - vec![] + let (sender, receiver) = ipc::channel().unwrap(); + + self.get_storage_task().send(StorageTaskMsg::Keys(sender, self.get_url(), self.storage_type)).unwrap(); + receiver.recv().unwrap() } // check-tidy: no specs after this line diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 0a2fb3c92df..a0a38aad38b 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -13140,6 +13140,10 @@ "url": "/dom/collections/HTMLCollection-supported-property-names.html" }, { + "path": "dom/collections/storage-supported-property-names.html", + "url": "/dom/collections/storage-supported-property-names.html" + }, + { "path": "dom/events/Event-constants.html", "url": "/dom/events/Event-constants.html" }, @@ -34616,4 +34620,4 @@ "rev": "0159b3ec9ba5355a3340621226e02ae026effd7f", "url_base": "/", "version": 2 -}
\ No newline at end of file +} diff --git a/tests/wpt/web-platform-tests/dom/collections/storage-supported-property-names.html b/tests/wpt/web-platform-tests/dom/collections/storage-supported-property-names.html new file mode 100644 index 00000000000..d2911d867fe --- /dev/null +++ b/tests/wpt/web-platform-tests/dom/collections/storage-supported-property-names.html @@ -0,0 +1,23 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>Storage Test: Supported property names</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + ["localStorage", "sessionStorage"].forEach(function(name) { + test(function() { + var storage = window[name]; + storage.clear(); + + storage["name"] = "user1"; + assert_array_equals(Object.getOwnPropertyNames(storage), ['name']); + }, "Object.getOwnPropertyNames on " + name + " Storage"); + + test(function() { + var storage = window[name]; + storage.clear(); + assert_array_equals(Object.getOwnPropertyNames(storage), []); + }, "Object.getOwnPropertyNames on " + name + " storage with empty collection"); + }); +</script> |