Index: chrome/plugin/webplugin_delegate_stub.cc |
=================================================================== |
--- chrome/plugin/webplugin_delegate_stub.cc (revision 78372) |
+++ chrome/plugin/webplugin_delegate_stub.cc (working copy) |
@@ -1,451 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/plugin/webplugin_delegate_stub.h" |
- |
-#include "build/build_config.h" |
- |
-#include "base/command_line.h" |
-#include "chrome/plugin/npobject_stub.h" |
-#include "chrome/plugin/plugin_channel.h" |
-#include "chrome/plugin/plugin_thread.h" |
-#include "chrome/plugin/webplugin_proxy.h" |
-#include "content/common/content_client.h" |
-#include "content/common/content_switches.h" |
-#include "content/common/plugin_messages.h" |
-#include "third_party/npapi/bindings/npapi.h" |
-#include "third_party/npapi/bindings/npruntime.h" |
-#include "skia/ext/platform_device.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" |
-#include "webkit/plugins/npapi/webplugin_delegate_impl.h" |
-#include "webkit/glue/webcursor.h" |
- |
-#if defined(OS_WIN) |
-#include "base/scoped_ptr.h" |
-#include "printing/native_metafile_factory.h" |
-#include "printing/native_metafile.h" |
-#endif // defined(OS_WIN) |
- |
-using WebKit::WebBindings; |
-using WebKit::WebCursorInfo; |
-using webkit::npapi::WebPlugin; |
-using webkit::npapi::WebPluginResourceClient; |
- |
-class FinishDestructionTask : public Task { |
- public: |
- FinishDestructionTask(webkit::npapi::WebPluginDelegateImpl* delegate, |
- WebPlugin* webplugin) |
- : delegate_(delegate), webplugin_(webplugin) { |
- } |
- |
- void Run() { |
- // WebPlugin must outlive WebPluginDelegate. |
- if (delegate_) |
- delegate_->PluginDestroyed(); |
- |
- delete webplugin_; |
- } |
- |
- private: |
- webkit::npapi::WebPluginDelegateImpl* delegate_; |
- webkit::npapi::WebPlugin* webplugin_; |
-}; |
- |
-WebPluginDelegateStub::WebPluginDelegateStub( |
- const std::string& mime_type, int instance_id, PluginChannel* channel) : |
- mime_type_(mime_type), |
- instance_id_(instance_id), |
- channel_(channel), |
- delegate_(NULL), |
- webplugin_(NULL), |
- in_destructor_(false) { |
- DCHECK(channel); |
-} |
- |
-WebPluginDelegateStub::~WebPluginDelegateStub() { |
- in_destructor_ = true; |
- content::GetContentClient()->SetActiveURL(page_url_); |
- |
- if (channel_->in_send()) { |
- // The delegate or an npobject is in the callstack, so don't delete it |
- // right away. |
- MessageLoop::current()->PostNonNestableTask(FROM_HERE, |
- new FinishDestructionTask(delegate_, webplugin_)); |
- } else { |
- // Safe to delete right away. |
- if (delegate_) |
- delegate_->PluginDestroyed(); |
- |
- delete webplugin_; |
- } |
-} |
- |
-bool WebPluginDelegateStub::OnMessageReceived(const IPC::Message& msg) { |
- content::GetContentClient()->SetActiveURL(page_url_); |
- |
- // A plugin can execute a script to delete itself in any of its NPP methods. |
- // Hold an extra reference to ourself so that if this does occur and we're |
- // handling a sync message, we don't crash when attempting to send a reply. |
- // The exception to this is when we're already in the destructor. |
- if (!in_destructor_) |
- AddRef(); |
- |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(WebPluginDelegateStub, msg) |
- IPC_MESSAGE_HANDLER(PluginMsg_Init, OnInit) |
- IPC_MESSAGE_HANDLER(PluginMsg_WillSendRequest, OnWillSendRequest) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidReceiveResponse, OnDidReceiveResponse) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidReceiveData, OnDidReceiveData) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidFinishLoading, OnDidFinishLoading) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidFail, OnDidFail) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidFinishLoadWithReason, |
- OnDidFinishLoadWithReason) |
- IPC_MESSAGE_HANDLER(PluginMsg_SetFocus, OnSetFocus) |
- IPC_MESSAGE_HANDLER(PluginMsg_HandleInputEvent, OnHandleInputEvent) |
- IPC_MESSAGE_HANDLER(PluginMsg_Paint, OnPaint) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidPaint, OnDidPaint) |
- IPC_MESSAGE_HANDLER(PluginMsg_Print, OnPrint) |
- IPC_MESSAGE_HANDLER(PluginMsg_GetPluginScriptableObject, |
- OnGetPluginScriptableObject) |
- IPC_MESSAGE_HANDLER(PluginMsg_UpdateGeometry, OnUpdateGeometry) |
- IPC_MESSAGE_HANDLER(PluginMsg_UpdateGeometrySync, OnUpdateGeometry) |
- IPC_MESSAGE_HANDLER(PluginMsg_SendJavaScriptStream, |
- OnSendJavaScriptStream) |
- IPC_MESSAGE_HANDLER(PluginMsg_SetContentAreaFocus, OnSetContentAreaFocus) |
-#if defined(OS_MACOSX) |
- IPC_MESSAGE_HANDLER(PluginMsg_SetWindowFocus, OnSetWindowFocus) |
- IPC_MESSAGE_HANDLER(PluginMsg_ContainerHidden, OnContainerHidden) |
- IPC_MESSAGE_HANDLER(PluginMsg_ContainerShown, OnContainerShown) |
- IPC_MESSAGE_HANDLER(PluginMsg_WindowFrameChanged, OnWindowFrameChanged) |
- IPC_MESSAGE_HANDLER(PluginMsg_ImeCompositionCompleted, |
- OnImeCompositionCompleted) |
-#endif |
- IPC_MESSAGE_HANDLER(PluginMsg_DidReceiveManualResponse, |
- OnDidReceiveManualResponse) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidReceiveManualData, OnDidReceiveManualData) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidFinishManualLoading, |
- OnDidFinishManualLoading) |
- IPC_MESSAGE_HANDLER(PluginMsg_DidManualLoadFail, OnDidManualLoadFail) |
- IPC_MESSAGE_HANDLER(PluginMsg_InstallMissingPlugin, OnInstallMissingPlugin) |
- IPC_MESSAGE_HANDLER(PluginMsg_HandleURLRequestReply, |
- OnHandleURLRequestReply) |
- IPC_MESSAGE_HANDLER(PluginMsg_HTTPRangeRequestReply, |
- OnHTTPRangeRequestReply) |
-#if defined(OS_MACOSX) |
- IPC_MESSAGE_HANDLER(PluginMsg_SetFakeAcceleratedSurfaceWindowHandle, |
- OnSetFakeAcceleratedSurfaceWindowHandle) |
-#endif |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- |
- if (!in_destructor_) |
- Release(); |
- |
- DCHECK(handled); |
- return handled; |
-} |
- |
-bool WebPluginDelegateStub::Send(IPC::Message* msg) { |
- return channel_->Send(msg); |
-} |
- |
-void WebPluginDelegateStub::OnInit(const PluginMsg_Init_Params& params, |
- bool* result) { |
- page_url_ = params.page_url; |
- content::GetContentClient()->SetActiveURL(page_url_); |
- |
- *result = false; |
- if (params.arg_names.size() != params.arg_values.size()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
- FilePath path = |
- command_line.GetSwitchValuePath(switches::kPluginPath); |
- |
- gfx::PluginWindowHandle parent = gfx::kNullPluginWindow; |
-#if defined(OS_WIN) |
- parent = gfx::NativeViewFromId(params.containing_window); |
-#elif defined(OS_LINUX) |
- // This code is disabled, See issue 17110. |
- // The problem is that the XID can change at arbitrary times (e.g. when the |
- // tab is detached then reattached), so we need to be able to track these |
- // changes, and let the PluginInstance know. |
- // PluginThread::current()->Send(new PluginProcessHostMsg_MapNativeViewId( |
- // params.containing_window, &parent)); |
-#endif |
- |
- webplugin_ = new WebPluginProxy( |
- channel_, instance_id_, page_url_, params.containing_window, |
- params.host_render_view_routing_id); |
- delegate_ = webkit::npapi::WebPluginDelegateImpl::Create( |
- path, mime_type_, parent); |
- if (delegate_) { |
- webplugin_->set_delegate(delegate_); |
- *result = delegate_->Initialize(params.url, |
- params.arg_names, |
- params.arg_values, |
- webplugin_, |
- params.load_manually); |
- } |
-} |
- |
-void WebPluginDelegateStub::OnWillSendRequest(int id, const GURL& url, |
- int http_status_code) { |
- WebPluginResourceClient* client = webplugin_->GetResourceClient(id); |
- if (!client) |
- return; |
- |
- client->WillSendRequest(url, http_status_code); |
-} |
- |
-void WebPluginDelegateStub::OnDidReceiveResponse( |
- const PluginMsg_DidReceiveResponseParams& params) { |
- WebPluginResourceClient* client = webplugin_->GetResourceClient(params.id); |
- if (!client) |
- return; |
- |
- client->DidReceiveResponse(params.mime_type, |
- params.headers, |
- params.expected_length, |
- params.last_modified, |
- params.request_is_seekable); |
-} |
- |
-void WebPluginDelegateStub::OnDidReceiveData(int id, |
- const std::vector<char>& buffer, |
- int data_offset) { |
- WebPluginResourceClient* client = webplugin_->GetResourceClient(id); |
- if (!client) |
- return; |
- |
- client->DidReceiveData(&buffer.front(), static_cast<int>(buffer.size()), |
- data_offset); |
-} |
- |
-void WebPluginDelegateStub::OnDidFinishLoading(int id) { |
- WebPluginResourceClient* client = webplugin_->GetResourceClient(id); |
- if (!client) |
- return; |
- |
- client->DidFinishLoading(); |
-} |
- |
-void WebPluginDelegateStub::OnDidFail(int id) { |
- WebPluginResourceClient* client = webplugin_->GetResourceClient(id); |
- if (!client) |
- return; |
- |
- client->DidFail(); |
-} |
- |
-void WebPluginDelegateStub::OnDidFinishLoadWithReason( |
- const GURL& url, int reason, int notify_id) { |
- delegate_->DidFinishLoadWithReason(url, reason, notify_id); |
-} |
- |
-void WebPluginDelegateStub::OnSetFocus(bool focused) { |
- delegate_->SetFocus(focused); |
-} |
- |
-void WebPluginDelegateStub::OnHandleInputEvent( |
- const WebKit::WebInputEvent *event, |
- bool* handled, |
- WebCursor* cursor) { |
- WebCursorInfo cursor_info; |
- *handled = delegate_->HandleInputEvent(*event, &cursor_info); |
- cursor->InitFromCursorInfo(cursor_info); |
-} |
- |
-void WebPluginDelegateStub::OnPaint(const gfx::Rect& damaged_rect) { |
- webplugin_->Paint(damaged_rect); |
-} |
- |
-void WebPluginDelegateStub::OnDidPaint() { |
- webplugin_->DidPaint(); |
-} |
- |
-void WebPluginDelegateStub::OnPrint(base::SharedMemoryHandle* shared_memory, |
- uint32* size) { |
-#if defined(OS_WIN) |
- scoped_ptr<printing::NativeMetafile> metafile( |
- printing::NativeMetafileFactory::CreateMetafile()); |
- if (!metafile->CreateDc(NULL, NULL)) { |
- NOTREACHED(); |
- return; |
- } |
- HDC hdc = metafile->context(); |
- skia::PlatformDevice::InitializeDC(hdc); |
- delegate_->Print(hdc); |
- if (!metafile->Close()) { |
- NOTREACHED(); |
- return; |
- } |
- |
- *size = metafile->GetDataSize(); |
- DCHECK(*size); |
- base::SharedMemory shared_buf; |
- CreateSharedBuffer(*size, &shared_buf, shared_memory); |
- |
- // Retrieve a copy of the data. |
- bool success = metafile->GetData(shared_buf.memory(), *size); |
- DCHECK(success); |
-#else |
- // TODO(port): plugin printing. |
- NOTIMPLEMENTED(); |
-#endif |
-} |
- |
-void WebPluginDelegateStub::OnUpdateGeometry( |
- const PluginMsg_UpdateGeometry_Param& param) { |
- webplugin_->UpdateGeometry( |
- param.window_rect, param.clip_rect, |
- param.windowless_buffer, param.background_buffer, |
- param.transparent |
-#if defined(OS_MACOSX) |
- , |
- param.ack_key |
-#endif |
- ); |
-} |
- |
-void WebPluginDelegateStub::OnGetPluginScriptableObject(int* route_id) { |
- NPObject* object = delegate_->GetPluginScriptableObject(); |
- if (!object) { |
- *route_id = MSG_ROUTING_NONE; |
- return; |
- } |
- |
- *route_id = channel_->GenerateRouteID(); |
- // The stub will delete itself when the proxy tells it that it's released, or |
- // otherwise when the channel is closed. |
- new NPObjectStub( |
- object, channel_.get(), *route_id, webplugin_->containing_window(), |
- page_url_); |
- |
- // Release ref added by GetPluginScriptableObject (our stub holds its own). |
- WebBindings::releaseObject(object); |
-} |
- |
-void WebPluginDelegateStub::OnSendJavaScriptStream(const GURL& url, |
- const std::string& result, |
- bool success, |
- int notify_id) { |
- delegate_->SendJavaScriptStream(url, result, success, notify_id); |
-} |
- |
-void WebPluginDelegateStub::OnSetContentAreaFocus(bool has_focus) { |
- if (delegate_) |
- delegate_->SetContentAreaHasFocus(has_focus); |
-} |
- |
-#if defined(OS_MACOSX) |
-void WebPluginDelegateStub::OnSetWindowFocus(bool has_focus) { |
- if (delegate_) |
- delegate_->SetWindowHasFocus(has_focus); |
-} |
- |
-void WebPluginDelegateStub::OnContainerHidden() { |
- if (delegate_) |
- delegate_->SetContainerVisibility(false); |
-} |
- |
-void WebPluginDelegateStub::OnContainerShown(gfx::Rect window_frame, |
- gfx::Rect view_frame, |
- bool has_focus) { |
- if (delegate_) { |
- delegate_->WindowFrameChanged(window_frame, view_frame); |
- delegate_->SetContainerVisibility(true); |
- delegate_->SetWindowHasFocus(has_focus); |
- } |
-} |
- |
-void WebPluginDelegateStub::OnWindowFrameChanged(const gfx::Rect& window_frame, |
- const gfx::Rect& view_frame) { |
- if (delegate_) |
- delegate_->WindowFrameChanged(window_frame, view_frame); |
-} |
- |
-void WebPluginDelegateStub::OnImeCompositionCompleted(const string16& text) { |
- if (delegate_) |
- delegate_->ImeCompositionCompleted(text); |
-} |
-#endif // OS_MACOSX |
- |
-void WebPluginDelegateStub::OnDidReceiveManualResponse( |
- const GURL& url, |
- const PluginMsg_DidReceiveResponseParams& params) { |
- delegate_->DidReceiveManualResponse(url, params.mime_type, params.headers, |
- params.expected_length, |
- params.last_modified); |
-} |
- |
-void WebPluginDelegateStub::OnDidReceiveManualData( |
- const std::vector<char>& buffer) { |
- delegate_->DidReceiveManualData(&buffer.front(), |
- static_cast<int>(buffer.size())); |
-} |
- |
-void WebPluginDelegateStub::OnDidFinishManualLoading() { |
- delegate_->DidFinishManualLoading(); |
-} |
- |
-void WebPluginDelegateStub::OnDidManualLoadFail() { |
- delegate_->DidManualLoadFail(); |
-} |
- |
-void WebPluginDelegateStub::OnInstallMissingPlugin() { |
- delegate_->InstallMissingPlugin(); |
-} |
- |
-void WebPluginDelegateStub::CreateSharedBuffer( |
- uint32 size, |
- base::SharedMemory* shared_buf, |
- base::SharedMemoryHandle* remote_handle) { |
- if (!shared_buf->CreateAndMapAnonymous(size)) { |
- NOTREACHED(); |
- shared_buf->Close(); |
- return; |
- } |
- |
-#if defined(OS_WIN) |
- BOOL result = DuplicateHandle(GetCurrentProcess(), |
- shared_buf->handle(), |
- channel_->renderer_handle(), |
- remote_handle, 0, FALSE, |
- DUPLICATE_SAME_ACCESS); |
- DCHECK_NE(result, 0); |
- |
- // If the calling function's shared_buf is on the stack, its destructor will |
- // close the shared memory buffer handle. This is fine since we already |
- // duplicated the handle to the renderer process so it will stay "alive". |
-#else |
- // TODO(port): this should use TransportDIB. |
- NOTIMPLEMENTED(); |
-#endif |
-} |
- |
-void WebPluginDelegateStub::OnHandleURLRequestReply( |
- unsigned long resource_id, const GURL& url, int notify_id) { |
- WebPluginResourceClient* resource_client = |
- delegate_->CreateResourceClient(resource_id, url, notify_id); |
- webplugin_->OnResourceCreated(resource_id, resource_client); |
-} |
- |
-void WebPluginDelegateStub::OnHTTPRangeRequestReply( |
- unsigned long resource_id, int range_request_id) { |
- WebPluginResourceClient* resource_client = |
- delegate_->CreateSeekableResourceClient(resource_id, range_request_id); |
- webplugin_->OnResourceCreated(resource_id, resource_client); |
-} |
- |
-#if defined(OS_MACOSX) |
-void WebPluginDelegateStub::OnSetFakeAcceleratedSurfaceWindowHandle( |
- gfx::PluginWindowHandle window) { |
- delegate_->set_windowed_handle(window); |
-} |
-#endif |
- |