15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/TextTrackLoader.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/FetchInitiatorTypeNames.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/fetch/CrossOriginAccessControl.h" 33e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/FetchRequest.h" 34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceFetcher.h" 35e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h" 361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Logging.h" 371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/SharedBuffer.h" 3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 4102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)TextTrackLoader::TextTrackLoader(TextTrackLoaderClient& client, Document& document) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_client(client) 44bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) , m_document(document) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cueLoadTimer(this, &TextTrackLoader::cueLoadTimerFired) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_state(Idle) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_newCuesAvailable(false) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TextTrackLoader::~TextTrackLoader() 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextTrackLoader::cueLoadTimerFired(Timer<TextTrackLoader>* timer) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_UNUSED(timer, timer == &m_cueLoadTimer); 5893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_newCuesAvailable) { 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_newCuesAvailable = false; 6119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_client.newCuesAvailable(this); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_state >= Finished) 6519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_client.cueLoadingCompleted(this, m_state == Failed); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextTrackLoader::cancelLoad() 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) clearResource(); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void TextTrackLoader::dataReceived(Resource* resource, const char* data, int length) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(this->resource() == resource); 7602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 7719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (m_state == Failed) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_cueParser) 81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_cueParser = VTTParser::create(this, document()); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_cueParser->parseBytes(data, length); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void TextTrackLoader::corsPolicyPreventedLoad(SecurityOrigin* securityOrigin, const KURL& url) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) String consoleMessage("Text track from origin '" + SecurityOrigin::create(url)->toString() + "' has been blocked from loading: Not at same origin as the document, and parent of track element does not have a 'crossorigin' attribute. Origin '" + securityOrigin->toString() + "' is therefore not allowed access."); 89e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) document().addConsoleMessage(ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, consoleMessage)); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state = Failed; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 93fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid TextTrackLoader::notifyFinished(Resource* resource) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(this->resource() == resource); 9619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (m_state != Failed) 9719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_state = resource->errorOccurred() ? Failed : Finished; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_state == Finished && m_cueParser) 10051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_cueParser->flush(); 10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_cueLoadTimer.isActive()) 103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_cueLoadTimer.startOneShot(0, FROM_HERE); 10402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cancelLoad(); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool TextTrackLoader::load(const KURL& url, const AtomicString& crossOriginMode) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cancelLoad(); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) FetchRequest cueRequest(ResourceRequest(document().completeURL(url)), FetchInitiatorTypeNames::texttrack); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!crossOriginMode.isNull()) { 115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) cueRequest.setCrossOriginAccessControl(document().securityOrigin(), crossOriginMode); 116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } else if (!document().securityOrigin()->canRequest(url)) { 11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Text track elements without 'crossorigin' set on the parent are "No CORS"; report error if not same-origin. 118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) corsPolicyPreventedLoad(document().securityOrigin(), url); 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return false; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ResourceFetcher* fetcher = document().fetcher(); 1236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch setResource(fetcher->fetchTextTrack(cueRequest)); 12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return resource(); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextTrackLoader::newCuesParsed() 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_cueLoadTimer.isActive()) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_newCuesAvailable = true; 133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_cueLoadTimer.startOneShot(0, FROM_HERE); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void TextTrackLoader::newRegionsParsed() 13753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 13819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_client.newRegionsAvailable(this); 13953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextTrackLoader::fileFailedToParse() 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 143a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG(Media, "TextTrackLoader::fileFailedToParse"); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state = Failed; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_cueLoadTimer.isActive()) 148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_cueLoadTimer.startOneShot(0, FROM_HERE); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cancelLoad(); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 153f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid TextTrackLoader::getNewCues(WillBeHeapVector<RefPtrWillBeMember<VTTCue> >& outputCues) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_cueParser); 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_cueParser) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cueParser->getNewCues(outputCues); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 160f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid TextTrackLoader::getNewRegions(WillBeHeapVector<RefPtrWillBeMember<VTTRegion> >& outputRegions) 16153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 16253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(m_cueParser); 16353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_cueParser) 16453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_cueParser->getNewRegions(outputRegions); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 167f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid TextTrackLoader::trace(Visitor* visitor) 168f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{ 169f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu visitor->trace(m_cueParser); 170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_document); 171f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu} 172f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu 17319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 174