diff options
author | dcheng@chromium.org <dcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-07 22:43:41 +0000 |
---|---|---|
committer | dcheng@chromium.org <dcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-07 22:43:41 +0000 |
commit | 97c2c0304fcda75890b4490ca5e6d569db30ca6d (patch) | |
tree | 083da18448d0479ffd8ec09ba530475309bb1fac /chrome | |
parent | 156c84585048ca444173b55097392e43c199a56c (diff) | |
download | chromium_src-97c2c0304fcda75890b4490ca5e6d569db30ca6d.zip chromium_src-97c2c0304fcda75890b4490ca5e6d569db30ca6d.tar.gz chromium_src-97c2c0304fcda75890b4490ca5e6d569db30ca6d.tar.bz2 |
Implement new Chromium IPCs for copying/dragging.
A new ClipboardDispatcher interface has been added to handle the IPC calls. The new methods don't really belong on the existing Clipboard class, since that class deals with only copy and paste. On Windows and Mac, ClipboardDispatcher will share logic for copy/paste and drag/drop. GTK will have to use two separate code paths.
BUG=31037
TEST=none
Review URL: http://codereview.chromium.org/2842016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51790 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/clipboard_dispatcher.h | 41 | ||||
-rw-r--r-- | chrome/browser/clipboard_dispatcher_gtk.cc | 33 | ||||
-rw-r--r-- | chrome/browser/clipboard_dispatcher_mac.mm | 33 | ||||
-rw-r--r-- | chrome/browser/clipboard_dispatcher_win.cc | 33 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter.cc | 37 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter.h | 11 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter_gtk.cc | 75 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 3 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 16 | ||||
-rw-r--r-- | chrome/renderer/renderer_glue.cc | 25 |
11 files changed, 302 insertions, 9 deletions
diff --git a/chrome/browser/clipboard_dispatcher.h b/chrome/browser/clipboard_dispatcher.h new file mode 100644 index 0000000..e346799 --- /dev/null +++ b/chrome/browser/clipboard_dispatcher.h @@ -0,0 +1,41 @@ +// Copyright (c) 2010 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 CHROME_BROWSER_CLIPBOARD_DISPATCHER_H_
+#define CHROME_BROWSER_CLIPBOARD_DISPATCHER_H_
+
+#include <vector>
+
+#include "app/clipboard/clipboard.h"
+#include "base/basictypes.h"
+#include "base/string16.h"
+
+// This class backs IPC requests from the renderer for clipboard data. In this
+// context, clipboard does not only refer to the usual concept of a clipboard
+// for copy/paste, which is why it's not in app/clipboard/clipboard.h. It can
+// refer to one of three different types of clipboards:
+// - The copy/paste clipboard, which contains data that has been copied/cut.
+// - The dragging clipboard, which contains data that is currently being
+// dragged.
+// - On X, the selection clipboard, which contains data for the current
+// selection.
+class ClipboardDispatcher {
+ public:
+ static bool ReadAvailableTypes(Clipboard::Buffer buffer,
+ std::vector<string16>* types,
+ bool* contains_filenames);
+ static bool ReadData(Clipboard::Buffer buffer, const string16& type,
+ string16* data, string16* metadata);
+ static bool ReadFilenames(Clipboard::Buffer buffer,
+ std::vector<string16>* filenames);
+
+ private:
+ // This class is not meant to be instantiated. All public members are static.
+ ClipboardDispatcher();
+
+ DISALLOW_COPY_AND_ASSIGN(ClipboardDispatcher);
+};
+
+#endif // CHROME_BROWSER_CLIPBOARD_DISPATCHER_H_
+
diff --git a/chrome/browser/clipboard_dispatcher_gtk.cc b/chrome/browser/clipboard_dispatcher_gtk.cc new file mode 100644 index 0000000..7fe0c3b --- /dev/null +++ b/chrome/browser/clipboard_dispatcher_gtk.cc @@ -0,0 +1,33 @@ +// Copyright (c) 2010 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/browser/clipboard_dispatcher.h"
+#include "base/logging.h"
+
+bool ClipboardDispatcher::ReadAvailableTypes(Clipboard::Buffer buffer,
+ std::vector<string16>* types,
+ bool* contains_filenames) {
+ DCHECK(types);
+ DCHECK(contains_filenames);
+ types->clear();
+ *contains_filenames = false;
+ return false;
+}
+
+bool ClipboardDispatcher::ReadData(Clipboard::Buffer buffer,
+ const string16& type,
+ string16* data,
+ string16* metadata) {
+ DCHECK(data);
+ DCHECK(metadata);
+ return false;
+}
+
+bool ClipboardDispatcher::ReadFilenames(Clipboard::Buffer buffer,
+ std::vector<string16>* filenames) {
+ DCHECK(filenames);
+ filenames->clear();
+ return false;
+}
+
diff --git a/chrome/browser/clipboard_dispatcher_mac.mm b/chrome/browser/clipboard_dispatcher_mac.mm new file mode 100644 index 0000000..7fe0c3b --- /dev/null +++ b/chrome/browser/clipboard_dispatcher_mac.mm @@ -0,0 +1,33 @@ +// Copyright (c) 2010 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/browser/clipboard_dispatcher.h"
+#include "base/logging.h"
+
+bool ClipboardDispatcher::ReadAvailableTypes(Clipboard::Buffer buffer,
+ std::vector<string16>* types,
+ bool* contains_filenames) {
+ DCHECK(types);
+ DCHECK(contains_filenames);
+ types->clear();
+ *contains_filenames = false;
+ return false;
+}
+
+bool ClipboardDispatcher::ReadData(Clipboard::Buffer buffer,
+ const string16& type,
+ string16* data,
+ string16* metadata) {
+ DCHECK(data);
+ DCHECK(metadata);
+ return false;
+}
+
+bool ClipboardDispatcher::ReadFilenames(Clipboard::Buffer buffer,
+ std::vector<string16>* filenames) {
+ DCHECK(filenames);
+ filenames->clear();
+ return false;
+}
+
diff --git a/chrome/browser/clipboard_dispatcher_win.cc b/chrome/browser/clipboard_dispatcher_win.cc new file mode 100644 index 0000000..7fe0c3b --- /dev/null +++ b/chrome/browser/clipboard_dispatcher_win.cc @@ -0,0 +1,33 @@ +// Copyright (c) 2010 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/browser/clipboard_dispatcher.h"
+#include "base/logging.h"
+
+bool ClipboardDispatcher::ReadAvailableTypes(Clipboard::Buffer buffer,
+ std::vector<string16>* types,
+ bool* contains_filenames) {
+ DCHECK(types);
+ DCHECK(contains_filenames);
+ types->clear();
+ *contains_filenames = false;
+ return false;
+}
+
+bool ClipboardDispatcher::ReadData(Clipboard::Buffer buffer,
+ const string16& type,
+ string16* data,
+ string16* metadata) {
+ DCHECK(data);
+ DCHECK(metadata);
+ return false;
+}
+
+bool ClipboardDispatcher::ReadFilenames(Clipboard::Buffer buffer,
+ std::vector<string16>* filenames) {
+ DCHECK(filenames);
+ filenames->clear();
+ return false;
+}
+
diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index 80e3de8..d303394 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -21,6 +21,7 @@ #include "chrome/browser/child_process_security_policy.h" #include "chrome/browser/chrome_plugin_browsing_context.h" #include "chrome/browser/chrome_thread.h" +#include "chrome/browser/clipboard_dispatcher.h" #include "chrome/browser/download/download_file.h" #include "chrome/browser/extensions/extension_message_service.h" #include "chrome/browser/geolocation/geolocation_permission_context.h" @@ -521,6 +522,12 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& msg) { IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardFindPboardWriteStringAsync, OnClipboardFindPboardWriteString) #endif + IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadAvailableTypes, + OnClipboardReadAvailableTypes) + IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadData, + OnClipboardReadData) + IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadFilenames, + OnClipboardReadFilenames) IPC_MESSAGE_HANDLER(ViewHostMsg_CheckNotificationPermission, OnCheckNotificationPermission) IPC_MESSAGE_HANDLER(ViewHostMsg_GetMimeTypeFromExtension, @@ -994,6 +1001,36 @@ void ResourceMessageFilter::OnClipboardReadHTML(Clipboard::Buffer buffer, Send(reply); } +void ResourceMessageFilter::OnClipboardReadAvailableTypes( + Clipboard::Buffer buffer, IPC::Message* reply) { + std::vector<string16> types; + bool contains_filenames = false; + bool result = ClipboardDispatcher::ReadAvailableTypes( + buffer, &types, &contains_filenames); + ViewHostMsg_ClipboardReadAvailableTypes::WriteReplyParams( + reply, result, types, contains_filenames); + Send(reply); +} + +void ResourceMessageFilter::OnClipboardReadData( + Clipboard::Buffer buffer, const string16& type, IPC::Message* reply) { + string16 data; + string16 metadata; + bool result = ClipboardDispatcher::ReadData(buffer, type, &data, &metadata); + ViewHostMsg_ClipboardReadData::WriteReplyParams( + reply, result, data, metadata); + Send(reply); +} + +void ResourceMessageFilter::OnClipboardReadFilenames( + Clipboard::Buffer buffer, IPC::Message* reply) { + std::vector<string16> filenames; + bool result = ClipboardDispatcher::ReadFilenames(buffer, &filenames); + ViewHostMsg_ClipboardReadFilenames::WriteReplyParams( + reply, result, filenames); + Send(reply); +} + #endif void ResourceMessageFilter::OnCheckNotificationPermission( diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h index 7b73450..d0c299d 100644 --- a/chrome/browser/renderer_host/resource_message_filter.h +++ b/chrome/browser/renderer_host/resource_message_filter.h @@ -220,6 +220,11 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, #if defined(OS_MACOSX) void OnClipboardFindPboardWriteString(const string16& text); #endif + void OnClipboardReadAvailableTypes(Clipboard::Buffer buffer, + IPC::Message* reply); + void OnClipboardReadData(Clipboard::Buffer buffer, const string16& type, + IPC::Message* reply); + void OnClipboardReadFilenames(Clipboard::Buffer buffer, IPC::Message* reply); void OnCheckNotificationPermission(const GURL& source_url, int* permission_level); @@ -352,6 +357,12 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, void DoOnClipboardReadAsciiText(Clipboard::Buffer buffer, IPC::Message* reply_msg); void DoOnClipboardReadHTML(Clipboard::Buffer buffer, IPC::Message* reply_msg); + void DoOnClipboardReadAvailableTypes(Clipboard::Buffer buffer, + IPC::Message* reply_msg); + void DoOnClipboardReadData(Clipboard::Buffer buffer, const string16& type, + IPC::Message* reply_msg); + void DoOnClipboardReadFilenames(Clipboard::Buffer buffer, + IPC::Message* reply_msg); void DoOnAllocateTempFileForPrinting(IPC::Message* reply_msg); #endif diff --git a/chrome/browser/renderer_host/resource_message_filter_gtk.cc b/chrome/browser/renderer_host/resource_message_filter_gtk.cc index 97e1c14..dcd3d19 100644 --- a/chrome/browser/renderer_host/resource_message_filter_gtk.cc +++ b/chrome/browser/renderer_host/resource_message_filter_gtk.cc @@ -82,7 +82,7 @@ void ResourceMessageFilter::DoOnGetWindowRect(gfx::NativeViewId view, ViewHostMsg_GetWindowRect::WriteReplyParams(reply_msg, rect); - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::IO, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); @@ -125,7 +125,7 @@ void ResourceMessageFilter::DoOnGetRootWindowRect(gfx::NativeViewId view, ViewHostMsg_GetRootWindowRect::WriteReplyParams(reply_msg, rect); - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::IO, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); @@ -139,7 +139,7 @@ void ResourceMessageFilter::DoOnClipboardIsFormatAvailable( ViewHostMsg_ClipboardIsFormatAvailable::WriteReplyParams(reply_msg, result); - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::IO, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); @@ -153,7 +153,7 @@ void ResourceMessageFilter::DoOnClipboardReadText(Clipboard::Buffer buffer, ViewHostMsg_ClipboardReadText::WriteReplyParams(reply_msg, result); - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::IO, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); @@ -167,7 +167,7 @@ void ResourceMessageFilter::DoOnClipboardReadAsciiText( ViewHostMsg_ClipboardReadAsciiText::WriteReplyParams(reply_msg, result); - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::IO, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); @@ -183,7 +183,34 @@ void ResourceMessageFilter::DoOnClipboardReadHTML(Clipboard::Buffer buffer, ViewHostMsg_ClipboardReadHTML::WriteReplyParams(reply_msg, markup, src_url); - ChromeThread::PostTask( + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod( + this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); +} + +// Called on the UI thread. +void ResourceMessageFilter::DoOnClipboardReadAvailableTypes( + Clipboard::Buffer buffer, IPC::Message* reply_msg) { + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod( + this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); +} + +// Called on the UI thread. +void ResourceMessageFilter::DoOnClipboardReadData(Clipboard::Buffer buffer, + const string16& type, + IPC::Message* reply_msg) { + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod( + this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); +} +// Called on the UI thread. +void ResourceMessageFilter::DoOnClipboardReadFilenames( + Clipboard::Buffer buffer, IPC::Message* reply_msg) { + ChromeThread::PostTask( ChromeThread::IO, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); @@ -223,7 +250,7 @@ void ResourceMessageFilter::DoOnAllocateTempFileForPrinting( ViewHostMsg_AllocateTempFileForPrinting::WriteReplyParams( reply_msg, temp_file_fd, fd_in_browser); - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::IO, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::SendDelayedReply, reply_msg)); @@ -241,7 +268,7 @@ void ResourceMessageFilter::OnGetScreenInfo(gfx::NativeViewId view, // Called on the IO thread. void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId view, IPC::Message* reply_msg) { - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::BACKGROUND_X11, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::DoOnGetWindowRect, view, reply_msg)); @@ -250,7 +277,7 @@ void ResourceMessageFilter::OnGetWindowRect(gfx::NativeViewId view, // Called on the IO thread. void ResourceMessageFilter::OnGetRootWindowRect(gfx::NativeViewId view, IPC::Message* reply_msg) { - ChromeThread::PostTask( + ChromeThread::PostTask( ChromeThread::BACKGROUND_X11, FROM_HERE, NewRunnableMethod( this, &ResourceMessageFilter::DoOnGetRootWindowRect, view, @@ -299,6 +326,36 @@ void ResourceMessageFilter::OnClipboardReadHTML(Clipboard::Buffer buffer, } // Called on the IO thread. +void ResourceMessageFilter::OnClipboardReadAvailableTypes( + Clipboard::Buffer buffer, IPC::Message* reply_msg) { + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod( + this, &ResourceMessageFilter::DoOnClipboardReadAvailableTypes, buffer, + reply_msg)); +} + +// Called on the IO thread. +void ResourceMessageFilter::OnClipboardReadData( + Clipboard::Buffer buffer, const string16& type, IPC::Message* reply_msg) { + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod( + this, &ResourceMessageFilter::DoOnClipboardReadData, buffer, type, + reply_msg)); +} + +// Called on the IO thread. +void ResourceMessageFilter::OnClipboardReadFilenames( + Clipboard::Buffer buffer, IPC::Message* reply_msg) { + ChromeThread::PostTask( + ChromeThread::UI, FROM_HERE, + NewRunnableMethod( + this, &ResourceMessageFilter::DoOnClipboardReadFilenames, buffer, + reply_msg)); +} + +// Called on the IO thread. void ResourceMessageFilter::OnAllocateTempFileForPrinting( IPC::Message* reply_msg) { ChromeThread::PostTask( diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 7ff5c45..d825f4e 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -576,6 +576,10 @@ 'browser/chromeos/wm_overview_snapshot.h', 'browser/chromeos/wm_overview_title.cc', 'browser/chromeos/wm_overview_title.h', + 'browser/clipboard_dispatcher_gtk.cc', + 'browser/clipboard_dispatcher_mac.mm', + 'browser/clipboard_dispatcher_win.cc', + 'browser/clipboard_dispatcher.h', 'browser/cocoa/about_ipc_bridge.h', 'browser/cocoa/about_ipc_bridge.mm', 'browser/cocoa/about_ipc_controller.h', diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index 050aae8..6ee03d1 100644 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -2273,6 +2273,9 @@ struct ParamTraits<Clipboard::Buffer> { type = L"BUFFER_SELECTION"; break; #endif + case Clipboard::BUFFER_DRAG: + type = L"BUFFER_DRAG"; + break; default: type = L"UNKNOWN"; break; diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index 042b7c6..20d5900 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -1429,6 +1429,22 @@ IPC_BEGIN_MESSAGES(ViewHost) string16 /* markup */, GURL /* url */) + IPC_SYNC_MESSAGE_CONTROL1_3(ViewHostMsg_ClipboardReadAvailableTypes, + Clipboard::Buffer /* buffer */, + bool /* result */, + std::vector<string16> /* types */, + bool /* contains filenames */) + IPC_SYNC_MESSAGE_CONTROL2_3(ViewHostMsg_ClipboardReadData, + Clipboard::Buffer /* buffer */, + string16 /* type */, + bool /* succeeded */, + string16 /* data */, + string16 /* metadata */) + IPC_SYNC_MESSAGE_CONTROL1_2(ViewHostMsg_ClipboardReadFilenames, + Clipboard::Buffer /* buffer */, + bool /* result */, + std::vector<string16> /* filenames */) + #if defined(OS_MACOSX) IPC_MESSAGE_CONTROL1(ViewHostMsg_ClipboardFindPboardWriteStringAsync, string16 /* text */) diff --git a/chrome/renderer/renderer_glue.cc b/chrome/renderer/renderer_glue.cc index 72a7629..d740c6e 100644 --- a/chrome/renderer/renderer_glue.cc +++ b/chrome/renderer/renderer_glue.cc @@ -221,6 +221,31 @@ void ClipboardReadHTML(Clipboard::Buffer buffer, string16* markup, GURL* url) { markup, url)); } +bool ClipboardReadAvailableTypes(Clipboard::Buffer buffer, + std::vector<string16>* types, + bool* contains_filenames) { + bool result = false; + RenderThread::current()->Send(new ViewHostMsg_ClipboardReadAvailableTypes( + buffer, &result, types, contains_filenames)); + return result; +} + +bool ClipboardReadData(Clipboard::Buffer buffer, const string16& type, + string16* data, string16* metadata) { + bool result = false; + RenderThread::current()->Send(new ViewHostMsg_ClipboardReadData( + buffer, type, &result, data, metadata)); + return result; +} + +bool ClipboardReadFilenames(Clipboard::Buffer buffer, + std::vector<string16>* filenames) { + bool result; + RenderThread::current()->Send(new ViewHostMsg_ClipboardReadFilenames( + buffer, &result, filenames)); + return result; +} + void GetPlugins(bool refresh, std::vector<WebPluginInfo>* plugins) { if (!RenderThread::current()->plugin_refresh_allowed()) refresh = false; |