diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-08-14 20:56:32 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-08-14 20:56:32 +0200 |
commit | 7cd57870b46ab40a02fb2a6ba01b356db3982456 (patch) | |
tree | 0ea97187ac8c3e193de824e00aac34eda1fb2963 /src | |
parent | d2ffbec5eda14ca93efe5eaeda8ed43692b53c85 (diff) | |
parent | 3b916d4e303c0cadaf0342b66dade8eb33a3a508 (diff) | |
download | servo-7cd57870b46ab40a02fb2a6ba01b356db3982456.tar.gz servo-7cd57870b46ab40a02fb2a6ba01b356db3982456.zip |
Merge pull request #3088 from brunoabinader/document-links-cache
Implement Document.links cache; r=Ms2ger
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/document.rs | 37 | ||||
-rw-r--r-- | src/test/content/test_document_links_cache.html | 37 |
2 files changed, 52 insertions, 22 deletions
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index eb9eb3d3929..69d8abaf75f 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -78,6 +78,7 @@ pub struct Document { pub is_html_document: bool, url: Untraceable<Url>, quirks_mode: Untraceable<Cell<QuirksMode>>, + links: Cell<Option<JS<HTMLCollection>>>, } impl DocumentDerived for EventTarget { @@ -86,6 +87,13 @@ impl DocumentDerived for EventTarget { } } +struct LinksFilter; +impl CollectionFilter for LinksFilter { + fn filter(&self, elem: &JSRef<Element>, _root: &JSRef<Node>) -> bool { + (elem.is_htmlanchorelement() || elem.is_htmlareaelement()) && elem.has_attribute("href") + } +} + pub trait DocumentHelpers { fn url<'a>(&'a self) -> &'a Url; fn quirks_mode(&self) -> QuirksMode; @@ -228,6 +236,7 @@ impl Document { // http://dom.spec.whatwg.org/#concept-document-encoding encoding_name: Traceable::new(RefCell::new("utf-8".to_string())), is_html_document: is_html_document == HTMLDocument, + links: Cell::new(None), } } @@ -657,8 +666,6 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { fn Images(&self) -> Temporary<HTMLCollection> { let window = self.window.root(); - - // FIXME: https://github.com/mozilla/servo/issues/1847 struct ImagesFilter; impl CollectionFilter for ImagesFilter { fn filter(&self, elem: &JSRef<Element>, _root: &JSRef<Node>) -> bool { @@ -671,8 +678,6 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { fn Embeds(&self) -> Temporary<HTMLCollection> { let window = self.window.root(); - - // FIXME: https://github.com/mozilla/servo/issues/1847 struct EmbedsFilter; impl CollectionFilter for EmbedsFilter { fn filter(&self, elem: &JSRef<Element>, _root: &JSRef<Node>) -> bool { @@ -684,29 +689,21 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { } fn Plugins(&self) -> Temporary<HTMLCollection> { - // FIXME: https://github.com/mozilla/servo/issues/1847 self.Embeds() } fn Links(&self) -> Temporary<HTMLCollection> { - let window = self.window.root(); - - // FIXME: https://github.com/mozilla/servo/issues/1847 - struct LinksFilter; - impl CollectionFilter for LinksFilter { - fn filter(&self, elem: &JSRef<Element>, _root: &JSRef<Node>) -> bool { - (elem.is_htmlanchorelement() || elem.is_htmlareaelement()) && - elem.get_attribute(Null, "href").is_some() - } + if self.links.get().is_none() { + let window = self.window.root(); + let root = NodeCast::from_ref(self); + let filter = box LinksFilter; + self.links.assign(Some(HTMLCollection::create(&*window, root, filter))); } - let filter = box LinksFilter; - HTMLCollection::create(&*window, NodeCast::from_ref(self), filter) + Temporary::new(self.links.get().get_ref().clone()) } fn Forms(&self) -> Temporary<HTMLCollection> { let window = self.window.root(); - - // FIXME: https://github.com/mozilla/servo/issues/1847 struct FormsFilter; impl CollectionFilter for FormsFilter { fn filter(&self, elem: &JSRef<Element>, _root: &JSRef<Node>) -> bool { @@ -719,8 +716,6 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { fn Scripts(&self) -> Temporary<HTMLCollection> { let window = self.window.root(); - - // FIXME: https://github.com/mozilla/servo/issues/1847 struct ScriptsFilter; impl CollectionFilter for ScriptsFilter { fn filter(&self, elem: &JSRef<Element>, _root: &JSRef<Node>) -> bool { @@ -733,8 +728,6 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { fn Anchors(&self) -> Temporary<HTMLCollection> { let window = self.window.root(); - - // FIXME: https://github.com/mozilla/servo/issues/1847 struct AnchorsFilter; impl CollectionFilter for AnchorsFilter { fn filter(&self, elem: &JSRef<Element>, _root: &JSRef<Node>) -> bool { diff --git a/src/test/content/test_document_links_cache.html b/src/test/content/test_document_links_cache.html new file mode 100644 index 00000000000..ec6525510dc --- /dev/null +++ b/src/test/content/test_document_links_cache.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <head> + <script src="harness.js"></script> + <script> + var links = document.links; + is(links, document.links); + is(links.length, 0); + + var anchor = document.createElement("a"); + anchor.id = "anchor-with-href"; + anchor.setAttribute("href", "http://www.google.com"); + document.body.appendChild(anchor); + is(links.length, 1); + + anchor = document.createElement("a"); + anchor.id = "anchor-without-href"; + document.body.appendChild(anchor); + is(links.length, 1); + + anchor.setAttribute("href", "http://www.google.com"); + is(links.length, 2); + + anchor.removeAttribute("href", "http://www.google.com"); + is(links.length, 1); + + document.body.removeChild(document.getElementById("anchor-without-href")); + is(links.length, 1); + + document.body.removeChild(document.getElementById("anchor-with-href")); + is(links, document.links); + is(links.length, 0); + + finish(); + </script> + </head> +</html> |