1/* 2 * Copyright (C) 2005, 2006, 2009 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 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 SubresourceLoader_h 30#define SubresourceLoader_h 31 32#include "FrameLoaderTypes.h" 33#include "ResourceLoader.h" 34 35#include <wtf/text/WTFString.h> 36 37namespace WebCore { 38 39class CachedResource; 40class CachedResourceLoader; 41class Document; 42class PageActivityAssertionToken; 43class ResourceRequest; 44 45class SubresourceLoader final : public ResourceLoader { 46public: 47 static PassRefPtr<SubresourceLoader> create(Frame*, CachedResource*, const ResourceRequest&, const ResourceLoaderOptions&); 48 49 virtual ~SubresourceLoader(); 50 51 void cancelIfNotFinishing(); 52 virtual bool isSubresourceLoader() override; 53 CachedResource* cachedResource(); 54 55#if PLATFORM(IOS) 56 virtual bool startLoading() override; 57 58 // FIXME: What is an "iOS" original request? Why is it necessary? 59 virtual const ResourceRequest& iOSOriginalRequest() const override { return m_iOSOriginalRequest; } 60#endif 61 62private: 63 SubresourceLoader(Frame*, CachedResource*, const ResourceLoaderOptions&); 64 65 virtual bool init(const ResourceRequest&) override; 66 67 virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse) override; 68 virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override; 69 virtual void didReceiveResponse(const ResourceResponse&) override; 70 virtual void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType) override; 71 virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType) override; 72 virtual void didFinishLoading(double finishTime) override; 73 virtual void didFail(const ResourceError&) override; 74 virtual void willCancel(const ResourceError&) override; 75 virtual void didCancel(const ResourceError&) override; 76 77#if USE(NETWORK_CFDATA_ARRAY_CALLBACK) 78 virtual bool supportsDataArray() override { return true; } 79 virtual void didReceiveDataArray(CFArrayRef) override; 80#endif 81 virtual void releaseResources() override; 82 83#if USE(SOUP) 84 virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize) override; 85#endif 86 87 bool checkForHTTPStatusCodeError(); 88 89 void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType); 90 91 void notifyDone(); 92 93 enum SubresourceLoaderState { 94 Uninitialized, 95 Initialized, 96 Finishing, 97#if PLATFORM(IOS) 98 CancelledWhileInitializing 99#endif 100 }; 101 102 class RequestCountTracker { 103 public: 104 RequestCountTracker(CachedResourceLoader*, CachedResource*); 105 ~RequestCountTracker(); 106 private: 107 CachedResourceLoader* m_cachedResourceLoader; 108 CachedResource* m_resource; 109 }; 110 111#if PLATFORM(IOS) 112 ResourceRequest m_iOSOriginalRequest; 113#endif 114 CachedResource* m_resource; 115 bool m_loadingMultipartContent; 116 SubresourceLoaderState m_state; 117 OwnPtr<RequestCountTracker> m_requestCountTracker; 118}; 119 120} 121 122#endif // SubresourceLoader_h 123