aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/net/storage_task.rs15
-rw-r--r--components/net_traits/storage_task.rs3
-rw-r--r--components/script/dom/storage.rs6
-rw-r--r--tests/wpt/metadata/MANIFEST.json6
-rw-r--r--tests/wpt/web-platform-tests/dom/collections/storage-supported-property-names.html23
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>