1 /*
2 * Copyright (C) 2009 Apple Inc. All Rights Reserved.
3 * Copyright (C) 2009 Google Inc. All Rights Reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 */
27
28 #include "config.h"
29
30 #if ENABLE(WORKERS)
31
32 #include "WorkerScriptLoader.h"
33
34 #include "GenericWorkerTask.h"
35 #include "ResourceRequest.h"
36 #include "ScriptExecutionContext.h"
37 #include "SecurityOrigin.h"
38 #include "WorkerContext.h"
39 #include "WorkerScriptLoaderClient.h"
40 #include "WorkerThreadableLoader.h"
41 #include <wtf/OwnPtr.h>
42 #include <wtf/UnusedParam.h>
43
44 namespace WebCore {
45
WorkerScriptLoader()46 WorkerScriptLoader::WorkerScriptLoader()
47 : m_client(0)
48 , m_failed(false)
49 , m_identifier(0)
50 {
51 }
52
loadSynchronously(ScriptExecutionContext * scriptExecutionContext,const KURL & url,CrossOriginRedirectPolicy crossOriginRedirectPolicy)53 void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const KURL& url, CrossOriginRedirectPolicy crossOriginRedirectPolicy)
54 {
55 m_url = url;
56
57 OwnPtr<ResourceRequest> request(createResourceRequest());
58 if (!request)
59 return;
60
61 ASSERT(scriptExecutionContext->isWorkerContext());
62 WorkerThreadableLoader::loadResourceSynchronously(static_cast<WorkerContext*>(scriptExecutionContext), *request, *this, AllowStoredCredentials, crossOriginRedirectPolicy);
63 }
64
loadAsynchronously(ScriptExecutionContext * scriptExecutionContext,const KURL & url,CrossOriginRedirectPolicy crossOriginRedirectPolicy,WorkerScriptLoaderClient * client)65 void WorkerScriptLoader::loadAsynchronously(ScriptExecutionContext* scriptExecutionContext, const KURL& url, CrossOriginRedirectPolicy crossOriginRedirectPolicy, WorkerScriptLoaderClient* client)
66 {
67 ASSERT(client);
68 m_client = client;
69 m_url = url;
70
71 OwnPtr<ResourceRequest> request(createResourceRequest());
72 if (!request)
73 return;
74
75 m_threadableLoader = ThreadableLoader::create(scriptExecutionContext, this, *request, DoNotSendLoadCallbacks, DoNotSniffContent, AllowStoredCredentials, crossOriginRedirectPolicy);
76 }
77
createResourceRequest()78 PassOwnPtr<ResourceRequest> WorkerScriptLoader::createResourceRequest()
79 {
80 OwnPtr<ResourceRequest> request(new ResourceRequest(m_url));
81 request->setHTTPMethod("GET");
82
83 return request.release();
84 }
85
didReceiveResponse(const ResourceResponse & response)86 void WorkerScriptLoader::didReceiveResponse(const ResourceResponse& response)
87 {
88 if (response.httpStatusCode() / 100 != 2 && response.httpStatusCode()) {
89 m_failed = true;
90 return;
91 }
92 m_responseEncoding = response.textEncodingName();
93 }
94
didReceiveData(const char * data,int len)95 void WorkerScriptLoader::didReceiveData(const char* data, int len)
96 {
97 if (m_failed)
98 return;
99
100 if (!m_decoder) {
101 if (!m_responseEncoding.isEmpty())
102 m_decoder = TextResourceDecoder::create("text/javascript", m_responseEncoding);
103 else
104 m_decoder = TextResourceDecoder::create("text/javascript", "UTF-8");
105 }
106
107 if (!len)
108 return;
109
110 if (len == -1)
111 len = strlen(data);
112
113 m_script += m_decoder->decode(data, len);
114 }
115
didFinishLoading(unsigned long identifier)116 void WorkerScriptLoader::didFinishLoading(unsigned long identifier)
117 {
118 if (m_failed)
119 return;
120
121 if (m_decoder)
122 m_script += m_decoder->flush();
123
124 m_identifier = identifier;
125 notifyFinished();
126 }
127
didFail(const ResourceError &)128 void WorkerScriptLoader::didFail(const ResourceError&)
129 {
130 notifyError();
131 }
132
didFailRedirectCheck()133 void WorkerScriptLoader::didFailRedirectCheck()
134 {
135 notifyError();
136 }
137
didReceiveAuthenticationCancellation(const ResourceResponse &)138 void WorkerScriptLoader::didReceiveAuthenticationCancellation(const ResourceResponse&)
139 {
140 notifyError();
141 }
142
notifyError()143 void WorkerScriptLoader::notifyError()
144 {
145 m_failed = true;
146 notifyFinished();
147 }
148
notifyFinished()149 void WorkerScriptLoader::notifyFinished()
150 {
151 if (m_client)
152 m_client->notifyFinished();
153 }
154
155 } // namespace WebCore
156
157 #endif // ENABLE(WORKERS)
158