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