[BlackBerry] Fix access to ResourceHandle::context
[WebKit-https.git] / Source / WebCore / platform / network / blackberry / ResourceHandleBlackBerry.cpp
1 /*
2  * Copyright (C) 2009, 2010 Research In Motion Limited. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "config.h"
20 #include "ResourceHandle.h"
21
22 #include "EventLoop.h"
23 #include "Frame.h"
24 #include "FrameLoaderClientBlackBerry.h"
25 #include "FrameNetworkingContextBlackBerry.h"
26 #include "NetworkManager.h"
27 #include "NotImplemented.h"
28 #include "Page.h"
29 #include "PageGroupLoadDeferrer.h"
30 #include "ResourceError.h"
31 #include "ResourceHandleClient.h"
32 #include "ResourceHandleInternal.h"
33 #include "ResourceRequest.h"
34 #include "ResourceResponse.h"
35 #include "SharedBuffer.h"
36 #include "ThreadableLoader.h" // for StoredCredentials
37
38 #include <network/FilterStream.h>
39
40 namespace WebCore {
41
42 class WebCoreSynchronousLoader : public ResourceHandleClient {
43 public:
44     WebCoreSynchronousLoader();
45
46     virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
47     virtual void didReceiveData(ResourceHandle*, const char*, int, int);
48     virtual void didFinishLoading(ResourceHandle*, double);
49     virtual void didFail(ResourceHandle*, const ResourceError&);
50
51     ResourceResponse resourceResponse() const { return m_response; }
52     ResourceError resourceError() const { return m_error; }
53     Vector<char> data() const { return m_data; }
54     bool isDone() const { return m_isDone; }
55
56 private:
57     ResourceResponse m_response;
58     ResourceError m_error;
59     Vector<char> m_data;
60     bool m_isDone;
61 };
62
63 WebCoreSynchronousLoader::WebCoreSynchronousLoader()
64     : m_isDone(false)
65 {
66 }
67
68 void WebCoreSynchronousLoader::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
69 {
70     m_response = response;
71 }
72
73 void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data, int length, int)
74 {
75     m_data.append(data, length);
76 }
77
78 void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
79 {
80     m_isDone = true;
81 }
82
83 void WebCoreSynchronousLoader::didFail(ResourceHandle*, const ResourceError& error)
84 {
85     m_error = error;
86     m_isDone = true;
87 }
88
89 ResourceHandleInternal::~ResourceHandleInternal()
90 {
91     notImplemented();
92 }
93
94 ResourceHandle::~ResourceHandle()
95 {
96     notImplemented();
97 }
98
99 bool ResourceHandle::loadsBlocked()
100 {
101     notImplemented();
102     return false;
103 }
104
105 void ResourceHandle::platformSetDefersLoading(bool defersLoading)
106 {
107     NetworkManager::instance()->setDefersLoading(this, defersLoading);
108 }
109
110 bool ResourceHandle::start()
111 {
112     if (!d->m_context || !d->m_context->isValid())
113         return false;
114
115     // FIXME: clean up use of Frame now that we have NetworkingContext (see RIM Bug #1515)
116     Frame* frame = static_cast<FrameNetworkingContextBlackBerry*>(d->m_context.get())->frame();
117     if (!frame || !frame->loader() || !frame->loader()->client() || !client())
118         return false;
119     int playerId = static_cast<FrameLoaderClientBlackBerry*>(frame->loader()->client())->playerId();
120     return NetworkManager::instance()->startJob(playerId, this, frame, d->m_defersLoading);
121 }
122
123 void ResourceHandle::pauseLoad(bool pause)
124 {
125     if (NetworkManager::instance())
126         NetworkManager::instance()->pauseLoad(this, pause);
127 }
128
129 void ResourceHandle::cancel()
130 {
131     NetworkManager::instance()->stopJob(this);
132     setClient(0);
133 }
134
135 void ResourceHandle::platformLoadResourceSynchronously(NetworkingContext* context, const ResourceRequest& request, StoredCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data)
136 {
137     if (!context || !context->isValid()) {
138         ASSERT(false && "loadResourceSynchronously called with invalid networking context");
139         return;
140     }
141
142     // FIXME: clean up use of Frame now that we have NetworkingContext (see RIM Bug #1515)
143     Frame* frame = static_cast<FrameNetworkingContextBlackBerry*>(context)->frame();
144     if (!frame || !frame->loader() || !frame->loader()->client() || !frame->page()) {
145         ASSERT(false && "loadResourceSynchronously called without a frame or frame client");
146         return;
147     }
148
149     PageGroupLoadDeferrer deferrer(frame->page(), true);
150     TimerBase::fireTimersInNestedEventLoop();
151
152     int playerId = static_cast<FrameLoaderClientBlackBerry*>(frame->loader()->client())->playerId();
153
154     WebCoreSynchronousLoader syncLoader;
155
156     bool defersLoading = false;
157     bool shouldContentSniff = false;
158
159     RefPtr<ResourceHandle> handle = adoptRef(new ResourceHandle(context, request, &syncLoader, defersLoading, shouldContentSniff));
160     NetworkManager::instance()->startJob(playerId, handle, frame, defersLoading);
161
162     const double syncLoadTimeOut = 60; // seconds
163
164     double startTime = currentTime();
165     EventLoop loop;
166     while (!syncLoader.isDone() && !loop.ended()) {
167         loop.cycle();
168         if (currentTime() - startTime > syncLoadTimeOut) {
169             handle->cancel();
170             error = ResourceError(ResourceError::platformErrorDomain, BlackBerry::Platform::FilterStream::StatusNetworkError, request.url().string(), "Time out");
171             return;
172         }
173     }
174
175     error = syncLoader.resourceError();
176     data = syncLoader.data();
177     response = syncLoader.resourceResponse();
178 }
179
180 } // namespace WebCore