⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hostednetscapepluginstream.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
字号:
/* * Copyright (C) 2008 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#if USE(PLUGIN_HOST_PROCESS)#import "HostedNetscapePluginStream.h"#import "NetscapePluginHostProxy.h"#import "NetscapePluginInstanceProxy.h"#import <WebCore/DocumentLoader.h>#import <WebCore/Frame.h>#import <WebCore/FrameLoader.h>#import "WebHostedNetscapePluginView.h"#import "WebFrameInternal.h"#import "WebKitErrorsPrivate.h"#import "WebNSURLExtras.h"#import "WebNSURLRequestExtras.h"#import "WebKitPluginHost.h"#import "WebKitSystemInterface.h"using namespace WebCore;namespace WebKit {HostedNetscapePluginStream::HostedNetscapePluginStream(NetscapePluginInstanceProxy* instance, uint32_t streamID, NSURLRequest *request)    : m_instance(instance)    , m_streamID(streamID)    , m_isTerminated(false)    , m_request(AdoptNS, [request mutableCopy])    , m_requestURL([request URL])    , m_frameLoader(0){    if (core([instance->pluginView() webFrame])->loader()->shouldHideReferrer([request URL], core([instance->pluginView() webFrame])->loader()->outgoingReferrer()))        [m_request.get() _web_setHTTPReferrer:nil];}void HostedNetscapePluginStream::startStreamWithResponse(NSURLResponse *response){    didReceiveResponse(0, response);}    void HostedNetscapePluginStream::startStream(NSURL *responseURL, long long expectedContentLength, NSDate *lastModifiedDate, NSString *mimeType, NSData *headers){    m_responseURL = responseURL;    m_mimeType = mimeType;    char* mimeTypeUTF8 = const_cast<char*>([mimeType UTF8String]);    int mimeTypeUTF8Length = mimeTypeUTF8 ? strlen (mimeTypeUTF8) + 1 : 0;        const char *url = [responseURL _web_URLCString];    int urlLength = url ? strlen(url) + 1 : 0;        _WKPHStartStream(m_instance->hostProxy()->port(),                     m_instance->pluginID(),                     m_streamID,                     const_cast<char*>(url), urlLength,                     expectedContentLength,                     [lastModifiedDate timeIntervalSince1970],                     mimeTypeUTF8, mimeTypeUTF8Length,                     const_cast<char*>(reinterpret_cast<const char*>([headers bytes])), [headers length]);}                     void HostedNetscapePluginStream::didReceiveData(WebCore::NetscapePlugInStreamLoader*, const char* bytes, int length){    _WKPHStreamDidReceiveData(m_instance->hostProxy()->port(),                              m_instance->pluginID(),                              m_streamID,                              const_cast<char*>(bytes), length);}    void HostedNetscapePluginStream::didFinishLoading(WebCore::NetscapePlugInStreamLoader*){    _WKPHStreamDidFinishLoading(m_instance->hostProxy()->port(),                                m_instance->pluginID(),                                m_streamID);    m_instance->disconnectStream(this);}    void HostedNetscapePluginStream::didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse& response){    NSURLResponse *r = response.nsURLResponse();        NSMutableData *theHeaders = nil;    long long expectedContentLength = [r expectedContentLength];        if ([r isKindOfClass:[NSHTTPURLResponse class]]) {        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)r;        theHeaders = [NSMutableData dataWithCapacity:1024];                // FIXME: it would be nice to be able to get the raw HTTP header block.        // This includes the HTTP version, the real status text,        // all headers in their original order and including duplicates,        // and all original bytes verbatim, rather than sent through Unicode translation.        // Unfortunately NSHTTPURLResponse doesn't provide access at that low a level.                [theHeaders appendBytes:"HTTP " length:5];        char statusStr[10];        long statusCode = [httpResponse statusCode];        snprintf(statusStr, sizeof(statusStr), "%ld", statusCode);        [theHeaders appendBytes:statusStr length:strlen(statusStr)];        [theHeaders appendBytes:" OK\n" length:4];                // HACK: pass the headers through as UTF-8.        // This is not the intended behavior; we're supposed to pass original bytes verbatim.        // But we don't have the original bytes, we have NSStrings built by the URL loading system.        // It hopefully shouldn't matter, since RFC2616/RFC822 require ASCII-only headers,        // but surely someone out there is using non-ASCII characters, and hopefully UTF-8 is adequate here.        // It seems better than NSASCIIStringEncoding, which will lose information if non-ASCII is used.                NSDictionary *headerDict = [httpResponse allHeaderFields];        NSArray *keys = [[headerDict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];        NSEnumerator *i = [keys objectEnumerator];        NSString *k;        while ((k = [i nextObject]) != nil) {            NSString *v = [headerDict objectForKey:k];            [theHeaders appendData:[k dataUsingEncoding:NSUTF8StringEncoding]];            [theHeaders appendBytes:": " length:2];            [theHeaders appendData:[v dataUsingEncoding:NSUTF8StringEncoding]];            [theHeaders appendBytes:"\n" length:1];        }                // If the content is encoded (most likely compressed), then don't send its length to the plugin,        // which is only interested in the decoded length, not yet known at the moment.        // <rdar://problem/4470599> tracks a request for -[NSURLResponse expectedContentLength] to incorporate this logic.        NSString *contentEncoding = (NSString *)[[(NSHTTPURLResponse *)r allHeaderFields] objectForKey:@"Content-Encoding"];        if (contentEncoding && ![contentEncoding isEqualToString:@"identity"])            expectedContentLength = -1;        [theHeaders appendBytes:"\0" length:1];    }        startStream([r URL], expectedContentLength, WKGetNSURLResponseLastModifiedDate(r), [r MIMEType], theHeaders);}static NPReason reasonForError(NSError *error){    if (!error)        return NPRES_DONE;    if ([[error domain] isEqualToString:NSURLErrorDomain] && [error code] == NSURLErrorCancelled)        return NPRES_USER_BREAK;    return NPRES_NETWORK_ERR;}void HostedNetscapePluginStream::didFail(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceError& error){    if (NetscapePluginHostProxy* hostProxy = m_instance->hostProxy())        _WKPHStreamDidFail(hostProxy->port(), m_instance->pluginID(), m_streamID, reasonForError(error));}    bool HostedNetscapePluginStream::wantsAllStreams() const{    // FIXME: Implement.    return false;}void HostedNetscapePluginStream::start(){    ASSERT(m_request);    ASSERT(!m_frameLoader);    ASSERT(!m_loader);        m_loader = NetscapePlugInStreamLoader::create(core([m_instance->pluginView() webFrame]), this);    m_loader->setShouldBufferData(false);        m_loader->documentLoader()->addPlugInStreamLoader(m_loader.get());    m_loader->load(m_request.get());}void HostedNetscapePluginStream::stop(){    ASSERT(!m_frameLoader);        if (!m_loader->isDone())        m_loader->cancel(m_loader->cancelledError());}    void HostedNetscapePluginStream::cancelLoad(NPReason reason){    cancelLoad(errorForReason(reason));}void HostedNetscapePluginStream::cancelLoad(NSError *error){    if (m_frameLoader) {        ASSERT(!m_loader);                DocumentLoader* documentLoader = m_frameLoader->activeDocumentLoader();        ASSERT(documentLoader);                if (documentLoader->isLoadingMainResource())            documentLoader->cancelMainResourceLoad(error);        return;    }        if (!m_loader->isDone())        m_loader->cancel(error);    m_instance->disconnectStream(this);}        NSError *HostedNetscapePluginStream::pluginCancelledConnectionError() const{    return [[[NSError alloc] _initWithPluginErrorCode:WebKitErrorPlugInCancelledConnection                                           contentURL:m_responseURL ? m_responseURL.get() : m_requestURL.get()                                        pluginPageURL:nil                                           pluginName:[[m_instance->pluginView() pluginPackage] name]                                             MIMEType:m_mimeType.get()] autorelease];}NSError *HostedNetscapePluginStream::errorForReason(NPReason reason) const{    if (reason == NPRES_DONE)        return nil;    if (reason == NPRES_USER_BREAK)        return [NSError _webKitErrorWithDomain:NSURLErrorDomain                                          code:NSURLErrorCancelled                                            URL:m_responseURL ? m_responseURL.get() : m_requestURL.get()];    return pluginCancelledConnectionError();}} // namespace WebKit#endif // USE(PLUGIN_HOST_PROCESS)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -