Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(375)

Unified Diff: content/common/input/input_param_traits.cc

Issue 19624005: Add InputEvent and EventPacket types for batched input delivery (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Win export fix Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/input/input_param_traits.h ('k') | content/common/input/input_param_traits_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/input/input_param_traits.cc
diff --git a/content/common/input/input_param_traits.cc b/content/common/input/input_param_traits.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1840398876befbda50096e9603791ce29300142b
--- /dev/null
+++ b/content/common/input/input_param_traits.cc
@@ -0,0 +1,174 @@
+// Copyright (c) 2013 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 "content/common/input/input_param_traits.h"
+
+#include "content/common/content_param_traits.h"
+#include "content/common/input/input_event_disposition.h"
+#include "content/common/input/ipc_input_event_payload.h"
+#include "content/common/input/web_input_event_payload.h"
+#include "content/common/input_messages.h"
+
+namespace IPC {
+namespace {
+template <typename PayloadType>
+scoped_ptr<content::InputEvent::Payload> ReadPayload(const Message* m,
+ PickleIterator* iter) {
+ scoped_ptr<PayloadType> event = PayloadType::Create();
+ if (!ReadParam(m, iter, event.get()))
+ return scoped_ptr<content::InputEvent::Payload>();
+ return event.template PassAs<content::InputEvent::Payload>();
+}
+} // namespace
+
+void ParamTraits<content::EventPacket>::Write(Message* m, const param_type& p) {
+ WriteParam(m, p.id());
+ WriteParam(m, p.events());
+}
+
+bool ParamTraits<content::EventPacket>::Read(const Message* m,
+ PickleIterator* iter,
+ param_type* p) {
+ int64 id;
+ content::EventPacket::InputEvents events;
+ if (!ReadParam(m, iter, &id) ||
+ !ReadParam(m, iter, &events))
+ return false;
+
+ p->set_id(id);
+ bool events_added_successfully = true;
+ for (size_t i = 0; i < events.size(); ++i) {
+ // Take ownership of all events.
+ scoped_ptr<content::InputEvent> event(events[i]);
+ if (!events_added_successfully)
+ continue;
+ if (!p->Add(event.Pass()))
+ events_added_successfully = false;
+ }
+ events.weak_clear();
+ return events_added_successfully;
+}
+
+void ParamTraits<content::EventPacket>::Log(const param_type& p,
+ std::string* l) {
+ l->append("EventPacket((");
+ LogParam(p.id(), l);
+ l->append("), Events(");
+ LogParam(p.events(), l);
+ l->append("))");
+}
+
+void ParamTraits<content::InputEvent>::Write(Message* m, const param_type& p) {
+ WriteParam(m, p.id());
+ WriteParam(m, !!p.payload());
+ if (!p.valid())
+ return;
+
+ content::InputEvent::Payload::Type payload_type = p.payload()->GetType();
+ WriteParam(m, payload_type);
+ switch (payload_type) {
+ case content::InputEvent::Payload::IPC_MESSAGE:
+ WriteParam(m, *content::IPCInputEventPayload::Cast(p.payload()));
+ break;
+ case content::InputEvent::Payload::WEB_INPUT_EVENT:
+ WriteParam(m, *content::WebInputEventPayload::Cast(p.payload()));
+ break;
+ default:
+ break;
+ }
+}
+
+bool ParamTraits<content::InputEvent>::Read(const Message* m,
+ PickleIterator* iter,
+ param_type* p) {
+ int64 id;
+ bool has_payload = false;
+ content::InputEvent::Payload::Type payload_type;
+ if (!ReadParam(m, iter, &id) ||
+ !ReadParam(m, iter, &has_payload) ||
+ !id ||
+ !has_payload ||
+ !ReadParam(m, iter, &payload_type))
+ return false;
+
+ scoped_ptr<content::InputEvent::Payload> payload;
+ switch (payload_type) {
+ case content::InputEvent::Payload::IPC_MESSAGE:
+ payload = ReadPayload<content::IPCInputEventPayload>(m, iter);
+ break;
+ case content::InputEvent::Payload::WEB_INPUT_EVENT:
+ payload = ReadPayload<content::WebInputEventPayload>(m, iter);
+ break;
+ default:
+ NOTREACHED() << "Invalid InputEvent::Payload type.";
+ return false;
+ }
+ return p->Initialize(id, payload.Pass());
+}
+
+void ParamTraits<content::InputEvent>::Log(const param_type& p,
+ std::string* l) {
+ l->append("InputEvent((");
+ LogParam(p.id(), l);
+ l->append("), Payload (");
+ const content::InputEvent::Payload* payload = p.payload();
+ if (payload) {
+ switch (payload->GetType()) {
+ case content::InputEvent::Payload::IPC_MESSAGE:
+ LogParam(*content::IPCInputEventPayload::Cast(payload), l);
+ break;
+ case content::InputEvent::Payload::WEB_INPUT_EVENT:
+ LogParam(*content::WebInputEventPayload::Cast(payload), l);
+ break;
+ default:
+ NOTREACHED() << "Invalid InputEvent::Payload type.";
+ l->append("INVALID");
+ break;
+ }
+ } else {
+ l->append("NULL");
+ }
+ l->append("))");
+}
+
+void ParamTraits<content::WebInputEventPayload>::Write(Message* m,
+ const param_type& p) {
+ bool valid_web_event = !!p.web_event();
+ WriteParam(m, valid_web_event);
+ if (valid_web_event)
+ WriteParam(m, p.web_event());
+ WriteParam(m, p.latency_info());
+ WriteParam(m, p.is_keyboard_shortcut());
+}
+
+bool ParamTraits<content::WebInputEventPayload>::Read(const Message* m,
+ PickleIterator* iter,
+ param_type* p) {
+ bool valid_web_event;
+ WebInputEventPointer web_input_event_pointer;
+ ui::LatencyInfo latency_info;
+ bool is_keyboard_shortcut;
+ if (!ReadParam(m, iter, &valid_web_event) ||
+ !valid_web_event ||
+ !ReadParam(m, iter, &web_input_event_pointer) ||
+ !ReadParam(m, iter, &latency_info) ||
+ !ReadParam(m, iter, &is_keyboard_shortcut))
+ return false;
+
+ p->Initialize(*web_input_event_pointer, latency_info, is_keyboard_shortcut);
+ return true;
+}
+
+void ParamTraits<content::WebInputEventPayload>::Log(const param_type& p,
+ std::string* l) {
+ l->append("WebInputEventPayload(");
+ LogParam(p.web_event(), l);
+ l->append(", ");
+ LogParam(p.latency_info(), l);
+ l->append(", ");
+ LogParam(p.is_keyboard_shortcut(), l);
+ l->append(")");
+}
+
+} // namespace IPC
« no previous file with comments | « content/common/input/input_param_traits.h ('k') | content/common/input/input_param_traits_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698