15ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/*
25ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *
45ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * Redistribution and use in source and binary forms, with or without
55ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * modification, are permitted provided that the following conditions
65ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * are met:
75ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 1. Redistributions of source code must retain the above copyright
85ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *    notice, this list of conditions and the following disclaimer.
95ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 2. Redistributions in binary form must reproduce the above copyright
105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *    notice, this list of conditions and the following disclaimer in the
115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *    documentation and/or other materials provided with the distribution.
125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark *
135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark */
255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API)
275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "HostedNetscapePluginStream.h"
295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginHostProxy.h"
315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginInstanceProxy.h"
325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebFrameInternal.h"
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "WebHostedNetscapePluginView.h"
345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitErrorsPrivate.h"
355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitPluginHost.h"
365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitSystemInterface.h"
37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "WebNSURLExtras.h"
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "WebNSURLRequestExtras.h"
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/DocumentLoader.h>
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/Frame.h>
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/FrameLoader.h>
426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#import <WebCore/ResourceLoadScheduler.h>
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/SecurityOrigin.h>
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/WebCoreURLResponse.h>
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <wtf/RefCountedLeakCounter.h>
465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace WebCore;
485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarknamespace WebKit {
505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic WTF::RefCountedLeakCounter hostedNetscapePluginStreamCounter("HostedNetscapePluginStream");
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
555ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkHostedNetscapePluginStream::HostedNetscapePluginStream(NetscapePluginInstanceProxy* instance, uint32_t streamID, NSURLRequest *request)
565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    : m_instance(instance)
575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_streamID(streamID)
585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_isTerminated(false)
595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_request(AdoptNS, [request mutableCopy])
605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_requestURL([request URL])
615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_frameLoader(0)
625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (SecurityOrigin::shouldHideReferrer([request URL], core([instance->pluginView() webFrame])->loader()->outgoingReferrer()))
645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [m_request.get() _web_setHTTPReferrer:nil];
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    hostedNetscapePluginStreamCounter.increment();
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochHostedNetscapePluginStream::HostedNetscapePluginStream(NetscapePluginInstanceProxy* instance, WebCore::FrameLoader* frameLoader)
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    : m_instance(instance)
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_streamID(1)
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_isTerminated(false)
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_frameLoader(frameLoader)
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    hostedNetscapePluginStreamCounter.increment();
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockHostedNetscapePluginStream::~HostedNetscapePluginStream()
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    hostedNetscapePluginStreamCounter.decrement();
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::startStreamWithResponse(NSURLResponse *response)
905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    didReceiveResponse(0, response);
925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::startStream(NSURL *responseURL, long long expectedContentLength, NSDate *lastModifiedDate, NSString *mimeType, NSData *headers)
955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_responseURL = responseURL;
975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_mimeType = mimeType;
985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    char* mimeTypeUTF8 = const_cast<char*>([mimeType UTF8String]);
1005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    int mimeTypeUTF8Length = mimeTypeUTF8 ? strlen (mimeTypeUTF8) + 1 : 0;
1015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    const char *url = [responseURL _web_URLCString];
1035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    int urlLength = url ? strlen(url) + 1 : 0;
1045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHStartStream(m_instance->hostProxy()->port(),
1065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                     m_instance->pluginID(),
1075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                     m_streamID,
1085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                     const_cast<char*>(url), urlLength,
1095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                     expectedContentLength,
1105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                     [lastModifiedDate timeIntervalSince1970],
1115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                     mimeTypeUTF8, mimeTypeUTF8Length,
1125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                     const_cast<char*>(reinterpret_cast<const char*>([headers bytes])), [headers length]);
1135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::didReceiveData(WebCore::NetscapePlugInStreamLoader*, const char* bytes, int length)
1165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHStreamDidReceiveData(m_instance->hostProxy()->port(),
1185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                              m_instance->pluginID(),
1195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                              m_streamID,
1205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                              const_cast<char*>(bytes), length);
1215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::didFinishLoading(WebCore::NetscapePlugInStreamLoader*)
1245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHStreamDidFinishLoading(m_instance->hostProxy()->port(),
1265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                m_instance->pluginID(),
1275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                m_streamID);
1285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_instance->disconnectStream(this);
1295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse& response)
1325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSURLResponse *r = response.nsURLResponse();
1345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSMutableData *theHeaders = nil;
1365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    long long expectedContentLength = [r expectedContentLength];
1375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if ([r isKindOfClass:[NSHTTPURLResponse class]]) {
1395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)r;
1405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        theHeaders = [NSMutableData dataWithCapacity:1024];
1415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // FIXME: it would be nice to be able to get the raw HTTP header block.
1435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // This includes the HTTP version, the real status text,
1445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // all headers in their original order and including duplicates,
1455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // and all original bytes verbatim, rather than sent through Unicode translation.
1465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // Unfortunately NSHTTPURLResponse doesn't provide access at that low a level.
1475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [theHeaders appendBytes:"HTTP " length:5];
1495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        char statusStr[10];
1505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        long statusCode = [httpResponse statusCode];
1515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        snprintf(statusStr, sizeof(statusStr), "%ld", statusCode);
1525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [theHeaders appendBytes:statusStr length:strlen(statusStr)];
1535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [theHeaders appendBytes:" OK\n" length:4];
1545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // HACK: pass the headers through as UTF-8.
1565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // This is not the intended behavior; we're supposed to pass original bytes verbatim.
1575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // But we don't have the original bytes, we have NSStrings built by the URL loading system.
1585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // It hopefully shouldn't matter, since RFC2616/RFC822 require ASCII-only headers,
1595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // but surely someone out there is using non-ASCII characters, and hopefully UTF-8 is adequate here.
1605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // It seems better than NSASCIIStringEncoding, which will lose information if non-ASCII is used.
1615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSDictionary *headerDict = [httpResponse allHeaderFields];
1635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSArray *keys = [[headerDict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
1645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSEnumerator *i = [keys objectEnumerator];
1655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSString *k;
1665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        while ((k = [i nextObject]) != nil) {
1675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            NSString *v = [headerDict objectForKey:k];
1685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            [theHeaders appendData:[k dataUsingEncoding:NSUTF8StringEncoding]];
1695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            [theHeaders appendBytes:": " length:2];
1705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            [theHeaders appendData:[v dataUsingEncoding:NSUTF8StringEncoding]];
1715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            [theHeaders appendBytes:"\n" length:1];
1725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
1735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // If the content is encoded (most likely compressed), then don't send its length to the plugin,
1755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // which is only interested in the decoded length, not yet known at the moment.
1765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // <rdar://problem/4470599> tracks a request for -[NSURLResponse expectedContentLength] to incorporate this logic.
1775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSString *contentEncoding = (NSString *)[[(NSHTTPURLResponse *)r allHeaderFields] objectForKey:@"Content-Encoding"];
1785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (contentEncoding && ![contentEncoding isEqualToString:@"identity"])
1795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            expectedContentLength = -1;
1805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [theHeaders appendBytes:"\0" length:1];
1825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
1835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    startStream([r URL], expectedContentLength, WKGetNSURLResponseLastModifiedDate(r), [r MIMEType], theHeaders);
1855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
187d0825bca7fe65beaee391d30da42e937db621564Steve BlockNPReason HostedNetscapePluginStream::reasonForError(NSError *error)
1885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!error)
1905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return NPRES_DONE;
1915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if ([[error domain] isEqualToString:NSURLErrorDomain] && [error code] == NSURLErrorCancelled)
1935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return NPRES_USER_BREAK;
1945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return NPRES_NETWORK_ERR;
1965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::didFail(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceError& error)
1995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
200563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (NetscapePluginHostProxy* hostProxy = m_instance->hostProxy())
201563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        _WKPHStreamDidFail(hostProxy->port(), m_instance->pluginID(), m_streamID, reasonForError(error));
202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_instance->disconnectStream(this);
2035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool HostedNetscapePluginStream::wantsAllStreams() const
2065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // FIXME: Implement.
2085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return false;
2095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::start()
2125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(m_request);
2145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(!m_frameLoader);
2155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(!m_loader);
2165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_loader = resourceLoadScheduler()->schedulePluginStreamLoad(core([m_instance->pluginView() webFrame]), this, m_request.get());
2185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::stop()
2215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(!m_frameLoader);
2235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!m_loader->isDone())
2255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        m_loader->cancel(m_loader->cancelledError());
2265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::cancelLoad(NPReason reason)
2295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    cancelLoad(errorForReason(reason));
2315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid HostedNetscapePluginStream::cancelLoad(NSError *error)
2345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (m_frameLoader) {
2365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        ASSERT(!m_loader);
2375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        DocumentLoader* documentLoader = m_frameLoader->activeDocumentLoader();
239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (documentLoader && documentLoader->isLoadingMainResource())
2405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            documentLoader->cancelMainResourceLoad(error);
2415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return;
2425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_loader->isDone()) {
245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // Cancelling the load will disconnect the stream so there's no need to do it explicitly.
2465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        m_loader->cancel(error);
247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else
248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_instance->disconnectStream(this);
249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2515ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkNSError *HostedNetscapePluginStream::pluginCancelledConnectionError() const
2525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return [[[NSError alloc] _initWithPluginErrorCode:WebKitErrorPlugInCancelledConnection
2545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                           contentURL:m_responseURL ? m_responseURL.get() : m_requestURL.get()
2555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                        pluginPageURL:nil
25606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                                           pluginName:[[m_instance->pluginView() pluginPackage] pluginInfo].name
2575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                             MIMEType:m_mimeType.get()] autorelease];
2585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2605ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkNSError *HostedNetscapePluginStream::errorForReason(NPReason reason) const
2615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (reason == NPRES_DONE)
2635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return nil;
2645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (reason == NPRES_USER_BREAK)
2665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return [NSError _webKitErrorWithDomain:NSURLErrorDomain
2675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          code:NSURLErrorCancelled
2685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                           URL:m_responseURL ? m_responseURL.get() : m_requestURL.get()];
2695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return pluginCancelledConnectionError();
2715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} // namespace WebKit
2745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
275e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API)
2765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
277