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