aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-08-14 20:56:32 +0200
committerMs2ger <ms2ger@gmail.com>2014-08-14 20:56:32 +0200
commit7cd57870b46ab40a02fb2a6ba01b356db3982456 (patch)
tree0ea97187ac8c3e193de824e00aac34eda1fb2963 /src
parentd2ffbec5eda14ca93efe5eaeda8ed43692b53c85 (diff)
parent3b916d4e303c0cadaf0342b66dade8eb33a3a508 (diff)
downloadservo-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.rs37
-rw-r--r--src/test/content/test_document_links_cache.html37
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>