Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / fetch / ResourceLoader.h
1 /*
2  * Copyright (C) 2005, 2006, 2011 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  *
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  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef ResourceLoader_h
30 #define ResourceLoader_h
31
32 #include "core/fetch/ResourceLoaderOptions.h"
33 #include "platform/network/ResourceRequest.h"
34 #include "public/platform/WebURLLoader.h"
35 #include "public/platform/WebURLLoaderClient.h"
36 #include "wtf/Forward.h"
37 #include "wtf/RefCounted.h"
38
39 namespace blink {
40 class WebThreadedDataReceiver;
41 }
42
43 namespace blink {
44
45 class Resource;
46 class KURL;
47 class ResourceError;
48 class ResourceLoaderHost;
49
50 class ResourceLoader final : public RefCountedWillBeGarbageCollectedFinalized<ResourceLoader>, protected WebURLLoaderClient {
51 public:
52     static PassRefPtrWillBeRawPtr<ResourceLoader> create(ResourceLoaderHost*, Resource*, const ResourceRequest&, const ResourceLoaderOptions&);
53     virtual ~ResourceLoader();
54     void trace(Visitor*);
55
56     void start();
57     void changeToSynchronous();
58
59     void cancel();
60     void cancel(const ResourceError&);
61     void cancelIfNotFinishing();
62
63     Resource* cachedResource() { return m_resource; }
64     const ResourceRequest& originalRequest() const { return m_originalRequest; }
65
66     void setDefersLoading(bool);
67     bool defersLoading() const { return m_defersLoading; }
68
69     void attachThreadedDataReceiver(PassOwnPtr<blink::WebThreadedDataReceiver>);
70
71     void releaseResources();
72
73     void didChangePriority(ResourceLoadPriority, int intraPriorityValue);
74
75     // WebURLLoaderClient
76     void willSendRequest(blink::WebURLLoader*, blink::WebURLRequest&, const blink::WebURLResponse& redirectResponse) override;
77     void didSendData(blink::WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
78     void didReceiveResponse(blink::WebURLLoader*, const blink::WebURLResponse&) override;
79     void didReceiveResponse(blink::WebURLLoader*, const blink::WebURLResponse&, WebDataConsumerHandle*) override;
80     void didReceiveData(blink::WebURLLoader*, const char*, int, int encodedDataLength) override;
81     void didReceiveCachedMetadata(blink::WebURLLoader*, const char* data, int length) override;
82     void didFinishLoading(blink::WebURLLoader*, double finishTime, int64_t encodedDataLength) override;
83     void didFail(blink::WebURLLoader*, const blink::WebURLError&) override;
84     void didDownloadData(blink::WebURLLoader*, int, int) override;
85
86     const KURL& url() const { return m_request.url(); }
87     bool isLoadedBy(ResourceLoaderHost*) const;
88
89     bool reachedTerminalState() const { return m_state == Terminated; }
90     const ResourceRequest& request() const { return m_request; }
91
92     class RequestCountTracker {
93     public:
94         RequestCountTracker(ResourceLoaderHost*, Resource*);
95         RequestCountTracker(const RequestCountTracker&);
96         ~RequestCountTracker();
97     private:
98         ResourceLoaderHost* m_host;
99         Resource* m_resource;
100     };
101
102 private:
103     ResourceLoader(ResourceLoaderHost*, Resource*, const ResourceLoaderOptions&);
104
105     void init(const ResourceRequest&);
106     void requestSynchronously();
107
108     void didFinishLoadingOnePart(double finishTime, int64_t encodedDataLength);
109
110     bool responseNeedsAccessControlCheck() const;
111
112     void didComplete();
113
114     ResourceRequest& applyOptions(ResourceRequest&) const;
115
116     OwnPtr<blink::WebURLLoader> m_loader;
117     RefPtrWillBeMember<ResourceLoaderHost> m_host;
118
119     ResourceRequest m_request;
120     ResourceRequest m_originalRequest; // Before redirects.
121
122     bool m_notifiedLoadComplete;
123
124     bool m_defersLoading;
125     OwnPtr<ResourceRequest> m_fallbackRequestForServiceWorker;
126     ResourceRequest m_deferredRequest;
127     ResourceLoaderOptions m_options;
128
129     enum ResourceLoaderState {
130         Initialized,
131         Finishing,
132         Terminated
133     };
134
135     enum ConnectionState {
136         ConnectionStateNew,
137         ConnectionStateStarted,
138         ConnectionStateReceivedResponse,
139         ConnectionStateReceivingData,
140         ConnectionStateFinishedLoading,
141         ConnectionStateCanceled,
142         ConnectionStateFailed,
143     };
144
145     RawPtrWillBeMember<Resource> m_resource;
146     ResourceLoaderState m_state;
147
148     // Used for sanity checking to make sure we don't experience illegal state
149     // transitions.
150     ConnectionState m_connectionState;
151
152     OwnPtr<RequestCountTracker> m_requestCountTracker;
153 };
154
155 }
156
157 #endif