tizen beta release
[profile/ivi/webkit-efl.git] / Source / WebCore / loader / NetscapePlugInStreamLoader.cpp
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
36 namespace WebCore {
37
38 NetscapePlugInStreamLoader::NetscapePlugInStreamLoader(Frame* frame, NetscapePlugInStreamLoaderClient* client)
39     : ResourceLoader(frame, ResourceLoaderOptions(SendCallbacks, SniffContent, DoNotBufferData, AllowStoredCredentials, AskClientForCrossOriginCredentials, SkipSecurityCheck))
40     , m_client(client)
41 {
42 }
43
44 NetscapePlugInStreamLoader::~NetscapePlugInStreamLoader()
45 {
46 }
47
48 PassRefPtr<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
58 bool NetscapePlugInStreamLoader::isDone() const
59 {
60     return !m_client;
61 }
62
63 void NetscapePlugInStreamLoader::releaseResources()
64 {
65     m_client = 0;
66     ResourceLoader::releaseResources();
67 }
68
69 void 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
96 void NetscapePlugInStreamLoader::didReceiveData(const char* data, int length, long long encodedDataLength, bool allAtOnce)
97 {
98     RefPtr<NetscapePlugInStreamLoader> protect(this);
99
100     m_client->didReceiveData(this, data, length);
101     
102     ResourceLoader::didReceiveData(data, length, encodedDataLength, allAtOnce);
103 }
104
105 void NetscapePlugInStreamLoader::didFinishLoading(double finishTime)
106 {
107     RefPtr<NetscapePlugInStreamLoader> protect(this);
108
109     m_documentLoader->removePlugInStreamLoader(this);
110     m_client->didFinishLoading(this);
111     ResourceLoader::didFinishLoading(finishTime);
112 }
113
114 void NetscapePlugInStreamLoader::didFail(const ResourceError& error)
115 {
116     RefPtr<NetscapePlugInStreamLoader> protect(this);
117
118     m_documentLoader->removePlugInStreamLoader(this);
119     m_client->didFail(this, error);
120     ResourceLoader::didFail(error);
121 }
122
123 void NetscapePlugInStreamLoader::willCancel(const ResourceError& error)
124 {
125     m_client->didFail(this, error);
126 }
127
128 void NetscapePlugInStreamLoader::didCancel(const ResourceError&)
129 {
130     // We need to remove the stream loader after the call to didFail, since didFail can 
131     // spawn a new run loop and if the loader has been removed it won't be deferred when
132     // the document loader is asked to defer loading.
133     m_documentLoader->removePlugInStreamLoader(this);
134 }
135
136 }