summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsimonmorris@chromium.org <simonmorris@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-30 01:40:48 +0000
committersimonmorris@chromium.org <simonmorris@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-30 01:40:48 +0000
commit8640956ae7b2e82acdb8bf962a6483edec07a74c (patch)
tree04ba4d84d39391af14a3b23ad7006d6dd47a6adc
parente607239e7f1db8cac8214e44755b37d79b89fd36 (diff)
downloadchromium_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.cc2
-rw-r--r--remoting/base/constants.h2
-rw-r--r--remoting/client/plugin/chromoting_instance.cc15
-rw-r--r--remoting/client/plugin/chromoting_instance.h3
-rw-r--r--remoting/host/client_session_unittest.cc8
-rw-r--r--remoting/webapp/client_plugin.js8
-rw-r--r--remoting/webapp/client_plugin_async.js18
-rw-r--r--remoting/webapp/client_plugin_v1.js10
-rw-r--r--remoting/webapp/clipboard.js12
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;
}
}