| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 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 26 matching lines...) Expand all Loading... |
| 37 #include "core/dom/ElementTraversal.h" | 37 #include "core/dom/ElementTraversal.h" |
| 38 #include "core/html/HTMLDivElement.h" | 38 #include "core/html/HTMLDivElement.h" |
| 39 #include "core/html/track/vtt/VTTParser.h" | 39 #include "core/html/track/vtt/VTTParser.h" |
| 40 #include "core/html/track/vtt/VTTScanner.h" | 40 #include "core/html/track/vtt/VTTScanner.h" |
| 41 #include "core/layout/LayoutInline.h" | 41 #include "core/layout/LayoutInline.h" |
| 42 #include "core/layout/LayoutObject.h" | 42 #include "core/layout/LayoutObject.h" |
| 43 #include "platform/Logging.h" | 43 #include "platform/Logging.h" |
| 44 #include "wtf/MathExtras.h" | 44 #include "wtf/MathExtras.h" |
| 45 #include "wtf/text/StringBuilder.h" | 45 #include "wtf/text/StringBuilder.h" |
| 46 | 46 |
| 47 #define VTT_LOG_LEVEL 3 |
| 48 |
| 47 namespace blink { | 49 namespace blink { |
| 48 | 50 |
| 49 // The following values default values are defined within the WebVTT Regions Spe
c. | 51 // The following values default values are defined within the WebVTT Regions Spe
c. |
| 50 // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/region.html | 52 // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/region.html |
| 51 | 53 |
| 52 // The region occupies by default 100% of the width of the video viewport. | 54 // The region occupies by default 100% of the width of the video viewport. |
| 53 static const float defaultWidth = 100; | 55 static const float defaultWidth = 100; |
| 54 | 56 |
| 55 // The region has, by default, 3 lines of text. | 57 // The region has, by default, 3 lines of text. |
| 56 static const long defaultHeightInLines = 3; | 58 static const long defaultHeightInLines = 3; |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 String stringValue = input.extractString(valueRun); | 249 String stringValue = input.extractString(valueRun); |
| 248 if (stringValue.find("-->") == kNotFound) | 250 if (stringValue.find("-->") == kNotFound) |
| 249 m_id = stringValue; | 251 m_id = stringValue; |
| 250 break; | 252 break; |
| 251 } | 253 } |
| 252 case Width: { | 254 case Width: { |
| 253 float floatWidth; | 255 float floatWidth; |
| 254 if (VTTParser::parseFloatPercentageValue(input, floatWidth) && parsedEnt
ireRun(input, valueRun)) | 256 if (VTTParser::parseFloatPercentageValue(input, floatWidth) && parsedEnt
ireRun(input, valueRun)) |
| 255 m_width = floatWidth; | 257 m_width = floatWidth; |
| 256 else | 258 else |
| 257 WTF_LOG(Media, "VTTRegion::parseSettingValue, invalid Width"); | 259 DVLOG(VTT_LOG_LEVEL) << "parseSettingValue, invalid Width"; |
| 258 break; | 260 break; |
| 259 } | 261 } |
| 260 case Height: { | 262 case Height: { |
| 261 int number; | 263 int number; |
| 262 if (input.scanDigits(number) && parsedEntireRun(input, valueRun)) | 264 if (input.scanDigits(number) && parsedEntireRun(input, valueRun)) |
| 263 m_heightInLines = number; | 265 m_heightInLines = number; |
| 264 else | 266 else |
| 265 WTF_LOG(Media, "VTTRegion::parseSettingValue, invalid Height"); | 267 DVLOG(VTT_LOG_LEVEL) << "parseSettingValue, invalid Height"; |
| 266 break; | 268 break; |
| 267 } | 269 } |
| 268 case RegionAnchor: { | 270 case RegionAnchor: { |
| 269 FloatPoint anchor; | 271 FloatPoint anchor; |
| 270 if (VTTParser::parseFloatPercentageValuePair(input, ',', anchor) && pars
edEntireRun(input, valueRun)) | 272 if (VTTParser::parseFloatPercentageValuePair(input, ',', anchor) && pars
edEntireRun(input, valueRun)) |
| 271 m_regionAnchor = anchor; | 273 m_regionAnchor = anchor; |
| 272 else | 274 else |
| 273 WTF_LOG(Media, "VTTRegion::parseSettingValue, invalid RegionAnchor")
; | 275 DVLOG(VTT_LOG_LEVEL) << "parseSettingValue, invalid RegionAnchor"; |
| 274 break; | 276 break; |
| 275 } | 277 } |
| 276 case ViewportAnchor: { | 278 case ViewportAnchor: { |
| 277 FloatPoint anchor; | 279 FloatPoint anchor; |
| 278 if (VTTParser::parseFloatPercentageValuePair(input, ',', anchor) && pars
edEntireRun(input, valueRun)) | 280 if (VTTParser::parseFloatPercentageValuePair(input, ',', anchor) && pars
edEntireRun(input, valueRun)) |
| 279 m_viewportAnchor = anchor; | 281 m_viewportAnchor = anchor; |
| 280 else | 282 else |
| 281 WTF_LOG(Media, "VTTRegion::parseSettingValue, invalid ViewportAnchor
"); | 283 DVLOG(VTT_LOG_LEVEL) << "parseSettingValue, invalid ViewportAnchor"; |
| 282 break; | 284 break; |
| 283 } | 285 } |
| 284 case Scroll: | 286 case Scroll: |
| 285 if (input.scanRun(valueRun, scrollUpValueKeyword)) | 287 if (input.scanRun(valueRun, scrollUpValueKeyword)) |
| 286 m_scroll = true; | 288 m_scroll = true; |
| 287 else | 289 else |
| 288 WTF_LOG(Media, "VTTRegion::parseSettingValue, invalid Scroll"); | 290 DVLOG(VTT_LOG_LEVEL) << "parseSettingValue, invalid Scroll"; |
| 289 break; | 291 break; |
| 290 case None: | 292 case None: |
| 291 break; | 293 break; |
| 292 } | 294 } |
| 293 | 295 |
| 294 input.skipRun(valueRun); | 296 input.skipRun(valueRun); |
| 295 } | 297 } |
| 296 | 298 |
| 297 const AtomicString& VTTRegion::textTrackCueContainerShadowPseudoId() | 299 const AtomicString& VTTRegion::textTrackCueContainerShadowPseudoId() |
| 298 { | 300 { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 323 if (!m_regionDisplayTree) { | 325 if (!m_regionDisplayTree) { |
| 324 m_regionDisplayTree = HTMLDivElement::create(document); | 326 m_regionDisplayTree = HTMLDivElement::create(document); |
| 325 prepareRegionDisplayTree(); | 327 prepareRegionDisplayTree(); |
| 326 } | 328 } |
| 327 | 329 |
| 328 return m_regionDisplayTree; | 330 return m_regionDisplayTree; |
| 329 } | 331 } |
| 330 | 332 |
| 331 void VTTRegion::willRemoveVTTCueBox(VTTCueBox* box) | 333 void VTTRegion::willRemoveVTTCueBox(VTTCueBox* box) |
| 332 { | 334 { |
| 333 WTF_LOG(Media, "VTTRegion::willRemoveVTTCueBox"); | 335 DVLOG(VTT_LOG_LEVEL) << "willRemoveVTTCueBox"; |
| 334 ASSERT(m_cueContainer->contains(box)); | 336 ASSERT(m_cueContainer->contains(box)); |
| 335 | 337 |
| 336 double boxHeight = box->getBoundingClientRect()->bottom() - box->getBounding
ClientRect()->top(); | 338 double boxHeight = box->getBoundingClientRect()->bottom() - box->getBounding
ClientRect()->top(); |
| 337 | 339 |
| 338 m_cueContainer->classList().remove(textTrackCueContainerScrollingClass(), AS
SERT_NO_EXCEPTION); | 340 m_cueContainer->classList().remove(textTrackCueContainerScrollingClass(), AS
SERT_NO_EXCEPTION); |
| 339 | 341 |
| 340 m_currentTop += boxHeight; | 342 m_currentTop += boxHeight; |
| 341 m_cueContainer->setInlineStyleProperty(CSSPropertyTop, m_currentTop, CSSPrim
itiveValue::UnitType::Pixels); | 343 m_cueContainer->setInlineStyleProperty(CSSPropertyTop, m_currentTop, CSSPrim
itiveValue::UnitType::Pixels); |
| 342 } | 344 } |
| 343 | 345 |
| 344 void VTTRegion::appendVTTCueBox(VTTCueBox* displayBox) | 346 void VTTRegion::appendVTTCueBox(VTTCueBox* displayBox) |
| 345 { | 347 { |
| 346 ASSERT(m_cueContainer); | 348 ASSERT(m_cueContainer); |
| 347 | 349 |
| 348 if (m_cueContainer->contains(displayBox)) | 350 if (m_cueContainer->contains(displayBox)) |
| 349 return; | 351 return; |
| 350 | 352 |
| 351 m_cueContainer->appendChild(displayBox); | 353 m_cueContainer->appendChild(displayBox); |
| 352 displayLastVTTCueBox(); | 354 displayLastVTTCueBox(); |
| 353 } | 355 } |
| 354 | 356 |
| 355 void VTTRegion::displayLastVTTCueBox() | 357 void VTTRegion::displayLastVTTCueBox() |
| 356 { | 358 { |
| 357 WTF_LOG(Media, "VTTRegion::displayLastVTTCueBox"); | 359 DVLOG(VTT_LOG_LEVEL) << "displayLastVTTCueBox"; |
| 358 ASSERT(m_cueContainer); | 360 ASSERT(m_cueContainer); |
| 359 | 361 |
| 360 // FIXME: This should not be causing recalc styles in a loop to set the "top
" css | 362 // FIXME: This should not be causing recalc styles in a loop to set the "top
" css |
| 361 // property to move elements. We should just scroll the text track cues on t
he | 363 // property to move elements. We should just scroll the text track cues on t
he |
| 362 // compositor with an animation. | 364 // compositor with an animation. |
| 363 | 365 |
| 364 if (m_scrollTimer.isActive()) | 366 if (m_scrollTimer.isActive()) |
| 365 return; | 367 return; |
| 366 | 368 |
| 367 // If it's a scrolling region, add the scrolling class. | 369 // If it's a scrolling region, add the scrolling class. |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 | 438 |
| 437 m_cueContainer->setShadowPseudoId(textTrackCueContainerShadowPseudoId()); | 439 m_cueContainer->setShadowPseudoId(textTrackCueContainerShadowPseudoId()); |
| 438 m_regionDisplayTree->appendChild(m_cueContainer); | 440 m_regionDisplayTree->appendChild(m_cueContainer); |
| 439 | 441 |
| 440 // 7.5 Every WebVTT region object is initialised with the following CSS | 442 // 7.5 Every WebVTT region object is initialised with the following CSS |
| 441 m_regionDisplayTree->setShadowPseudoId(textTrackRegionShadowPseudoId()); | 443 m_regionDisplayTree->setShadowPseudoId(textTrackRegionShadowPseudoId()); |
| 442 } | 444 } |
| 443 | 445 |
| 444 void VTTRegion::startTimer() | 446 void VTTRegion::startTimer() |
| 445 { | 447 { |
| 446 WTF_LOG(Media, "VTTRegion::startTimer"); | 448 DVLOG(VTT_LOG_LEVEL) << "startTimer"; |
| 447 | 449 |
| 448 if (m_scrollTimer.isActive()) | 450 if (m_scrollTimer.isActive()) |
| 449 return; | 451 return; |
| 450 | 452 |
| 451 double duration = isScrollingRegion() ? scrollTime : 0; | 453 double duration = isScrollingRegion() ? scrollTime : 0; |
| 452 m_scrollTimer.startOneShot(duration, BLINK_FROM_HERE); | 454 m_scrollTimer.startOneShot(duration, BLINK_FROM_HERE); |
| 453 } | 455 } |
| 454 | 456 |
| 455 void VTTRegion::stopTimer() | 457 void VTTRegion::stopTimer() |
| 456 { | 458 { |
| 457 WTF_LOG(Media, "VTTRegion::stopTimer"); | 459 DVLOG(VTT_LOG_LEVEL) << "stopTimer"; |
| 458 | 460 |
| 459 if (m_scrollTimer.isActive()) | 461 if (m_scrollTimer.isActive()) |
| 460 m_scrollTimer.stop(); | 462 m_scrollTimer.stop(); |
| 461 } | 463 } |
| 462 | 464 |
| 463 void VTTRegion::scrollTimerFired(Timer<VTTRegion>*) | 465 void VTTRegion::scrollTimerFired(Timer<VTTRegion>*) |
| 464 { | 466 { |
| 465 WTF_LOG(Media, "VTTRegion::scrollTimerFired"); | 467 DVLOG(VTT_LOG_LEVEL) << "scrollTimerFired"; |
| 466 | 468 |
| 467 stopTimer(); | 469 stopTimer(); |
| 468 displayLastVTTCueBox(); | 470 displayLastVTTCueBox(); |
| 469 } | 471 } |
| 470 | 472 |
| 471 DEFINE_TRACE(VTTRegion) | 473 DEFINE_TRACE(VTTRegion) |
| 472 { | 474 { |
| 473 visitor->trace(m_cueContainer); | 475 visitor->trace(m_cueContainer); |
| 474 visitor->trace(m_regionDisplayTree); | 476 visitor->trace(m_regionDisplayTree); |
| 475 visitor->trace(m_track); | 477 visitor->trace(m_track); |
| 476 } | 478 } |
| 477 | 479 |
| 478 } // namespace blink | 480 } // namespace blink |
| OLD | NEW |