1/* 2 * Copyright (C) 2006 Apple Computer, 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#include "config.h" 30#include "NetscapePlugInStreamLoader.h" 31 32#include "DocumentLoader.h" 33#include "FrameLoader.h" 34#include "FrameLoaderClient.h" 35 36namespace WebCore { 37 38NetscapePlugInStreamLoader::NetscapePlugInStreamLoader(Frame* frame, NetscapePlugInStreamLoaderClient* client) 39 : ResourceLoader(frame, ResourceLoaderOptions(SendCallbacks, SniffContent, DoNotBufferData, AllowStoredCredentials, AskClientForAllCredentials, SkipSecurityCheck)) 40 , m_client(client) 41{ 42} 43 44NetscapePlugInStreamLoader::~NetscapePlugInStreamLoader() 45{ 46} 47 48PassRefPtr<NetscapePlugInStreamLoader> NetscapePlugInStreamLoader::create(Frame* frame, NetscapePlugInStreamLoaderClient* client, const ResourceRequest& request) 49{ 50 RefPtr<NetscapePlugInStreamLoader> loader(adoptRef(new NetscapePlugInStreamLoader(frame, client))); 51 loader->documentLoader()->addPlugInStreamLoader(loader.get()); 52 if (!loader->init(request)) 53 return 0; 54 55 return loader.release(); 56} 57 58bool NetscapePlugInStreamLoader::isDone() const 59{ 60 return !m_client; 61} 62 63void NetscapePlugInStreamLoader::releaseResources() 64{ 65 m_client = 0; 66 ResourceLoader::releaseResources(); 67} 68 69void NetscapePlugInStreamLoader::didReceiveResponse(const ResourceResponse& response) 70{ 71 RefPtr<NetscapePlugInStreamLoader> protect(this); 72 73 m_client->didReceiveResponse(this, response); 74 75 // Don't continue if the stream is cancelled 76 if (!m_client) 77 return; 78 79 ResourceLoader::didReceiveResponse(response); 80 81 // Don't continue if the stream is cancelled 82 if (!m_client) 83 return; 84 85 if (!response.isHTTP()) 86 return; 87 88 if (m_client->wantsAllStreams()) 89 return; 90 91 // Status code can be null when serving from a Web archive. 92 if (response.httpStatusCode() && (response.httpStatusCode() < 100 || response.httpStatusCode() >= 400)) 93 cancel(frameLoader()->client()->fileDoesNotExistError(response)); 94} 95 96void NetscapePlugInStreamLoader::didReceiveData(const char* data, int length, long long encodedDataLength, DataPayloadType dataPayloadType) 97{ 98 didReceiveDataOrBuffer(data, length, 0, encodedDataLength, dataPayloadType); 99} 100 101void NetscapePlugInStreamLoader::didReceiveBuffer(PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType) 102{ 103 didReceiveDataOrBuffer(0, 0, buffer, encodedDataLength, dataPayloadType); 104} 105 106void NetscapePlugInStreamLoader::didReceiveDataOrBuffer(const char* data, int length, PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType) 107{ 108 RefPtr<NetscapePlugInStreamLoader> protect(this); 109 110 m_client->didReceiveData(this, buffer ? buffer->data() : data, buffer ? buffer->size() : length); 111 112 ResourceLoader::didReceiveDataOrBuffer(data, length, buffer, encodedDataLength, dataPayloadType); 113} 114 115void NetscapePlugInStreamLoader::didFinishLoading(double finishTime) 116{ 117 RefPtr<NetscapePlugInStreamLoader> protect(this); 118 119 m_documentLoader->removePlugInStreamLoader(this); 120 m_client->didFinishLoading(this); 121 ResourceLoader::didFinishLoading(finishTime); 122} 123 124void NetscapePlugInStreamLoader::didFail(const ResourceError& error) 125{ 126 RefPtr<NetscapePlugInStreamLoader> protect(this); 127 128 m_documentLoader->removePlugInStreamLoader(this); 129 m_client->didFail(this, error); 130 ResourceLoader::didFail(error); 131} 132 133void NetscapePlugInStreamLoader::willCancel(const ResourceError& error) 134{ 135 m_client->didFail(this, error); 136} 137 138void NetscapePlugInStreamLoader::didCancel(const ResourceError&) 139{ 140 // We need to remove the stream loader after the call to didFail, since didFail can 141 // spawn a new run loop and if the loader has been removed it won't be deferred when 142 // the document loader is asked to defer loading. 143 m_documentLoader->removePlugInStreamLoader(this); 144} 145 146} 147