Pepper/Flapper: Implement proxy for clipboard stuff.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/6650029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@77491 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ppapi/ppapi_shared_proxy.gypi b/ppapi/ppapi_shared_proxy.gypi
index c4ff61c..0c8b1ce0 100644
--- a/ppapi/ppapi_shared_proxy.gypi
+++ b/ppapi/ppapi_shared_proxy.gypi
@@ -91,6 +91,8 @@
'proxy/ppb_file_ref_proxy.h',
'proxy/ppb_file_system_proxy.cc',
'proxy/ppb_file_system_proxy.h',
+ 'proxy/ppb_flash_clipboard_proxy.cc',
+ 'proxy/ppb_flash_clipboard_proxy.h',
'proxy/ppb_flash_file_proxy.cc',
'proxy/ppb_flash_file_proxy.h',
'proxy/ppb_flash_proxy.cc',
diff --git a/ppapi/proxy/dispatcher.cc b/ppapi/proxy/dispatcher.cc
index 2051588..dd4167c 100644
--- a/ppapi/proxy/dispatcher.cc
+++ b/ppapi/proxy/dispatcher.cc
@@ -37,6 +37,7 @@
#include "ppapi/c/ppb_url_response_info.h"
#include "ppapi/c/ppp_instance.h"
#include "ppapi/c/private/ppb_flash.h"
+#include "ppapi/c/private/ppb_flash_clipboard.h"
#include "ppapi/c/private/ppb_flash_file.h"
#include "ppapi/c/private/ppb_flash_menu.h"
#include "ppapi/c/private/ppb_pdf.h"
@@ -52,6 +53,7 @@
#include "ppapi/proxy/ppb_file_chooser_proxy.h"
#include "ppapi/proxy/ppb_file_ref_proxy.h"
#include "ppapi/proxy/ppb_file_system_proxy.h"
+#include "ppapi/proxy/ppb_flash_clipboard_proxy.h"
#include "ppapi/proxy/ppb_flash_file_proxy.h"
#include "ppapi/proxy/ppb_flash_proxy.h"
#include "ppapi/proxy/ppb_flash_menu_proxy.h"
@@ -109,6 +111,7 @@
AddPPB(PPB_FileChooser_Proxy::GetInfo());
AddPPB(PPB_FileRef_Proxy::GetInfo());
AddPPB(PPB_FileSystem_Proxy::GetInfo());
+ AddPPB(PPB_Flash_Clipboard_Proxy::GetInfo());
AddPPB(PPB_Flash_File_FileRef_Proxy::GetInfo());
AddPPB(PPB_Flash_File_ModuleLocal_Proxy::GetInfo());
AddPPB(PPB_Flash_Proxy::GetInfo());
diff --git a/ppapi/proxy/interface_id.h b/ppapi/proxy/interface_id.h
index 191f990..5cf4ac3 100644
--- a/ppapi/proxy/interface_id.h
+++ b/ppapi/proxy/interface_id.h
@@ -24,6 +24,7 @@
INTERFACE_ID_PPB_FILE_REF,
INTERFACE_ID_PPB_FILE_SYSTEM,
INTERFACE_ID_PPB_FLASH,
+ INTERFACE_ID_PPB_FLASH_CLIPBOARD,
INTERFACE_ID_PPB_FLASH_FILE_FILEREF,
INTERFACE_ID_PPB_FLASH_FILE_MODULELOCAL,
INTERFACE_ID_PPB_FLASH_MENU,
diff --git a/ppapi/proxy/ppapi_messages_internal.h b/ppapi/proxy/ppapi_messages_internal.h
index 129502a6..e37f65b 100644
--- a/ppapi/proxy/ppapi_messages_internal.h
+++ b/ppapi/proxy/ppapi_messages_internal.h
@@ -356,6 +356,16 @@
IPC_SYNC_MESSAGE_ROUTED1_0(PpapiHostMsg_PPBFlash_QuitMessageLoop,
PP_Instance /* instance */)
+// PPB_Flash_Clipboard.
+IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBFlashClipboard_ReadPlainText,
+ PP_Instance /* instance */,
+ int /* clipboard_type */,
+ pp::proxy::SerializedVar /* result */)
+IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBFlashClipboard_WritePlainText,
+ PP_Instance /* instance */,
+ int /* clipboard_type */,
+ pp::proxy::SerializedVar /* text */)
+
// PPB_Flash_File_FileRef.
IPC_SYNC_MESSAGE_ROUTED2_2(PpapiHostMsg_PPBFlashFile_FileRef_OpenFile,
pp::proxy::HostResource /* file_ref */,
diff --git a/ppapi/proxy/ppb_flash_clipboard_proxy.cc b/ppapi/proxy/ppb_flash_clipboard_proxy.cc
new file mode 100644
index 0000000..a849071
--- /dev/null
+++ b/ppapi/proxy/ppb_flash_clipboard_proxy.cc
@@ -0,0 +1,125 @@
+// 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 "ppapi/proxy/ppb_flash_clipboard_proxy.h"
+
+#include "ppapi/c/pp_errors.h"
+#include "ppapi/c/private/ppb_flash_clipboard.h"
+#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/proxy/serialized_var.h"
+
+namespace pp {
+namespace proxy {
+
+namespace {
+
+bool IsValidClipboardType(PP_Flash_Clipboard_Type clipboard_type) {
+ return clipboard_type == PP_FLASH_CLIPBOARD_TYPE_STANDARD ||
+ clipboard_type == PP_FLASH_CLIPBOARD_TYPE_SELECTION ||
+ clipboard_type == PP_FLASH_CLIPBOARD_TYPE_DRAG;
+}
+
+PP_Var ReadPlainText(PP_Instance instance_id,
+ PP_Flash_Clipboard_Type clipboard_type) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
+ if (!dispatcher)
+ return PP_MakeUndefined();
+
+ if (!IsValidClipboardType(clipboard_type))
+ return PP_MakeUndefined();
+
+ ReceiveSerializedVarReturnValue result;
+ dispatcher->Send(new PpapiHostMsg_PPBFlashClipboard_ReadPlainText(
+ INTERFACE_ID_PPB_FLASH_CLIPBOARD, instance_id,
+ static_cast<int>(clipboard_type), &result));
+ return result.Return(dispatcher);
+}
+
+int32_t WritePlainText(PP_Instance instance_id,
+ PP_Flash_Clipboard_Type clipboard_type,
+ PP_Var text) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
+ if (!dispatcher)
+ return PP_ERROR_BADARGUMENT;
+
+ if (!IsValidClipboardType(clipboard_type))
+ return PP_ERROR_BADARGUMENT;
+
+ dispatcher->Send(new PpapiHostMsg_PPBFlashClipboard_WritePlainText(
+ INTERFACE_ID_PPB_FLASH_CLIPBOARD,
+ instance_id,
+ static_cast<int>(clipboard_type),
+ SerializedVarSendInput(dispatcher, text)));
+ // Assume success, since it allows us to avoid a sync IPC.
+ return PP_OK;
+}
+
+const PPB_Flash_Clipboard flash_clipboard_interface = {
+ &ReadPlainText,
+ &WritePlainText
+};
+
+InterfaceProxy* CreateFlashClipboardProxy(Dispatcher* dispatcher,
+ const void* target_interface) {
+ return new PPB_Flash_Clipboard_Proxy(dispatcher, target_interface);
+}
+
+} // namespace
+
+PPB_Flash_Clipboard_Proxy::PPB_Flash_Clipboard_Proxy(
+ Dispatcher* dispatcher, const void* target_interface)
+ : InterfaceProxy(dispatcher, target_interface) {
+}
+
+PPB_Flash_Clipboard_Proxy::~PPB_Flash_Clipboard_Proxy() {
+}
+
+// static
+const InterfaceProxy::Info* PPB_Flash_Clipboard_Proxy::GetInfo() {
+ static const Info info = {
+ &flash_clipboard_interface,
+ PPB_FLASH_CLIPBOARD_INTERFACE,
+ INTERFACE_ID_PPB_FLASH_CLIPBOARD,
+ false,
+ &CreateFlashClipboardProxy
+ };
+ return &info;
+}
+
+bool PPB_Flash_Clipboard_Proxy::OnMessageReceived(const IPC::Message& msg) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(PPB_Flash_Clipboard_Proxy, msg)
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashClipboard_ReadPlainText,
+ OnMsgReadPlainText)
+ IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashClipboard_WritePlainText,
+ OnMsgWritePlainText)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+void PPB_Flash_Clipboard_Proxy::OnMsgReadPlainText(
+ PP_Instance instance_id,
+ int clipboard_type,
+ SerializedVarReturnValue result) {
+ result.Return(dispatcher(),
+ ppb_flash_clipboard_target()->ReadPlainText(
+ instance_id,
+ static_cast<PP_Flash_Clipboard_Type>(clipboard_type)));
+}
+
+void PPB_Flash_Clipboard_Proxy::OnMsgWritePlainText(
+ PP_Instance instance_id,
+ int clipboard_type,
+ SerializedVarReceiveInput text) {
+ int32_t result = ppb_flash_clipboard_target()->WritePlainText(
+ instance_id,
+ static_cast<PP_Flash_Clipboard_Type>(clipboard_type),
+ text.Get(dispatcher()));
+ LOG_IF(WARNING, result != PP_OK) << "Write to clipboard failed unexpectedly.";
+}
+
+} // namespace proxy
+} // namespace pp
diff --git a/ppapi/proxy/ppb_flash_clipboard_proxy.h b/ppapi/proxy/ppb_flash_clipboard_proxy.h
new file mode 100644
index 0000000..2d68183
--- /dev/null
+++ b/ppapi/proxy/ppb_flash_clipboard_proxy.h
@@ -0,0 +1,47 @@
+// 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.
+
+#ifndef PPAPI_PROXY_PPB_FLASH_CLIPBOARD_PROXY_H_
+#define PPAPI_PROXY_PPB_FLASH_CLIPBOARD_PROXY_H_
+
+#include "ppapi/c/pp_instance.h"
+#include "ppapi/proxy/interface_proxy.h"
+
+struct PPB_Flash_Clipboard;
+
+namespace pp {
+namespace proxy {
+
+class SerializedVarReceiveInput;
+class SerializedVarReturnValue;
+
+class PPB_Flash_Clipboard_Proxy : public InterfaceProxy {
+ public:
+ PPB_Flash_Clipboard_Proxy(Dispatcher* dispatcher,
+ const void* target_interface);
+ virtual ~PPB_Flash_Clipboard_Proxy();
+
+ static const Info* GetInfo();
+
+ const PPB_Flash_Clipboard* ppb_flash_clipboard_target() const {
+ return reinterpret_cast<const PPB_Flash_Clipboard*>(target_interface());
+ }
+
+ // InterfaceProxy implementation.
+ virtual bool OnMessageReceived(const IPC::Message& msg);
+
+ private:
+ // Message handlers.
+ void OnMsgReadPlainText(PP_Instance instance_id,
+ int clipboard_type,
+ SerializedVarReturnValue result);
+ void OnMsgWritePlainText(PP_Instance instance_id,
+ int clipboard_type,
+ SerializedVarReceiveInput text);
+};
+
+} // namespace proxy
+} // namespace pp
+
+#endif // PPAPI_PROXY_PPB_FLASH_CLIPBOARD_PROXY_H_