Prevent HTMLPreloadScanner from fetching resources inside <template>
authorrafaelw@chromium.org <rafaelw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Jan 2013 22:45:35 +0000 (22:45 +0000)
committerrafaelw@chromium.org <rafaelw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Jan 2013 22:45:35 +0000 (22:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=106687

Reviewed by Adam Barth.

Source/WebCore:

This patch adds a simple counter to the preload scanner which increments on template start
tag and decrements on template element. It only fetchs resources when the counter is at zero
(i.e. for elements not contained by a template element).

Test re-enabled within fast/dom/HTMLTemplateElement/inertContents.html

* html/parser/HTMLPreloadScanner.cpp:
(WebCore::HTMLPreloadScanner::HTMLPreloadScanner):
(WebCore::HTMLPreloadScanner::processToken):
* html/parser/HTMLPreloadScanner.h:
(HTMLPreloadScanner):

LayoutTests:

* fast/dom/HTMLTemplateElement/inertContents-expected.txt:
* fast/dom/HTMLTemplateElement/inertContents.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@139502 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/dom/HTMLTemplateElement/inertContents-expected.txt
LayoutTests/fast/dom/HTMLTemplateElement/inertContents.html
Source/WebCore/ChangeLog
Source/WebCore/html/parser/HTMLPreloadScanner.cpp
Source/WebCore/html/parser/HTMLPreloadScanner.h

index 5c11cb1..9ea446f 100644 (file)
@@ -1,3 +1,13 @@
+2013-01-11  Rafael Weinstein  <rafaelw@chromium.org>
+
+        Prevent HTMLPreloadScanner from fetching resources inside <template>
+        https://bugs.webkit.org/show_bug.cgi?id=106687
+
+        Reviewed by Adam Barth.
+
+        * fast/dom/HTMLTemplateElement/inertContents-expected.txt:
+        * fast/dom/HTMLTemplateElement/inertContents.html:
+
 2013-01-11  Stephen Chenney  <schenney@chromium.org>
 
         [Chromium] More test expectations for Skia changes
index 8d954b0..8813c53 100644 (file)
@@ -1,11 +1,7 @@
-The test asserts that elements within template contents are "inert", e.g. script does not run.
+http://foo.com/shouldLoad.jpg - willSendRequest <NSURLRequest URL http://foo.com/shouldLoad.jpg, main document URL inertContents.html, http method GET> redirectResponse (null)
+Blocked access to external URL http://foo.com/shouldLoad.jpg
+http://foo.com/shouldLoad.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -999, failing URL "(null)">
+The test asserts that elements within template contents are "inert", e.g. resources do not fetch, script does not run.
 
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS testVal is "script has not run"
-PASS testVal is "script has run"
-PASS successfullyParsed is true
-
-TEST COMPLETE
+Before template content insertion: script did not run, after template content insertion: script did run.
 
index 45bd954..88cabf5 100644 (file)
@@ -1,17 +1,29 @@
-<!DOCTYPE html>
 <body>
-<script src="../../js/resources/js-test-pre.js"></script>
+<p>The test asserts that elements within template contents are "inert", e.g. resources do not fetch, script does not run.</p>
+<template id="template"><script>window.testVal = "script did run";</script><img src="http://foo.com/shouldNotLoad.jpg"></template>
+<div id="output">
+</div>
+
 <script>
-var testVal = 'script has not run';
+var testVal = "script did not run";
+
+window.onload = function() {
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.dumpResourceLoadCallbacks();
+    }
+
+    var output = document.getElementById('output');
+    output.innerHTML = 'Before template content insertion: ' + testVal;
+    
+    var templateContent = document.getElementById('template').content;
+    var img = templateContent.childNodes[1];
+    img.src = "http://foo.com/shouldLoad.jpg";
+    document.body.appendChild(templateContent);
+
+    output.innerHTML += ', after template content insertion: ' + testVal + '.';
+}
 </script>
