Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(667)

Side by Side Diff: Source/core/html/track/vtt/VTTParser.cpp

Issue 75273002: Handle recovery on "timestamp-looking" lines in the WebVTT parser (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/html/track/vtt/VTTParser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 collectMetadataHeader(line); 172 collectMetadataHeader(line);
173 173
174 if (line.isEmpty()) { 174 if (line.isEmpty()) {
175 if (m_client && m_regionList.size()) 175 if (m_client && m_regionList.size())
176 m_client->newRegionsParsed(); 176 m_client->newRegionsParsed();
177 177
178 m_state = Id; 178 m_state = Id;
179 break; 179 break;
180 } 180 }
181 181
182 // Step 15 - Break out of header loop if the line could be a timesta mp line.
183 if (line.contains("-->"))
184 m_state = recoverCue(line);
185
182 // Step 16 - Line is not the empty string and does not contain "-->" . 186 // Step 16 - Line is not the empty string and does not contain "-->" .
183 break; 187 break;
184 188
185 case Id: 189 case Id:
186 // Steps 17 - 20 - Allow any number of line terminators, then initia lize new cue values. 190 // Steps 17 - 20 - Allow any number of line terminators, then initia lize new cue values.
187 if (line.isEmpty()) 191 if (line.isEmpty())
188 break; 192 break;
189 193
190 // Step 21 - Cue creation (start a new cue). 194 // Step 21 - Cue creation (start a new cue).
191 resetCueValues(); 195 resetCueValues();
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 return BadCue; 304 return BadCue;
301 skipWhiteSpace(line, &position); 305 skipWhiteSpace(line, &position);
302 306
303 // Step 12 - Parse the WebVTT settings for the cue (conducted in TextTrackCu e). 307 // Step 12 - Parse the WebVTT settings for the cue (conducted in TextTrackCu e).
304 m_currentSettings = line.substring(position, line.length()-1); 308 m_currentSettings = line.substring(position, line.length()-1);
305 return CueText; 309 return CueText;
306 } 310 }
307 311
308 WebVTTParser::ParseState WebVTTParser::collectCueText(const String& line) 312 WebVTTParser::ParseState WebVTTParser::collectCueText(const String& line)
309 { 313 {
314 // Step 34.
310 if (line.isEmpty()) { 315 if (line.isEmpty()) {
311 createNewCue(); 316 createNewCue();
312 return Id; 317 return Id;
313 } 318 }
319 // Step 35.
320 if (line.contains("-->")) {
321 // Step 39-40.
322 createNewCue();
323
324 // Step 41 - New iteration of the cue loop.
325 return recoverCue(line);
326 }
314 if (!m_currentContent.isEmpty()) 327 if (!m_currentContent.isEmpty())
315 m_currentContent.append("\n"); 328 m_currentContent.append("\n");
316 m_currentContent.append(line); 329 m_currentContent.append(line);
317 330
318 return CueText; 331 return CueText;
319 } 332 }
320 333
334 WebVTTParser::ParseState WebVTTParser::recoverCue(const String& line)
335 {
336 // Step 17 and 21.
337 resetCueValues();
338
339 // Step 22.
340 return collectTimingsAndSettings(line);
341 }
342
321 WebVTTParser::ParseState WebVTTParser::ignoreBadCue(const String& line) 343 WebVTTParser::ParseState WebVTTParser::ignoreBadCue(const String& line)
322 { 344 {
323 if (!line.isEmpty()) 345 if (line.isEmpty())
324 return BadCue; 346 return Id;
325 return Id; 347 if (line.contains("-->"))
348 return recoverCue(line);
349 return BadCue;
326 } 350 }
327 351
328 // A helper class for the construction of a "cue fragment" from the cue text. 352 // A helper class for the construction of a "cue fragment" from the cue text.
329 class WebVTTTreeBuilder { 353 class WebVTTTreeBuilder {
330 public: 354 public:
331 WebVTTTreeBuilder(Document& document) 355 WebVTTTreeBuilder(Document& document)
332 : m_document(document) { } 356 : m_document(document) { }
333 357
334 PassRefPtr<DocumentFragment> buildFromString(const String& cueText); 358 PassRefPtr<DocumentFragment> buildFromString(const String& cueText);
335 359
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 } 589 }
566 590
567 void WebVTTParser::skipWhiteSpace(const String& line, unsigned* position) 591 void WebVTTParser::skipWhiteSpace(const String& line, unsigned* position)
568 { 592 {
569 while (*position < line.length() && isASpace(line[*position])) 593 while (*position < line.length() && isASpace(line[*position]))
570 (*position)++; 594 (*position)++;
571 } 595 }
572 596
573 } 597 }
574 598
OLDNEW
« no previous file with comments | « Source/core/html/track/vtt/VTTParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698