Title: [110308] trunk
Revision
110308
Author
[email protected]
Date
2012-03-09 11:16:12 -0800 (Fri, 09 Mar 2012)

Log Message

Source/WebCore: The method TextTrackCue::getCueAsHTML() should return different
fragments on different calls.

https://bugs.webkit.org/show_bug.cgi?id=80701

Patch by Victor Carbune <[email protected]> on 2012-03-09
Reviewed by Eric Carlson.

Test: media/track/track-cue-mutable-fragment.html

* html/track/TextTrackCue.cpp: Removed setCueHTML(), since it is sufficient
to create apply the DOM rules only when the fragment is first requested.
(WebCore::TextTrackCue::getCueAsHTML): Changed the method such that a
a clone of the cached document fragment is returned.
* html/track/TextTrackCue.h: Removed setCueHTML() as the document fragment
of the cue should be created only within the class, from the cue text.
(TextTrackCue):
* html/track/WebVTTParser.cpp:
(WebCore::WebVTTParser::createNewCue): removed usage of setCueHTML()

LayoutTests: Added relevant layout tests to verify that the fragment can be appended
multiple times to the DOM and modified correctly.

https://bugs.webkit.org/show_bug.cgi?id=80701

Patch by Victor Carbune <[email protected]> on 2012-03-09
Reviewed by Eric Carlson.

* media/track/captions-webvtt/captions-html.vtt: Added. This file could
be used later for more complex html / css rendering tests.
* media/track/track-cue-mutable-fragment-expected.txt: Added.
* media/track/track-cue-mutable-fragment.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (110307 => 110308)


--- trunk/LayoutTests/ChangeLog	2012-03-09 19:13:00 UTC (rev 110307)
+++ trunk/LayoutTests/ChangeLog	2012-03-09 19:16:12 UTC (rev 110308)
@@ -1,3 +1,17 @@
+2012-03-09  Victor Carbune  <[email protected]>
+
+        Added relevant layout tests to verify that the fragment can be appended
+        multiple times to the DOM and modified correctly.
+
+        https://bugs.webkit.org/show_bug.cgi?id=80701
+
+        Reviewed by Eric Carlson.
+
+        * media/track/captions-webvtt/captions-html.vtt: Added. This file could
+        be used later for more complex html / css rendering tests.
+        * media/track/track-cue-mutable-fragment-expected.txt: Added.
+        * media/track/track-cue-mutable-fragment.html: Added.
+
 2012-03-09  Tim Horton  <[email protected]>
 
         Crash in SVGTextLayoutAttributesBuilder::fillCharacterDataMap

Added: trunk/LayoutTests/media/track/captions-webvtt/captions-html.vtt (0 => 110308)


--- trunk/LayoutTests/media/track/captions-webvtt/captions-html.vtt	                        (rev 0)
+++ trunk/LayoutTests/media/track/captions-webvtt/captions-html.vtt	2012-03-09 19:16:12 UTC (rev 110308)
@@ -0,0 +1,18 @@
+WEBVTT
+
+1
+00:00:00.000 --> 00:00:01.000
+Lorem <b>ipsum</b> <u>dolor</u> <i.sit>sit</i> amet,
+
+2
+00:00:03.000 --> 00:00:04.000
+consectetuer adipiscing elit,
+
+3
+00:00:05.000 --> 00:00:06.000
+sed diam nonummy nibh euismod tincidunt
+
+4
+00:00:07.000 --> 00:00:08.000
+ut laoreet dolore magna aliquam erat volutpat.
+

Added: trunk/LayoutTests/media/track/track-cue-mutable-fragment-expected.txt (0 => 110308)


