2 * Copyright (C) 2011 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "core/loader/TextTrackLoader.h"
30 #include "core/dom/Document.h"
31 #include "core/fetch/FetchInitiatorTypeNames.h"
32 #include "core/fetch/FetchRequest.h"
33 #include "core/fetch/RawResource.h"
34 #include "core/fetch/ResourceFetcher.h"
35 #include "core/inspector/ConsoleMessage.h"
36 #include "platform/Logging.h"
37 #include "platform/SharedBuffer.h"
38 #include "platform/weborigin/SecurityOrigin.h"
42 TextTrackLoader::TextTrackLoader(TextTrackLoaderClient
& client
, Document
& document
)
44 , m_document(document
)
45 , m_cueLoadTimer(this, &TextTrackLoader::cueLoadTimerFired
)
47 , m_newCuesAvailable(false)
51 TextTrackLoader::~TextTrackLoader()
55 void TextTrackLoader::cueLoadTimerFired(Timer
<TextTrackLoader
>* timer
)
57 ASSERT_UNUSED(timer
, timer
== &m_cueLoadTimer
);
59 if (m_newCuesAvailable
) {
60 m_newCuesAvailable
= false;
61 m_client
.newCuesAvailable(this);
64 if (m_state
>= Finished
)
65 m_client
.cueLoadingCompleted(this, m_state
== Failed
);
68 void TextTrackLoader::cancelLoad()
73 void TextTrackLoader::dataReceived(Resource
* resource
, const char* data
, unsigned length
)
75 ASSERT(this->resource() == resource
);
77 if (m_state
== Failed
)
81 m_cueParser
= VTTParser::create(this, document());
83 m_cueParser
->parseBytes(data
, length
);
86 void TextTrackLoader::corsPolicyPreventedLoad(SecurityOrigin
* securityOrigin
, const KURL
& url
)
88 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.");
89 document().addConsoleMessage(ConsoleMessage::create(SecurityMessageSource
, ErrorMessageLevel
, consoleMessage
));
93 void TextTrackLoader::notifyFinished(Resource
* resource
)
95 ASSERT(this->resource() == resource
);
96 if (m_state
!= Failed
)
97 m_state
= resource
->errorOccurred() ? Failed
: Finished
;
99 if (m_state
== Finished
&& m_cueParser
)
100 m_cueParser
->flush();
102 if (!m_cueLoadTimer
.isActive())
103 m_cueLoadTimer
.startOneShot(0, FROM_HERE
);
108 bool TextTrackLoader::load(const KURL
& url
, const AtomicString
& crossOriginMode
)
112 FetchRequest
cueRequest(ResourceRequest(document().completeURL(url
)), FetchInitiatorTypeNames::texttrack
);
114 if (!crossOriginMode
.isNull()) {
115 cueRequest
.setCrossOriginAccessControl(document().securityOrigin(), crossOriginMode
);
116 } else if (!document().securityOrigin()->canRequestNoSuborigin(url
)) {
117 // Text track elements without 'crossorigin' set on the parent are "No CORS"; report error if not same-origin.
118 corsPolicyPreventedLoad(document().securityOrigin(), url
);
122 ResourceFetcher
* fetcher
= document().fetcher();
123 setResource(RawResource::fetchTextTrack(cueRequest
, fetcher
));
127 void TextTrackLoader::newCuesParsed()
129 if (m_cueLoadTimer
.isActive())
132 m_newCuesAvailable
= true;
133 m_cueLoadTimer
.startOneShot(0, FROM_HERE
);
136 void TextTrackLoader::newRegionsParsed()
138 m_client
.newRegionsAvailable(this);
141 void TextTrackLoader::fileFailedToParse()
143 WTF_LOG(Media
, "TextTrackLoader::fileFailedToParse");
147 if (!m_cueLoadTimer
.isActive())
148 m_cueLoadTimer
.startOneShot(0, FROM_HERE
);
153 void TextTrackLoader::getNewCues(HeapVector
<Member
<TextTrackCue
>>& outputCues
)
157 m_cueParser
->getNewCues(outputCues
);
160 void TextTrackLoader::getNewRegions(HeapVector
<Member
<VTTRegion
>>& outputRegions
)
164 m_cueParser
->getNewRegions(outputRegions
);
167 DEFINE_TRACE(TextTrackLoader
)
169 visitor
->trace(m_cueParser
);
170 visitor
->trace(m_document
);