-<!-- FIXME: Add non-flaky test for <img> tags -->
-<template><script>window.testVal = 'script has run';</script></template>
-<script>
-description('The test asserts that elements within template contents are "inert", e.g. script does not run.');
-shouldBeEqualToString('testVal', 'script has not run');
-var templateContent = document.querySelector('template').content;
-document.body.appendChild(templateContent);
-shouldBeEqualToString('testVal', 'script has run');
-</script>
-<script src="../../js/resources/js-test-post.js"></script>
+</head>
+<body>
 </body>
index 1073bbe..0857d28 100644 (file)
@@ -1,3 +1,22 @@
+2013-01-11  Rafael Weinstein  <rafaelw@chromium.org>
+
+        Prevent HTMLPreloadScanner from fetching resources inside <template>
+        https://bugs.webkit.org/show_bug.cgi?id=106687
+
+        Reviewed by Adam Barth.
+
+        This patch adds a simple counter to the preload scanner which increments on template start
+        tag and decrements on template element. It only fetchs resources when the counter is at zero
+        (i.e. for elements not contained by a template element).
+
+        Test re-enabled within fast/dom/HTMLTemplateElement/inertContents.html
+
+        * html/parser/HTMLPreloadScanner.cpp:
+        (WebCore::HTMLPreloadScanner::HTMLPreloadScanner):
+        (WebCore::HTMLPreloadScanner::processToken):
+        * html/parser/HTMLPreloadScanner.h:
+        (HTMLPreloadScanner):
+
 2013-01-11  Tony Gentilcore  <tonyg@chromium.org>
 
         We should be able to checkpoint and restore the HTMLTokenizer across threads
index 94feb56..2356b8e 100644 (file)
@@ -167,6 +167,9 @@ HTMLPreloadScanner::HTMLPreloadScanner(Document* document, const HTMLParserOptio
     , m_cssScanner(document)
     , m_tokenizer(HTMLTokenizer::create(options))
     , m_inStyle(false)
+#if ENABLE(TEMPLATE_ELEMENT)
+    , m_templateCount(0)
+#endif
 {
 }
 
@@ -199,19 +202,37 @@ void HTMLPreloadScanner::processToken()
         }
     }
 
-    if (m_token.type() != HTMLTokenTypes::StartTag)
+    if (m_token.type() != HTMLTokenTypes::StartTag) {
+#if ENABLE(TEMPLATE_ELEMENT)
+        if (m_templateCount && m_token.type() == HTMLTokenTypes::EndTag && AtomicString(m_token.name().data()) == templateTag)
+            m_templateCount--;
+#endif
         return;
+    }
 
     PreloadTask task(m_token);
     m_tokenizer->updateStateFor(task.tagName());
 
+#if ENABLE(TEMPLATE_ELEMENT)
+    if (task.tagName() == templateTag)
+        m_templateCount++;
+#endif
+
     if (task.tagName() == styleTag)
         m_inStyle = true;
 
     if (task.tagName() == baseTag)
         updatePredictedBaseElementURL(KURL(m_document->url(), task.baseElementHref()));
 
-    task.preload(m_document, m_predictedBaseElementURL.isEmpty() ? m_document->baseURL() : m_predictedBaseElementURL);
+    bool preload = true;
+
+#if ENABLE(TEMPLATE_ELEMENT)
+    if (m_templateCount)
+        preload = false;
+#endif
+
+    if (preload)
+        task.preload(m_document, m_predictedBaseElementURL.isEmpty() ? m_document->baseURL() : m_predictedBaseElementURL);
 }
 
 void HTMLPreloadScanner::updatePredictedBaseElementURL(const KURL& baseElementURL)
index 81af124..cb8f339 100644 (file)
@@ -58,6 +58,10 @@ private:
     HTMLToken m_token;
     bool m_inStyle;
     KURL m_predictedBaseElementURL;
+
+#if ENABLE(TEMPLATE_ELEMENT)
+    size_t m_templateCount;
+#endif
 };
 
 }