--- trunk/LayoutTests/media/track/track-cue-mutable-fragment-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-cue-mutable-fragment-expected.txt	2012-03-09 19:16:12 UTC (rev 110308)
@@ -0,0 +1,32 @@
+Test that cue text is mutable.
+
+Fragment 1
+
+Different text ipsum dolor sit amet,
+Fragment 2
+
+Lorem ipsum dolor sit amet,
+RUN(testCue = testTrack.track.cues[0])
+
+** Test initial cue contents
+EXPECTED (testCue.text == 'Lorem ipsum dolor sit amet,') OK
+
+** Cue getCueAsHTML() should return a correct fragment
+EXPECTED (fragment.isEqualNode(testCue.getCueAsHTML()) == 'true') OK
+
+** Appending getCuesAsHTML() twice to the DOM should be succesful
+RUN(document.getElementsByTagName('div')[0].appendChild(testCue.getCueAsHTML()))
+RUN(document.getElementsByTagName('div')[1].appendChild(testCue.getCueAsHTML()))
+EXPECTED (fragment.isEqualNode(document.getElementsByTagName('div')[0]) == 'true') OK
+EXPECTED (fragment.isEqualNode(document.getElementsByTagName('div')[1]) == 'true') OK
+
+** The fragment returned by getCuesAsHTML() should be independently mutable
+RUN(document.getElementsByTagName('div')[0].firstChild.textContent = 'Different text ')
+EXPECTED (fragment.isEqualNode(document.getElementsByTagName('div')[0]) == 'false') OK
+EXPECTED (fragment.isEqualNode(document.getElementsByTagName('div')[1]) == 'true') OK
+
+** Calling twice getCueAsHTML() should not return the same fragment
+EXPECTED (testCue.getCueAsHTML() == testCue.getCueAsHTML() == 'false') OK
+
+END OF TEST
+

Added: trunk/LayoutTests/media/track/track-cue-mutable-fragment.html (0 => 110308)


--- trunk/LayoutTests/media/track/track-cue-mutable-fragment.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-cue-mutable-fragment.html	2012-03-09 19:16:12 UTC (rev 110308)
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+        <script src=""
+        <script src=""
+        <script src=""
+
+        <script>
+
+        var testTrack;
+        var testCue;
+        var fragment;
+
+        function createExpectedFragment(rootNode)
+        {
+            fragment = rootNode;
+            fragment.appendChild(document.createTextNode("Lorem "));
+
+            var bold = document.createElement("b");
+            bold.appendChild(document.createTextNode("ipsum"));
+            fragment.appendChild(bold);
+
+            fragment.appendChild(document.createTextNode(" "));
+
+            var underline = document.createElement("u");
+            underline.appendChild(document.createTextNode("dolor"));
+            fragment.appendChild(underline);
+
+            fragment.appendChild(document.createTextNode(" "));
+
+            var italics = document.createElement("i");
+            italics.className = "sit";
+            italics.appendChild(document.createTextNode("sit"));
+            fragment.appendChild(italics);
+
+            fragment.appendChild(document.createTextNode(" amet,"));
+        }
+
+        function testMutability()
+        {
+            run("testCue = testTrack.track.cues[0]");
+
+            consoleWrite("<br>** Test initial cue contents");
+            testExpected("testCue.text", "Lorem <b>ipsum</b> <u>dolor</u> <i.sit>sit</i> amet,");
+
+            consoleWrite("<br>** Cue getCueAsHTML() should return a correct fragment");
+            createExpectedFragment(document.createDocumentFragment());
+            testExpected("fragment.isEqualNode(testCue.getCueAsHTML())", true);
+
+            consoleWrite("<br>** Appending getCuesAsHTML() twice to the DOM should be succesful");
+            run("document.getElementsByTagName('div')[0].appendChild(testCue.getCueAsHTML())");
+            run("document.getElementsByTagName('div')[1].appendChild(testCue.getCueAsHTML())");
+
+            createExpectedFragment(document.createElement('div'));
+            testExpected("fragment.isEqualNode(document.getElementsByTagName('div')[0])", true);
+            testExpected("fragment.isEqualNode(document.getElementsByTagName('div')[1])", true);
+
+            consoleWrite("<br>** The fragment returned by getCuesAsHTML() should be independently mutable");
+            run("document.getElementsByTagName('div')[0].firstChild.textContent = 'Different text '");
+            testExpected("fragment.isEqualNode(document.getElementsByTagName('div')[0])", false);
+            testExpected("fragment.isEqualNode(document.getElementsByTagName('div')[1])", true);
+
+            consoleWrite("<br>** Calling twice getCueAsHTML() should not return the same fragment");
+            testExpected("testCue.getCueAsHTML() == testCue.getCueAsHTML()", false);
+
+            consoleWrite("");
+            endTest();
+        }
+
+        function loaded()
+        {
+            findMediaElement();
+            testTrack = document.querySelector('track');
+
+            waitForEventsAndCall([[video, 'canplaythrough'], [testTrack, 'load']], testMutability);
+
+            video.src = "" '../content/counting');
+        }
+
+        </script>
+    </head>
+    <body _onload_="loaded()">
+        <video controls >
+            <track src="" kind="captions" default >
+        </video>
+        <p>Test that cue text is mutable.</p>
+
+        <p>Fragment 1</p>
+        <div></div>
+
+        <p>Fragment 2</p>
+        <div></div>
+    </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (110307 => 110308)


