- 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();