diff options
author | simonmorris@chromium.org <simonmorris@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-30 01:40:48 +0000 |
---|---|---|
committer | simonmorris@chromium.org <simonmorris@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-30 01:40:48 +0000 |
commit | 8640956ae7b2e82acdb8bf962a6483edec07a74c (patch) | |
tree | 04ba4d84d39391af14a3b23ad7006d6dd47a6adc | |
parent | e607239e7f1db8cac8214e44755b37d79b89fd36 (diff) | |
download | chromium_src-8640956ae7b2e82acdb8bf962a6483edec07a74c.zip chromium_src-8640956ae7b2e82acdb8bf962a6483edec07a74c.tar.gz chromium_src-8640956ae7b2e82acdb8bf962a6483edec07a74c.tar.bz2 |
[Chromoting] Let the webapp send text clipboard items to the client plugin.
BUG=117473
Review URL: http://codereview.chromium.org/9834036
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129757 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | remoting/base/constants.cc | 2 | ||||
-rw-r--r-- | remoting/base/constants.h | 2 | ||||
-rw-r--r-- | remoting/client/plugin/chromoting_instance.cc | 15 | ||||
-rw-r--r-- | remoting/client/plugin/chromoting_instance.h | 3 | ||||
-rw-r--r-- | remoting/host/client_session_unittest.cc | 8 | ||||
-rw-r--r-- | remoting/webapp/client_plugin.js | 8 | ||||
-rw-r--r-- | remoting/webapp/client_plugin_async.js | 18 | ||||
-rw-r--r-- | remoting/webapp/client_plugin_v1.js | 10 | ||||
-rw-r--r-- | remoting/webapp/clipboard.js | 12 |
9 files changed, 67 insertions, 11 deletions
diff --git a/remoting/base/constants.cc b/remoting/base/constants.cc index 6c59a4c..54ca8b8 100644 --- a/remoting/base/constants.cc +++ b/remoting/base/constants.cc @@ -18,6 +18,6 @@ const char kVideoChannelName[] = "video"; const char kVideoRtpChannelName[] = "videortp"; const char kVideoRtcpChannelName[] = "videortpc"; -const char kMimeTypeText[] = "text/plain; charset=UTF-8"; +const char kMimeTypeTextUtf8[] = "text/plain; charset=UTF-8"; } // namespace remoting diff --git a/remoting/base/constants.h b/remoting/base/constants.h index f74159f..538564d 100644 --- a/remoting/base/constants.h +++ b/remoting/base/constants.h @@ -25,7 +25,7 @@ extern const char kVideoRtpChannelName[]; extern const char kVideoRtcpChannelName[]; // MIME types for the clipboard. -extern const char kMimeTypeText[]; +extern const char kMimeTypeTextUtf8[]; } // namespace remoting diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc index 341411b..d357ce5 100644 --- a/remoting/client/plugin/chromoting_instance.cc +++ b/remoting/client/plugin/chromoting_instance.cc @@ -25,6 +25,7 @@ #include "ppapi/cpp/rect.h" // TODO(wez): Remove this when crbug.com/86353 is complete. #include "ppapi/cpp/private/var_private.h" +#include "remoting/base/constants.h" #include "remoting/base/util.h" #include "remoting/client/client_config.h" #include "remoting/client/chromoting_client.h" @@ -248,6 +249,15 @@ void ChromotingInstance::HandleMessage(const pp::Var& message) { OnIncomingIq(iq); } else if (method == "releaseAllKeys") { ReleaseAllKeys(); + } else if (method == "sendClipboardItem") { + std::string mime_type; + std::string item; + if (!data->GetString("mimeType", &mime_type) || + !data->GetString("item", &item)) { + LOG(ERROR) << "Invalid sendClipboardItem() data."; + return; + } + SendClipboardItem(mime_type, item); } } @@ -395,6 +405,11 @@ void ChromotingInstance::ReleaseAllKeys() { } } +void ChromotingInstance::SendClipboardItem(const std::string& mime_type, + const std::string& item) { + // TODO(simonmorris): Plumb this in to a ClipboardStub. +} + ChromotingStats* ChromotingInstance::GetStats() { if (!client_.get()) return NULL; diff --git a/remoting/client/plugin/chromoting_instance.h b/remoting/client/plugin/chromoting_instance.h index 84780d6..adc40e0 100644 --- a/remoting/client/plugin/chromoting_instance.h +++ b/remoting/client/plugin/chromoting_instance.h @@ -86,7 +86,7 @@ class ChromotingInstance : // Plugin API version. This should be incremented whenever the API // interface changes. - static const int kApiVersion = 5; + static const int kApiVersion = 6; // Backward-compatibility version used by for the messaging // interface. Should be updated whenever we remove support for @@ -129,6 +129,7 @@ class ChromotingInstance : void Disconnect(); void OnIncomingIq(const std::string& iq); void ReleaseAllKeys(); + void SendClipboardItem(const std::string& mime_type, const std::string& item); // Return statistics record by ChromotingClient. // If no connection is currently active then NULL will be returned. diff --git a/remoting/host/client_session_unittest.cc b/remoting/host/client_session_unittest.cc index 67bf728..f9dbd1c 100644 --- a/remoting/host/client_session_unittest.cc +++ b/remoting/host/client_session_unittest.cc @@ -70,21 +70,21 @@ MATCHER_P2(EqualsClipboardEvent, m, d, "") { TEST_F(ClientSessionTest, ClipboardStubFilter) { protocol::ClipboardEvent clipboard_event1; - clipboard_event1.set_mime_type(kMimeTypeText); + clipboard_event1.set_mime_type(kMimeTypeTextUtf8); clipboard_event1.set_data("a"); protocol::ClipboardEvent clipboard_event2; - clipboard_event2.set_mime_type(kMimeTypeText); + clipboard_event2.set_mime_type(kMimeTypeTextUtf8); clipboard_event2.set_data("b"); protocol::ClipboardEvent clipboard_event3; - clipboard_event3.set_mime_type(kMimeTypeText); + clipboard_event3.set_mime_type(kMimeTypeTextUtf8); clipboard_event3.set_data("c"); InSequence s; EXPECT_CALL(session_event_handler_, OnSessionAuthenticated(_)); EXPECT_CALL(host_event_stub_, InjectClipboardEvent(EqualsClipboardEvent( - kMimeTypeText, "b"))); + kMimeTypeTextUtf8, "b"))); // This event should not get through to the clipboard stub, // because the client isn't authenticated yet. diff --git a/remoting/webapp/client_plugin.js b/remoting/webapp/client_plugin.js index 23be145..336e17e 100644 --- a/remoting/webapp/client_plugin.js +++ b/remoting/webapp/client_plugin.js @@ -96,3 +96,11 @@ remoting.ClientPlugin.prototype.releaseAllKeys = function() {}; * @return {remoting.ClientSession.PerfStats} The connection statistics. */ remoting.ClientPlugin.prototype.getPerfStats = function() {}; + +/** + * Sends a clipboard item to the host. + * + * @param {string} mimeType The MIME type of the clipboard item. + * @param {string} item The clipboard item. + */ +remoting.ClientPlugin.prototype.sendClipboardItem = function(mimeType, item) {}; diff --git a/remoting/webapp/client_plugin_async.js b/remoting/webapp/client_plugin_async.js index 73eb075..e85faa4 100644 --- a/remoting/webapp/client_plugin_async.js +++ b/remoting/webapp/client_plugin_async.js @@ -66,7 +66,7 @@ remoting.ClientPluginAsync = function(plugin) { * @const * @private */ -remoting.ClientPluginAsync.prototype.API_VERSION_ = 5; +remoting.ClientPluginAsync.prototype.API_VERSION_ = 6; /** * The oldest API version that we support. @@ -274,3 +274,19 @@ remoting.ClientPluginAsync.prototype.releaseAllKeys = function() { remoting.ClientPluginAsync.prototype.getPerfStats = function() { return this.perfStats_; }; + +/** + * Sends a clipboard item to the host. + * + * @param {string} mimeType The MIME type of the clipboard item. + * @param {string} item The clipboard item. + */ +remoting.ClientPluginAsync.prototype.sendClipboardItem = + function(mimeType, item) { + if (this.plugin.apiVersion < 6) { + return; + } + this.plugin.postMessage(JSON.stringify( + { method: 'sendClipboardItem', + data: { mimeType: mimeType, item: item }})); +}; diff --git a/remoting/webapp/client_plugin_v1.js b/remoting/webapp/client_plugin_v1.js index 8a8dcf9..20031bd 100644 --- a/remoting/webapp/client_plugin_v1.js +++ b/remoting/webapp/client_plugin_v1.js @@ -218,3 +218,13 @@ remoting.ClientPluginV1.prototype.getPerfStats = function() { renderLatency: this.plugin.videoRenderLatency, roundtripLatency: this.plugin.roundTripLatency }; }; + +/** + * This dummy method exists only so that this class implements ClientPlugin. + * + * @param {string} mimeType The MIME type of the clipboard item. + * @param {string} item The clipboard item. + */ +remoting.ClientPluginV1.prototype.sendClipboardItem = function(mimeType, item) { + return; +}; diff --git a/remoting/webapp/clipboard.js b/remoting/webapp/clipboard.js index dcf55d8..d0418dc 100644 --- a/remoting/webapp/clipboard.js +++ b/remoting/webapp/clipboard.js @@ -23,7 +23,8 @@ remoting.Clipboard = function() { * @enum {string} */ remoting.Clipboard.prototype.ItemTypes = { - TEXT_TYPE: 'text/plain' + TEXT_TYPE: 'text/plain', + TEXT_UTF8_TYPE: 'text/plain; charset=UTF-8' }; /** @@ -45,16 +46,21 @@ remoting.Clipboard.prototype.toHost = function(clipboardData) { if (!clipboardData || !clipboardData.types || !clipboardData.getData) { return; } - var textType = 'text/plain'; + if (!remoting.clientSession || !remoting.clientSession.plugin) { + return; + } + var plugin = remoting.clientSession.plugin; for (var i = 0; i < clipboardData.types.length; i++) { var type = clipboardData.types[i]; + // The browser presents text clipboard items as 'text/plain'. if (type == this.ItemTypes.TEXT_TYPE) { var item = clipboardData.getData(type); if (!item) { item = ""; } if (item != this.recentItemText) { - // TODO(simonmorris): Pass the clipboard text item to the plugin. + // The plugin's JSON reader emits UTF-8. + plugin.sendClipboardItem(this.ItemTypes.TEXT_UTF8_TYPE, item); this.recentItemText = item; } } |