--- trunk/Source/WebCore/ChangeLog	2012-03-09 19:13:00 UTC (rev 110307)
+++ trunk/Source/WebCore/ChangeLog	2012-03-09 19:16:12 UTC (rev 110308)
@@ -1,3 +1,24 @@
+2012-03-09  Victor Carbune  <[email protected]>
+
+        The method TextTrackCue::getCueAsHTML() should return different
+        fragments on different calls.
+
+        https://bugs.webkit.org/show_bug.cgi?id=80701
+
+        Reviewed by Eric Carlson.
+
+        Test: media/track/track-cue-mutable-fragment.html
+
+        * html/track/TextTrackCue.cpp: Removed setCueHTML(), since it is sufficient
+        to create apply the DOM rules only when the fragment is first requested.
+        (WebCore::TextTrackCue::getCueAsHTML): Changed the method such that a
+        a clone of the cached document fragment is returned.
+        * html/track/TextTrackCue.h: Removed setCueHTML() as the document fragment
+        of the cue should be created only within the class, from the cue text.
+        (TextTrackCue):
+        * html/track/WebVTTParser.cpp:
+        (WebCore::WebVTTParser::createNewCue): removed usage of setCueHTML()
+
 2012-03-09  Tim Horton  <[email protected]>
 
         Crash in SVGTextLayoutAttributesBuilder::fillCharacterDataMap

Modified: trunk/Source/WebCore/html/track/TextTrackCue.cpp (110307 => 110308)


--- trunk/Source/WebCore/html/track/TextTrackCue.cpp	2012-03-09 19:13:00 UTC (rev 110307)
+++ trunk/Source/WebCore/html/track/TextTrackCue.cpp	2012-03-09 19:16:12 UTC (rev 110308)
@@ -358,15 +358,18 @@
 
 PassRefPtr<DocumentFragment> TextTrackCue::getCueAsHTML()
 {
+    RefPtr<DocumentFragment> clonedFragment;
+    Document* document;
+
     if (!m_documentFragment)
         m_documentFragment = WebVTTParser::create(0, m_scriptExecutionContext)->createDocumentFragmentFromCueText(m_content);
 
-    return m_documentFragment;
-}
+    document = static_cast<Document*>(m_scriptExecutionContext);
 
-void TextTrackCue::setCueHTML(PassRefPtr<DocumentFragment> fragment)
-{
-    m_documentFragment = fragment;
+    clonedFragment = DocumentFragment::create(document);
+    m_documentFragment->cloneChildNodes(clonedFragment.get());
+
+    return clonedFragment.release();
 }
 
 bool TextTrackCue::dispatchEvent(PassRefPtr<Event> event)

Modified: trunk/Source/WebCore/html/track/TextTrackCue.h (110307 => 110308)


--- trunk/Source/WebCore/html/track/TextTrackCue.h	2012-03-09 19:13:00 UTC (rev 110307)
+++ trunk/Source/WebCore/html/track/TextTrackCue.h	2012-03-09 19:16:12 UTC (rev 110308)
@@ -93,7 +93,6 @@
     void invalidateCueIndex();
 
     PassRefPtr<DocumentFragment> getCueAsHTML();
-    void setCueHTML(PassRefPtr<DocumentFragment>);
 
     virtual bool dispatchEvent(PassRefPtr<Event>);
     bool dispatchEvent(PassRefPtr<Event>, ExceptionCode&);

Modified: trunk/Source/WebCore/html/track/WebVTTParser.cpp (110307 => 110308)


--- trunk/Source/WebCore/html/track/WebVTTParser.cpp	2012-03-09 19:13:00 UTC (rev 110307)
+++ trunk/Source/WebCore/html/track/WebVTTParser.cpp	2012-03-09 19:16:12 UTC (rev 110308)
@@ -273,10 +273,8 @@
     if (!m_currentContent.length())
         return;
 
-    RefPtr<DocumentFragment> attachmentRoot = createDocumentFragmentFromCueText(m_currentContent.toString());
-    
     RefPtr<TextTrackCue> cue = TextTrackCue::create(m_scriptExecutionContext, m_currentId, m_currentStartTime, m_currentEndTime, m_currentContent.toString(), m_currentSettings, false);
-    cue->setCueHTML(attachmentRoot);
+
     m_cuelist.append(cue);
     if (m_client)
         m_client->newCuesParsed();
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to