Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKitLegacy / win / WebDataSource.cpp
1 /*
2  * Copyright (C) 2006-2007, 2013, 2015 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE 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 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. 
24  */
25
26 #include "WebKitDLL.h"
27 #include "WebDataSource.h"
28
29 #include "WebKit.h"
30 #include "MemoryStream.h"
31 #include "WebDocumentLoader.h"
32 #include "WebError.h"
33 #include "WebFrame.h"
34 #include "WebFrameLoaderClient.h"
35 #include "WebKit.h"
36 #include "WebHTMLRepresentation.h"
37 #include "WebKitStatisticsPrivate.h"
38 #include "WebMutableURLRequest.h"
39 #include "WebResource.h"
40 #include "WebURLResponse.h"
41 #include <WebCore/BString.h>
42 #include <WebCore/CachedResourceLoader.h>
43 #include <WebCore/Document.h>
44 #include <WebCore/Frame.h>
45 #include <WebCore/FrameLoader.h>
46 #include <wtf/URL.h>
47
48 using namespace WebCore;
49
50 // WebDataSource ----------------------------------------------------------------
51
52 // {F230854D-7091-428a-8DB5-37CABA44C105}
53 const GUID IID_WebDataSource = { 0x5c2f9099, 0xe65e, 0x4a0f, { 0x9c, 0xa0, 0x6a, 0xd6, 0x92, 0x52, 0xa6, 0x2a } };
54
55 WebDataSource::WebDataSource(WebDocumentLoader* loader)
56     : m_loader(loader)
57 {
58     WebDataSourceCount++;
59     gClassCount++;
60     gClassNameCount().add("WebDataSource");
61 }
62
63 WebDataSource::~WebDataSource()
64 {
65     if (m_loader)
66         m_loader->detachDataSource();
67     WebDataSourceCount--;
68     gClassCount--;
69     gClassNameCount().remove("WebDataSource");
70 }
71
72 WebDataSource* WebDataSource::createInstance(WebDocumentLoader* loader)
73 {
74     WebDataSource* instance = new WebDataSource(loader);
75     instance->AddRef();
76     return instance;
77 }
78
79 WebDocumentLoader* WebDataSource::documentLoader() const
80 {
81     return m_loader.get();
82 }
83
84 // IWebDataSourcePrivate ------------------------------------------------------
85
86 HRESULT WebDataSource::overrideEncoding(_Deref_opt_out_ BSTR* /*encoding*/)
87 {
88     ASSERT_NOT_REACHED();
89     return E_NOTIMPL;
90 }
91
92 HRESULT WebDataSource::setOverrideEncoding(_In_ BSTR /*encoding*/)
93 {
94     ASSERT_NOT_REACHED();
95     return E_NOTIMPL;
96 }
97
98 HRESULT WebDataSource::mainDocumentError(_COM_Outptr_opt_ IWebError** error)
99 {
100     if (!error) {
101         ASSERT_NOT_REACHED();
102         return E_POINTER;
103     }
104
105     *error = nullptr;
106
107     if (!m_loader)
108         return E_UNEXPECTED;
109
110     if (m_loader->mainDocumentError().isNull())
111         return S_OK;
112
113     *error = WebError::createInstance(m_loader->mainDocumentError());
114     return S_OK;
115 }
116
117 HRESULT WebDataSource::setDeferMainResourceDataLoad(BOOL flag)
118 {
119     if (!m_loader)
120         return E_UNEXPECTED;
121
122     m_loader->setDeferMainResourceDataLoad(flag);
123     return S_OK;
124 }
125
126 // IUnknown -------------------------------------------------------------------
127
128 HRESULT WebDataSource::QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject)
129 {
130     if (!ppvObject)
131         return E_POINTER;
132     *ppvObject = nullptr;
133     if (IsEqualGUID(riid, IID_WebDataSource))
134         *ppvObject = this;
135     else if (IsEqualGUID(riid, IID_IUnknown))
136         *ppvObject = static_cast<IWebDataSource*>(this);
137     else if (IsEqualGUID(riid, IID_IWebDataSource))
138         *ppvObject = static_cast<IWebDataSource*>(this);
139     else if (IsEqualGUID(riid, IID_IWebDataSourcePrivate))
140         *ppvObject = static_cast<IWebDataSourcePrivate*>(this);
141     else
142         return E_NOINTERFACE;
143
144     AddRef();
145     return S_OK;
146 }
147
148 ULONG WebDataSource::AddRef()
149 {
150     return ++m_refCount;
151 }
152
153 ULONG WebDataSource::Release()
154 {
155     ULONG newRef = --m_refCount;
156     if (!newRef)
157         delete(this);
158
159     return newRef;
160 }
161
162 // IWebDataSource --------------------------------------------------------------
163
164 HRESULT WebDataSource::initWithRequest(_In_opt_ IWebURLRequest* /*request*/)
165 {
166     ASSERT_NOT_REACHED();
167     return E_NOTIMPL;
168 }
169
170 HRESULT WebDataSource::data(_COM_Outptr_opt_ IStream** stream)
171 {
172     if (!stream)
173         return E_POINTER;
174     *stream = nullptr;
175     if (!m_loader)
176         return E_UNEXPECTED;
177
178     return MemoryStream::createInstance(m_loader->mainResourceData()).copyRefTo(stream);
179 }
180
181 HRESULT WebDataSource::representation(_COM_Outptr_opt_ IWebDocumentRepresentation** rep)
182 {
183     if (!rep)
184         return E_POINTER;
185     *rep = nullptr;
186     if (!m_loader)
187         return E_UNEXPECTED;
188
189     HRESULT hr = S_OK;
190     if (!m_representation) {
191         WebHTMLRepresentation* htmlRep = WebHTMLRepresentation::createInstance(static_cast<WebFrameLoaderClient&>(m_loader->frameLoader()->client()).webFrame());
192         hr = htmlRep->QueryInterface(IID_IWebDocumentRepresentation, (void**) &m_representation);
193         htmlRep->Release();
194     }
195
196     return m_representation.copyRefTo(rep);
197 }
198
199 HRESULT WebDataSource::webFrame(_COM_Outptr_opt_ IWebFrame** frame)
200 {
201     if (!frame)
202         return E_POINTER;
203     *frame = nullptr;
204     if (!m_loader)
205         return E_UNEXPECTED;
206
207     *frame = static_cast<WebFrameLoaderClient&>(m_loader->frameLoader()->client()).webFrame();
208     (*frame)->AddRef();
209     return S_OK;
210 }
211
212 HRESULT WebDataSource::initialRequest(_COM_Outptr_opt_ IWebURLRequest** request)
213 {
214     if (!request)
215         return E_POINTER;
216     *request = nullptr;
217     if (!m_loader)
218         return E_UNEXPECTED;
219
220     *request = WebMutableURLRequest::createInstance(m_loader->originalRequest());
221     return S_OK;
222 }
223
224 HRESULT WebDataSource::request(_COM_Outptr_opt_ IWebMutableURLRequest** request)
225 {
226     if (!request)
227         return E_POINTER;
228     *request = nullptr;
229     if (!m_loader)
230         return E_UNEXPECTED;
231
232     *request = WebMutableURLRequest::createInstance(m_loader->request());
233     return S_OK;
234 }
235
236 HRESULT WebDataSource::response(_COM_Outptr_opt_ IWebURLResponse** response)
237 {
238     if (!response)
239         return E_POINTER;
240     *response = nullptr;
241     if (!m_loader)
242         return E_UNEXPECTED;
243
244     *response = WebURLResponse::createInstance(m_loader->response());
245     return S_OK;
246 }
247
248 HRESULT WebDataSource::textEncodingName(_Deref_opt_out_ BSTR* name)
249 {
250     if (!name)
251         return E_POINTER;
252
253     if (!m_loader)
254         return E_UNEXPECTED;
255
256     String encoding = m_loader->overrideEncoding();
257     if (encoding.isNull())
258         encoding = m_loader->response().textEncodingName();
259
260     *name = BString(encoding).release();
261
262     return S_OK;
263 }
264
265 HRESULT WebDataSource::isLoading(_Out_ BOOL* loading)
266 {
267     if (!loading)
268         return E_POINTER;
269
270     if (!m_loader)
271         return E_UNEXPECTED;
272
273     *loading = m_loader->isLoadingInAPISense();
274     return S_OK;
275 }
276
277 HRESULT WebDataSource::pageTitle(_Deref_opt_out_ BSTR* title)
278 {
279     if (!title)
280         return E_POINTER;
281
282     if (!m_loader)
283         return E_UNEXPECTED;
284
285     *title = BString(m_loader->title().string).release();
286     return S_OK;
287 }
288
289 HRESULT WebDataSource::unreachableURL(_Deref_opt_out_ BSTR* url)
290 {
291     if (!url)
292         return E_POINTER;
293
294     if (!m_loader)
295         return E_UNEXPECTED;
296
297     URL unreachableURL = m_loader->unreachableURL();
298     BString urlString(unreachableURL.string());
299
300     *url = urlString.release();
301     return S_OK;
302 }
303
304 HRESULT WebDataSource::webArchive(_COM_Outptr_opt_ IWebArchive** archive)
305 {
306     ASSERT_NOT_REACHED();
307     if (!archive)
308         return E_POINTER;
309     *archive = nullptr;
310     return E_NOTIMPL;
311 }
312
313 HRESULT WebDataSource::mainResource(_COM_Outptr_opt_ IWebResource** resource)
314 {
315     ASSERT_NOT_REACHED();
316     if (!resource)
317         return E_POINTER;
318     *resource = nullptr;
319     return E_NOTIMPL;
320 }
321
322 HRESULT WebDataSource::subresources(_COM_Outptr_opt_ IEnumVARIANT** result)
323 {
324     ASSERT_NOT_REACHED();
325     if (!result)
326         return E_POINTER;
327     *result = nullptr;
328     return E_NOTIMPL;
329 }
330
331 HRESULT WebDataSource::subresourceForURL(_In_ BSTR url, _COM_Outptr_opt_ IWebResource** resource)
332 {
333     if (!resource) {
334         ASSERT_NOT_REACHED();
335         return E_POINTER;
336     }
337
338     *resource = nullptr;
339
340     if (!m_loader)
341         return E_UNEXPECTED;
342     
343     Document* doc = m_loader->frameLoader()->frame().document();
344     if (!doc)
345         return E_FAIL;
346
347     CachedResource* cachedResource = doc->cachedResourceLoader().cachedResource(String(url));
348
349     if (!cachedResource)
350         return E_FAIL;
351
352     *resource = WebResource::createInstance(cachedResource->resourceBuffer(), cachedResource->response());
353     return S_OK;
354 }
355
356 HRESULT WebDataSource::addSubresource(_In_opt_ IWebResource* /*subresource*/)
357 {
358     ASSERT_NOT_REACHED();
359     return E_NOTIMPL;
360 }