165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginView.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRuntimeUtilities.h" 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Plugin.h" 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "ShareableBitmap.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebEvent.h" 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPage.h" 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageProxyMessages.h" 352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "WebProcess.h" 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Chrome.h> 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/CookieJar.h> 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/DocumentLoader.h> 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Event.h> 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FocusController.h> 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FrameLoadRequest.h> 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FrameLoaderClient.h> 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/FrameView.h> 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/GraphicsContext.h> 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HTMLPlugInElement.h> 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/HostWindow.h> 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/NetscapePlugInStreamLoader.h> 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/NetworkingContext.h> 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/ProxyServer.h> 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/RenderEmbeddedObject.h> 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/RenderLayer.h> 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/ResourceLoadScheduler.h> 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/ScrollView.h> 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Settings.h> 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace JSC; 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore; 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass PluginView::URLRequest : public RefCounted<URLRequest> { 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic: 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static PassRefPtr<PluginView::URLRequest> create(uint64_t requestID, const FrameLoadRequest& request, bool allowPopups) 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return adoptRef(new URLRequest(requestID, request, allowPopups)); 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t requestID() const { return m_requestID; } 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const String& target() const { return m_request.frameName(); } 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const ResourceRequest & request() const { return m_request.resourceRequest(); } 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool allowPopups() const { return m_allowPopups; } 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate: 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch URLRequest(uint64_t requestID, const FrameLoadRequest& request, bool allowPopups) 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_requestID(requestID) 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_request(request) 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_allowPopups(allowPopups) 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t m_requestID; 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FrameLoadRequest m_request; 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool m_allowPopups; 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass PluginView::Stream : public RefCounted<PluginView::Stream>, NetscapePlugInStreamLoaderClient { 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic: 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static PassRefPtr<Stream> create(PluginView* pluginView, uint64_t streamID, const ResourceRequest& request) 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return adoptRef(new Stream(pluginView, streamID, request)); 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ~Stream(); 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void start(); 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void cancel(); 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t streamID() const { return m_streamID; } 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate: 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Stream(PluginView* pluginView, uint64_t streamID, const ResourceRequest& request) 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_pluginView(pluginView) 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_streamID(streamID) 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_request(request) 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_streamWasCancelled(false) 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // NetscapePluginStreamLoaderClient 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&); 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual void didReceiveData(NetscapePlugInStreamLoader*, const char*, int); 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual void didFail(NetscapePlugInStreamLoader*, const ResourceError&); 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual void didFinishLoading(NetscapePlugInStreamLoader*); 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PluginView* m_pluginView; 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t m_streamID; 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const ResourceRequest m_request; 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // True if the stream was explicitly cancelled by calling cancel(). 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // (As opposed to being cancelled by the user hitting the stop button for example. 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool m_streamWasCancelled; 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<NetscapePlugInStreamLoader> m_loader; 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginView::Stream::~Stream() 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_pluginView); 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::Stream::start() 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_loader); 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_pluginView->m_pluginElement->document()->frame(); 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(frame); 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_loader = resourceLoadScheduler()->schedulePluginStreamLoad(frame, this, m_request); 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::Stream::cancel() 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_loader); 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_streamWasCancelled = true; 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_loader->cancel(m_loader->cancelledError()); 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_loader = 0; 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic String buildHTTPHeaders(const ResourceResponse& response, long long& expectedContentLength) 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!response.isHTTP()) 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return String(); 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<UChar> stringBuilder; 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String separator(": "); 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String statusLine = String::format("HTTP %d ", response.httpStatusCode()); 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stringBuilder.append(statusLine.characters(), statusLine.length()); 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stringBuilder.append(response.httpStatusText().characters(), response.httpStatusText().length()); 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stringBuilder.append('\n'); 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch HTTPHeaderMap::const_iterator end = response.httpHeaderFields().end(); 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (HTTPHeaderMap::const_iterator it = response.httpHeaderFields().begin(); it != end; ++it) { 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stringBuilder.append(it->first.characters(), it->first.length()); 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stringBuilder.append(separator.characters(), separator.length()); 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stringBuilder.append(it->second.characters(), it->second.length()); 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stringBuilder.append('\n'); 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String headers = String::adopt(stringBuilder); 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If the content is encoded (most likely compressed), then don't send its length to the plugin, 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // which is only interested in the decoded length, not yet known at the moment. 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // <rdar://problem/4470599> tracks a request for -[NSURLResponse expectedContentLength] to incorporate this logic. 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String contentEncoding = response.httpHeaderField("Content-Encoding"); 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!contentEncoding.isNull() && contentEncoding != "identity") 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch expectedContentLength = -1; 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return headers; 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::Stream::didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse& response) 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Compute the stream related data from the resource response. 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const KURL& responseURL = response.url(); 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const String& mimeType = response.mimeType(); 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch long long expectedContentLength = response.expectedContentLength(); 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String headers = buildHTTPHeaders(response, expectedContentLength); 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint32_t streamLength = 0; 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (expectedContentLength > 0) 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch streamLength = expectedContentLength; 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView->m_plugin->streamDidReceiveResponse(m_streamID, responseURL, streamLength, response.lastModifiedDate(), mimeType, headers); 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::Stream::didReceiveData(NetscapePlugInStreamLoader*, const char* bytes, int length) 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView->m_plugin->streamDidReceiveData(m_streamID, bytes, length); 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::Stream::didFail(NetscapePlugInStreamLoader*, const ResourceError& error) 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Calling streamDidFail could cause us to be deleted, so we hold on to a reference here. 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Stream> protect(this); 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We only want to call streamDidFail if the stream was not explicitly cancelled by the plug-in. 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_streamWasCancelled) 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView->m_plugin->streamDidFail(m_streamID, error.isCancellation()); 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView->removeStream(this); 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView = 0; 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::Stream::didFinishLoading(NetscapePlugInStreamLoader*) 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Calling streamDidFinishLoading could cause us to be deleted, so we hold on to a reference here. 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Stream> protectStream(this); 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Protect the plug-in while we're calling into it. 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NPRuntimeObjectMap::PluginProtector pluginProtector(&m_pluginView->m_npRuntimeObjectMap); 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView->m_plugin->streamDidFinishLoading(m_streamID); 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView->removeStream(this); 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginView = 0; 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic inline WebPage* webPage(HTMLPlugInElement* pluginElement) 23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = pluginElement->document()->frame(); 23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(frame); 23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebPage* webPage = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame()->page(); 23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(webPage); 23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return webPage; 23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<PluginView> PluginView::create(PassRefPtr<HTMLPlugInElement> pluginElement, PassRefPtr<Plugin> plugin, const Plugin::Parameters& parameters) 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return adoptRef(new PluginView(pluginElement, plugin, parameters)); 24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginView::PluginView(PassRefPtr<HTMLPlugInElement> pluginElement, PassRefPtr<Plugin> plugin, const Plugin::Parameters& parameters) 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : PluginViewBase(0) 24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_pluginElement(pluginElement) 24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_plugin(plugin) 24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_webPage(webPage(m_pluginElement.get())) 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_parameters(parameters) 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_isInitialized(false) 25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_isWaitingUntilMediaCanStart(false) 25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_isBeingDestroyed(false) 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_pendingURLRequestsTimer(RunLoop::main(), this, &PluginView::pendingURLRequestsTimerFired) 25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_npRuntimeObjectMap(this) 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_manualStreamState(StreamStateInitial) 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_webPage->addPluginView(this); 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPluginView::~PluginView() 26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_webPage->removePluginView(this); 26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_isBeingDestroyed); 27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_isWaitingUntilMediaCanStart) 27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginElement->document()->removeMediaCanStartListener(this); 27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Cancel all pending frame loads. 27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FrameLoadMap::iterator end = m_pendingFrameLoads.end(); 27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (FrameLoadMap::iterator it = m_pendingFrameLoads.begin(), end = m_pendingFrameLoads.end(); it != end; ++it) 27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch it->first->setLoadListener(0); 27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_plugin && m_isInitialized) { 28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_isBeingDestroyed = true; 28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->destroy(); 28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_isBeingDestroyed = false; 28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Invalidate the object map. 28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_npRuntimeObjectMap.invalidate(); 28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch cancelAllStreams(); 2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Null out the plug-in element explicitly so we'll crash earlier if we try to use 2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // the plug-in view after it's been destroyed. 2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_pluginElement = nullptr; 29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochFrame* PluginView::frame() 29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_pluginElement->document()->frame(); 29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::manualLoadDidReceiveResponse(const ResourceResponse& response) 30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The plug-in can be null here if it failed to initialize. 30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin) 30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized) { 30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_manualStreamState == StreamStateInitial); 30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamState = StreamStateHasReceivedResponse; 30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamResponse = response; 31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Compute the stream related data from the resource response. 31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const KURL& responseURL = response.url(); 31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const String& mimeType = response.mimeType(); 31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch long long expectedContentLength = response.expectedContentLength(); 31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String headers = buildHTTPHeaders(response, expectedContentLength); 31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint32_t streamLength = 0; 32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (expectedContentLength > 0) 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch streamLength = expectedContentLength; 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->manualStreamDidReceiveResponse(responseURL, streamLength, response.lastModifiedDate(), mimeType, headers); 32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::manualLoadDidReceiveData(const char* bytes, int length) 32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The plug-in can be null here if it failed to initialize. 33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin) 33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized) { 33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_manualStreamState == StreamStateHasReceivedResponse); 33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_manualStreamData) 33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamData = SharedBuffer::create(); 33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamData->append(bytes, length); 33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->manualStreamDidReceiveData(bytes, length); 34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::manualLoadDidFinishLoading() 34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The plug-in can be null here if it failed to initialize. 34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin) 34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized) { 35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_manualStreamState == StreamStateHasReceivedResponse); 35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamState = StreamStateFinished; 35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->manualStreamDidFinishLoading(); 35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::manualLoadDidFail(const ResourceError& error) 36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The plug-in can be null here if it failed to initialize. 36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin) 36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized) { 36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamState = StreamStateFinished; 36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamError = error; 36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamData = nullptr; 37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->manualStreamDidFail(error.isCancellation()); 37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setWindowIsVisible(bool windowIsVisible) 37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin) 38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: Implement. 38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setWindowIsFocused(bool windowIsFocused) 38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin) 38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->windowFocusChanged(windowIsFocused); 39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::windowAndViewFramesChanged(const IntRect& windowFrameInScreenCoordinates, const IntRect& viewFrameInWindowCoordinates) 39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin) 39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->windowAndViewFramesChanged(windowFrameInScreenCoordinates, viewFrameInWindowCoordinates); 39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginView::sendComplexTextInput(uint64_t pluginComplexTextInputIdentifier, const String& textInput) 40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin) 40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_plugin->pluginComplexTextInputIdentifier() != pluginComplexTextInputIdentifier) 40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->sendComplexTextInput(textInput); 41065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::initializePlugin() 41665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_isInitialized) 41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin) { 42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We've already tried and failed to initialize the plug-in. 42265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 42365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (Frame* frame = m_pluginElement->document()->frame()) { 42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (Page* page = frame->page()) { 42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We shouldn't initialize the plug-in right now, add a listener. 42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!page->canStartMedia()) { 43065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_isWaitingUntilMediaCanStart) 43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_isWaitingUntilMediaCanStart = true; 43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginElement->document()->addMediaCanStartListener(this); 43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_plugin->initialize(this, m_parameters)) { 44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We failed to initialize the plug-in. 44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin = 0; 44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_isInitialized = true; 44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch viewGeometryDidChange(); 45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch redeliverManualStream(); 45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_plugin->pluginLayer()) { 45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (frame()) { 45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame()->view()->enterCompositingMode(); 45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pluginElement->setNeedsStyleRecalc(SyntheticStyleChange); 45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch windowAndViewFramesChanged(m_webPage->windowFrameInScreenCoordinates(), m_webPage->viewFrameInWindowCoordinates()); 46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch setWindowIsVisible(m_webPage->windowIsVisible()); 46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch setWindowIsFocused(m_webPage->windowIsFocused()); 46465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 46565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 46665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 46765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 46865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPlatformLayer* PluginView::platformLayer() const 46965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 47065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The plug-in can be null here if it failed to initialize. 47165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin) 47265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 47365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 47465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_plugin->pluginLayer(); 47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 47665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 47765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 47865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochJSObject* PluginView::scriptObject(JSGlobalObject* globalObject) 47965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 48065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The plug-in can be null here if it failed to initialize. 48165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin) 48265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 48365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 48465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NPObject* scriptableNPObject = m_plugin->pluginScriptableNPObject(); 48565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!scriptableNPObject) 48665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 48765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 48865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch JSObject* jsObject = m_npRuntimeObjectMap.getOrCreateJSObject(globalObject, scriptableNPObject); 48965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch releaseNPObject(scriptableNPObject); 49065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 49165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return jsObject; 49265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 49365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 49465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::privateBrowsingStateChanged(bool privateBrowsingEnabled) 49565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The plug-in can be null here if it failed to initialize. 49765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin) 49865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 49965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 50065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->privateBrowsingStateChanged(privateBrowsingEnabled); 50165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 50265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 50365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setFrameRect(const WebCore::IntRect& rect) 50465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 50565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Widget::setFrameRect(rect); 50665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch viewGeometryDidChange(); 50765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 50865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 50981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginView::setBoundsSize(const WebCore::IntSize& size) 51081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 51181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Widget::setBoundsSize(size); 51281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_boundsSize = size; 51381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch viewGeometryDidChange(); 51481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 51581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 51665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::paint(GraphicsContext* context, const IntRect& dirtyRect) 51765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 51865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (context->paintingDisabled() || !m_plugin || !m_isInitialized) 51965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 52165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect dirtyRectInWindowCoordinates = parent()->contentsToWindow(dirtyRect); 52265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect paintRectInWindowCoordinates = intersection(dirtyRectInWindowCoordinates, clipRectInWindowCoordinates()); 52365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (paintRectInWindowCoordinates.isEmpty()) 52465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 52565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 52681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_snapshot) 52781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_snapshot->paint(*context, frameRect().location(), m_snapshot->bounds()); 52881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch else { 52981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // The plugin is given a frame rect which is parent()->contentsToWindow(frameRect()), 53081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // and un-translates by the its origin when painting. The current CTM reflects 53181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // this widget's frame is its parent (the document), so we have to offset the CTM by 53281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // the document's window coordinates. 53381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch IntPoint documentOriginInWindowCoordinates = parent()->contentsToWindow(IntPoint()); 53481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch context->save(); 53581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch context->translate(-documentOriginInWindowCoordinates.x(), -documentOriginInWindowCoordinates.y()); 53681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_plugin->paint(context, paintRectInWindowCoordinates); 53781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch context->restore(); 53881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 53965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 54065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 54165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::frameRectsChanged() 54265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 54365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Widget::frameRectsChanged(); 54465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch viewGeometryDidChange(); 54565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 54665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 54765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setParent(ScrollView* scrollView) 54865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 54965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Widget::setParent(scrollView); 55065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 55165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (scrollView) 55265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch initializePlugin(); 55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::handleEvent(Event* event) 55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin) 55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const WebEvent* currentEvent = WebPage::currentEvent(); 56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!currentEvent) 56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool didHandleEvent = false; 56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ((event->type() == eventNames().mousemoveEvent && currentEvent->type() == WebEvent::MouseMove) 56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch || (event->type() == eventNames().mousedownEvent && currentEvent->type() == WebEvent::MouseDown) 56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch || (event->type() == eventNames().mouseupEvent && currentEvent->type() == WebEvent::MouseUp)) { 56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We have a mouse event. 57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (currentEvent->type() == WebEvent::MouseDown) 57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch focusPluginElement(); 57265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 57365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch didHandleEvent = m_plugin->handleMouseEvent(static_cast<const WebMouseEvent&>(*currentEvent)); 57465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else if (event->type() == eventNames().mousewheelEvent && currentEvent->type() == WebEvent::Wheel) { 57565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We have a wheel event. 57665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch didHandleEvent = m_plugin->handleWheelEvent(static_cast<const WebWheelEvent&>(*currentEvent)); 57765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else if (event->type() == eventNames().mouseoverEvent && currentEvent->type() == WebEvent::MouseMove) { 57865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We have a mouse enter event. 57965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch didHandleEvent = m_plugin->handleMouseEnterEvent(static_cast<const WebMouseEvent&>(*currentEvent)); 58065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else if (event->type() == eventNames().mouseoutEvent && currentEvent->type() == WebEvent::MouseMove) { 58165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We have a mouse leave event. 58265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch didHandleEvent = m_plugin->handleMouseLeaveEvent(static_cast<const WebMouseEvent&>(*currentEvent)); 58365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else if ((event->type() == eventNames().keydownEvent && currentEvent->type() == WebEvent::KeyDown) 58465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch || (event->type() == eventNames().keyupEvent && currentEvent->type() == WebEvent::KeyUp)) { 58565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We have a keyboard event. 58665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch didHandleEvent = m_plugin->handleKeyboardEvent(static_cast<const WebKeyboardEvent&>(*currentEvent)); 58765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 58865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 58965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (didHandleEvent) 59065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch event->setDefaultHandled(); 59165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 59281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 59381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginView::notifyWidget(WidgetNotification notification) 59481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 59581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch switch (notification) { 59681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch case WillPaintFlattened: 59781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_plugin && m_isInitialized) 59881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_snapshot = m_plugin->snapshot(); 59981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch break; 60081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch case DidPaintFlattened: 60181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_snapshot = nullptr; 60281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch break; 60381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 60481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 60581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 60665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::viewGeometryDidChange() 60765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 60865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin || !parent()) 60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 61065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 61165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Get the frame rect in window coordinates. 61265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect frameRectInWindowCoordinates = parent()->contentsToWindow(frameRect()); 61381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch frameRectInWindowCoordinates.setSize(m_boundsSize); 61465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->geometryDidChange(frameRectInWindowCoordinates, clipRectInWindowCoordinates()); 61565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 61665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 61765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochIntRect PluginView::clipRectInWindowCoordinates() const 61865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 61965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(parent()); 62065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 62165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Get the frame rect in window coordinates. 62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect frameRectInWindowCoordinates = parent()->contentsToWindow(frameRect()); 62381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch frameRectInWindowCoordinates.setSize(m_boundsSize); 62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Get the window clip rect for the enclosing layer (in window coordinates). 62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RenderLayer* layer = m_pluginElement->renderer()->enclosingLayer(); 62765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FrameView* parentView = m_pluginElement->document()->frame()->view(); 62865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect windowClipRect = parentView->windowClipRectForLayer(layer, true); 62965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 63065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Intersect the two rects to get the view clip rect in window coordinates. 63165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return intersection(frameRectInWindowCoordinates, windowClipRect); 63265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 63365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::focusPluginElement() 63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(frame()); 63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (Page* page = frame()->page()) 63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch page->focusController()->setFocusedFrame(frame()); 64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame()->document()->setFocusedNode(m_pluginElement); 64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::pendingURLRequestsTimerFired() 64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_pendingURLRequests.isEmpty()); 64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 64765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<URLRequest> urlRequest = m_pendingURLRequests.takeFirst(); 64865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 64965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If there are more requests to perform, reschedule the timer. 65065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_pendingURLRequests.isEmpty()) 65165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pendingURLRequestsTimer.startOneShot(0); 65265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch performURLRequest(urlRequest.get()); 65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 65565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::performURLRequest(URLRequest* request) 65765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // First, check if this is a javascript: url. 65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (protocolIsJavaScript(request->request().url())) { 66065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch performJavaScriptURLRequest(request); 66165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 66265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 66365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 66465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!request->target().isNull()) { 66565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch performFrameLoadURLRequest(request); 66665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 66765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 66865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 66965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // This request is to load a URL and create a stream. 67065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Stream> stream = PluginView::Stream::create(this, request->requestID(), request->request()); 67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch addStream(stream.get()); 67265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stream->start(); 67365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 67465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 67565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::performFrameLoadURLRequest(URLRequest* request) 67665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 67765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!request->target().isNull()); 67865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 67965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_pluginElement->document()->frame(); 68065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 68165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 68265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 68365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_pluginElement->document()->securityOrigin()->canDisplay(request->request().url())) { 68465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We can't load the request, send back a reply to the plug-in. 68565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->frameDidFail(request->requestID(), false); 68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 68765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 68865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 68965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // First, try to find a target frame. 69065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* targetFrame = frame->loader()->findFrameForNavigation(request->target()); 69165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!targetFrame) { 69265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We did not find a target frame. Ask our frame to load the page. This may or may not create a popup window. 69365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame->loader()->load(request->request(), request->target(), false); 69465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 69565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: We don't know whether the window was successfully created here so we just assume that it worked. 69665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // It's better than not telling the plug-in anything. 69765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->frameDidFinishLoading(request->requestID()); 69865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 69965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 70065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 70165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Now ask the frame to load the request. 70265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch targetFrame->loader()->load(request->request(), false); 70365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 70465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebFrame* targetWebFrame = static_cast<WebFrameLoaderClient*>(targetFrame->loader()->client())->webFrame(); 70565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (WebFrame::LoadListener* loadListener = targetWebFrame->loadListener()) { 70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Check if another plug-in view or even this view is waiting for the frame to load. 70765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If it is, tell it that the load was cancelled because it will be anyway. 70865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch loadListener->didFailLoad(targetWebFrame, true); 70965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pendingFrameLoads.set(targetWebFrame, request); 71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch targetWebFrame->setLoadListener(this); 71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::performJavaScriptURLRequest(URLRequest* request) 71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(protocolIsJavaScript(request->request().url())); 71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 71965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Frame> frame = m_pluginElement->document()->frame(); 72065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 72165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 72265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 72365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String jsString = decodeURLEscapeSequences(request->request().url().string().substring(sizeof("javascript:") - 1)); 72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!request->target().isNull()) { 72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // For security reasons, only allow JS requests to be made on the frame that contains the plug-in. 72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (frame->tree()->find(request->target()) != frame) { 72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Let the plug-in know that its frame load failed. 72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->frameDidFail(request->requestID(), false); 73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Evaluate the JavaScript code. Note that running JavaScript here could cause the plug-in to be destroyed, so we 73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // grab references to the plug-in here. 73665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Plugin> plugin = m_plugin; 73765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 73865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool oldAllowPopups = frame->script()->allowPopupsFromPlugin(); 73965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame->script()->setAllowPopupsFromPlugin(request->allowPopups()); 74065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 74181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ScriptValue result = frame->script()->executeScript(jsString); 74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 74365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frame->script()->setAllowPopupsFromPlugin(oldAllowPopups); 74465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 74565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Check if evaluating the JavaScript destroyed the plug-in. 74665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!plugin->controller()) 74765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 74981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ScriptState* scriptState = frame->script()->globalObject(pluginWorld())->globalExec(); 75065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String resultString; 75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.getString(scriptState, resultString); 75265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!request->target().isNull()) { 75465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Just send back whether the frame load succeeded or not. 75565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (resultString.isNull()) 75665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->frameDidFail(request->requestID(), false); 75765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch else 75865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->frameDidFinishLoading(request->requestID()); 75965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 76165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Send the result back to the plug-in. 76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch plugin->didEvaluateJavaScript(request->requestID(), decodeURLEscapeSequences(request->request().url()), resultString); 76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 76665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::addStream(Stream* stream) 76765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 76865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_streams.contains(stream->streamID())); 76965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_streams.set(stream->streamID(), stream); 77065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 77165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 77265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::removeStream(Stream* stream) 77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 77465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_streams.get(stream->streamID()) == stream); 77565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_streams.remove(stream->streamID()); 77765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 77865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::cancelAllStreams() 78065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 78165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<RefPtr<Stream> > streams; 78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch copyValuesToVector(m_streams, streams); 78365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 78465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < streams.size(); ++i) 78565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch streams[i]->cancel(); 78665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Cancelling a stream removes it from the m_streams map, so if we cancel all streams the map should be empty. 78865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_streams.isEmpty()); 78965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::redeliverManualStream() 79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_manualStreamState == StreamStateInitial) { 79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Nothing to do. 79565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 79665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 79765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_manualStreamState == StreamStateFailed) { 79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch manualLoadDidFail(m_manualStreamError); 80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Deliver the response. 80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch manualLoadDidReceiveResponse(m_manualStreamResponse); 80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Deliver the data. 80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_manualStreamData) { 80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const char* data; 80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch unsigned position = 0; 81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch while (unsigned length = m_manualStreamData->getSomeData(data, position)) { 81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch manualLoadDidReceiveData(data, length); 81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch position += length; 81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 81565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 81665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_manualStreamData = nullptr; 81765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 81965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (m_manualStreamState == StreamStateFinished) 82065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch manualLoadDidFinishLoading(); 82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 82265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::invalidateRect(const IntRect& dirtyRect) 82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!parent() || !m_plugin || !m_isInitialized) 82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8282bde8e466a4451c7319e3a072d118917957d6554Steve Block#if PLATFORM(MAC) 8292bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_plugin->pluginLayer()) 8302bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 8312bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 8322bde8e466a4451c7319e3a072d118917957d6554Steve Block 83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect dirtyRectInWindowCoordinates = convertToContainingWindow(dirtyRect); 83465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch parent()->hostWindow()->invalidateContentsAndWindow(intersection(dirtyRectInWindowCoordinates, clipRectInWindowCoordinates()), false); 83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 83865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setFocus(bool hasFocus) 83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Widget::setFocus(hasFocus); 84165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 84265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_isInitialized || !m_plugin) 84365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 84465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 84565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->setFocus(hasFocus); 84665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 84765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 84865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::mediaCanStart() 84965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 85065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_isWaitingUntilMediaCanStart); 85165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_isWaitingUntilMediaCanStart = false; 85265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 85365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch initializePlugin(); 85465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 85565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 85665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::invalidate(const IntRect& dirtyRect) 85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 85865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch invalidateRect(dirtyRect); 85965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 86165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochString PluginView::userAgent() 86265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 86365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame = m_pluginElement->document()->frame(); 86465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame) 86565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return String(); 86665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 86765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return frame->loader()->client()->userAgent(KURL()); 86865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 86965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 87065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, 87165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups) 87265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 87365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FrameLoadRequest frameLoadRequest(m_pluginElement->document()->securityOrigin()); 87465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frameLoadRequest.resourceRequest().setHTTPMethod(method); 87565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frameLoadRequest.resourceRequest().setURL(m_pluginElement->document()->completeURL(urlString)); 87665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frameLoadRequest.resourceRequest().addHTTPHeaderFields(headerFields); 87765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frameLoadRequest.resourceRequest().setHTTPBody(FormData::create(httpBody.data(), httpBody.size())); 87865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch frameLoadRequest.setFrameName(target); 87965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 88065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pendingURLRequests.append(URLRequest::create(requestID, frameLoadRequest, allowPopups)); 88165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_pendingURLRequestsTimer.startOneShot(0); 88265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 88365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 88465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::cancelStreamLoad(uint64_t streamID) 88565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 88665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Keep a reference to the stream. Stream::cancel might remove the stream from the map, and thus 88765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // releasing its last reference. 88865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<Stream> stream = m_streams.get(streamID).get(); 88965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!stream) 89065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 89165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 89265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Cancelling the stream here will remove it from the map. 89365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch stream->cancel(); 89465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_streams.contains(streamID)); 89565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 89665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 89765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::cancelManualStreamLoad() 89865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 89965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame()) 90065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 90165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 90265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DocumentLoader* documentLoader = frame()->loader()->activeDocumentLoader(); 90365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(documentLoader); 90465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 90565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (documentLoader->isLoadingMainResource()) 90665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch documentLoader->cancelMainResourceLoad(frame()->loader()->cancelledError(m_parameters.url)); 90765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 90865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 90965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObject* PluginView::windowScriptNPObject() 91065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 91165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame()) 91265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 91365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 91465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: Handle JavaScript being disabled. 91565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(frame()->script()->canExecuteScripts(NotAboutToExecuteScript)); 91665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 91781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return m_npRuntimeObjectMap.getOrCreateNPObject(*pluginWorld()->globalData(), frame()->script()->windowShell(pluginWorld())->window()); 91865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 91965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 92065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObject* PluginView::pluginElementNPObject() 92165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 92265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame()) 92365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 92465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 92565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: Handle JavaScript being disabled. 92665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch JSObject* object = frame()->script()->jsObjectForPluginElement(m_pluginElement.get()); 92765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(object); 92865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 92981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return m_npRuntimeObjectMap.getOrCreateNPObject(*pluginWorld()->globalData(), object); 93065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 93165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 93265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginView::evaluate(NPObject* npObject, const String& scriptString, NPVariant* result, bool allowPopups) 93365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 9342bde8e466a4451c7319e3a072d118917957d6554Steve Block RefPtr<Frame> frame = m_pluginElement->document()->frame(); 9352bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!frame) 93665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 93765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9382bde8e466a4451c7319e3a072d118917957d6554Steve Block bool oldAllowPopups = frame->script()->allowPopupsFromPlugin(); 9392bde8e466a4451c7319e3a072d118917957d6554Steve Block frame->script()->setAllowPopupsFromPlugin(allowPopups); 94065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Calling evaluate will run JavaScript that can potentially remove the plug-in element, so we need to 9422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // protect the plug-in view from destruction. 9432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NPRuntimeObjectMap::PluginProtector pluginProtector(&m_npRuntimeObjectMap); 9442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 94565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool returnValue = m_npRuntimeObjectMap.evaluate(npObject, scriptString, result); 94665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9472bde8e466a4451c7319e3a072d118917957d6554Steve Block frame->script()->setAllowPopupsFromPlugin(oldAllowPopups); 94865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 94965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return returnValue; 95065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 95165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 95265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setStatusbarText(const String& statusbarText) 95365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 95465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame()) 95565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 95665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 95765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Page* page = frame()->page(); 95865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!page) 95965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 96065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 96165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch page->chrome()->setStatusbarText(frame(), statusbarText); 96265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 96365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 96465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginView::isAcceleratedCompositingEnabled() 96565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 96665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame()) 96765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 96865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 96965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Settings* settings = frame()->settings(); 97065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!settings) 97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 97265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return settings->acceleratedCompositingEnabled(); 97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 97565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 97665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::pluginProcessCrashed() 97765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_pluginElement->renderer()) 97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 98065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 98165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: The renderer could also be a RenderApplet, we should handle that. 98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_pluginElement->renderer()->isEmbeddedObject()) 98365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 98465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 98565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RenderEmbeddedObject* renderer = toRenderEmbeddedObject(m_pluginElement->renderer()); 98665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch renderer->setShowsCrashedPluginIndicator(); 98765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 98865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch invalidateRect(frameRect()); 98965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 99065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 99165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(WIN) 99265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochHWND PluginView::nativeParentWindow() 99365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 99465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return m_webPage->nativeWindow(); 99565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 99665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 99765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 99865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 99965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setComplexTextInputEnabled(bool complexTextInputEnabled) 100065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 100165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_webPage->send(Messages::WebPageProxy::SetComplexTextInputEnabled(m_plugin->pluginComplexTextInputIdentifier(), complexTextInputEnabled)); 100265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 10032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10042fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockmach_port_t PluginView::compositingRenderServerPort() 10052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 10062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return WebProcess::shared().compositingRenderServerPort(); 10072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 10082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 100965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 101065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 101165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochString PluginView::proxiesForURL(const String& urlString) 101265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 101365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const FrameLoader* frameLoader = frame() ? frame()->loader() : 0; 101465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const NetworkingContext* context = frameLoader ? frameLoader->networkingContext() : 0; 101565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<ProxyServer> proxyServers = proxyServersForURL(KURL(KURL(), urlString), context); 101665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return toString(proxyServers); 101765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 101865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 101965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochString PluginView::cookiesForURL(const String& urlString) 102065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 102165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return cookies(m_pluginElement->document(), KURL(KURL(), urlString)); 102265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 102365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 102465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::setCookiesForURL(const String& urlString, const String& cookieString) 102565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 102665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch setCookies(m_pluginElement->document(), KURL(KURL(), urlString), cookieString); 102765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 102865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 102965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool PluginView::isPrivateBrowsingEnabled() 103065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 103165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If we can't get the real setting, we'll assume that private browsing is enabled. 103265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frame()) 103365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 103465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 103565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Settings* settings = frame()->settings(); 103665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!settings) 103765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 103865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 103965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return settings->privateBrowsingEnabled(); 104065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 104165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 104281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginView::protectPluginFromDestruction() 104381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 104481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_isBeingDestroyed) 104581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ref(); 104681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 104781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 104881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PluginView::unprotectPluginFromDestruction() 104981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 105081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_isBeingDestroyed) 105181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch deref(); 105281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 105381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 105465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::didFinishLoad(WebFrame* webFrame) 105565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 105665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<URLRequest> request = m_pendingFrameLoads.take(webFrame); 105765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(request); 105865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch webFrame->setLoadListener(0); 105965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 106065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->frameDidFinishLoading(request->requestID()); 106165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 106265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 106365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid PluginView::didFailLoad(WebFrame* webFrame, bool wasCancelled) 106465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 106565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<URLRequest> request = m_pendingFrameLoads.take(webFrame); 106665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(request); 106765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch webFrame->setLoadListener(0); 106865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 106965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_plugin->frameDidFail(request->requestID(), wasCancelled); 107065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 107165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 107265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 1073