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

Unified Diff: chrome/browser/automation/automation_event_queue.cc

Issue 9372120: Implementation of AutomationEventQueue and associated framework to support generic non-blocking aut… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed Dennis' comments. Created 8 years, 10 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
Index: chrome/browser/automation/automation_event_queue.cc
diff --git a/chrome/browser/automation/automation_event_queue.cc b/chrome/browser/automation/automation_event_queue.cc
new file mode 100644
index 0000000000000000000000000000000000000000..20315f3e03037b0132b62c79ac777b3d07c7b37b
--- /dev/null
+++ b/chrome/browser/automation/automation_event_queue.cc
@@ -0,0 +1,137 @@
+// Copyright (c) 2012 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/automation/automation_event_observer.h"
+#include "chrome/browser/automation/automation_event_queue.h"
+
+#include "chrome/browser/automation/automation_provider.h"
+#include "chrome/browser/automation/automation_provider_json.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+
+AutomationEventQueue::AutomationEventQueue()
+ : observer_id_count_(0),
+ wait_reply_message_(NULL),
+ wait_observer_id_(-1) {}
+
+AutomationEventQueue::~AutomationEventQueue() {
+ ClearObservers();
+ Clear();
+}
+
+AutomationEventQueue::AutomationEvent::AutomationEvent(
+ int observer_id, DictionaryValue* event_value)
+ : event_value_(event_value), observer_id_(observer_id) {}
+
+void AutomationEventQueue::AutomationEvent::ReturnValue(
+ AutomationProvider* automation,
+ IPC::Message* reply_message) {
+ AutomationJSONReply(automation, reply_message)
+ .SendSuccess(event_value_.get());
+}
+
+void AutomationEventQueue::GetEvent(AutomationProvider* automation,
+ IPC::Message* reply_message,
+ int observer_id,
+ bool blocking) {
+ SetWait(automation, reply_message, observer_id);
+ bool r = CheckReturnEvent();
Nirnimesh 2012/02/24 23:18:09 use better varnames
craigdh 2012/02/27 22:43:38 Done.
+ if (!r && !blocking) {
+ ClearWait();
+ AutomationJSONReply(automation, reply_message).SendSuccess(NULL);
+ }
+}
+
+void AutomationEventQueue::Clear() {
+ std::list<AutomationEvent*>::iterator i;
+ for (i = event_queue_.begin(); i != event_queue_.end(); i++) {
+ delete *i;
+ }
+ event_queue_.clear();
+}
+
+bool AutomationEventQueue::IsEmpty() {
+ return event_queue_.empty();
+}
+
+AutomationEventQueue::AutomationEvent* AutomationEventQueue::PopEvent() {
+ if (event_queue_.empty()) {
+ return NULL;
+ }
+ AutomationEvent* ret = event_queue_.back();
+ event_queue_.pop_back();
+ return ret;
+}
+
+AutomationEventQueue::AutomationEvent* AutomationEventQueue::PopEvent(
+ int observer_id) {
+ AutomationEvent* ret = NULL;
+ std::list<AutomationEvent*>::reverse_iterator i;
+ for (i = event_queue_.rbegin(); i != event_queue_.rend(); i++) {
+ if (observer_id < 0 || (*i)->GetId() == observer_id) {
+ ret = *i;
+ break;
+ }
+ }
+ if (ret) {
+ event_queue_.remove(ret);
+ return ret;
+ }
+ return NULL;
+}
+
+void AutomationEventQueue::NotifyEvent(
+ AutomationEventQueue::AutomationEvent* event) {
+ event_queue_.push_front(event);
+ CheckReturnEvent();
+}
+
+int AutomationEventQueue::AddObserver(AutomationEventObserver* observer) {
+ int id = observer_id_count_++;
+ observer->Init(id);
+ observers_[id] = observer;
+ return id;
+}
+
+void AutomationEventQueue::RemoveObserver(int observer_id) {
+ if (observers_.count(observer_id)) {
+ delete observers_[observer_id];
+ observers_.erase(observer_id);
+ }
+}
+
+void AutomationEventQueue::ClearObservers() {
+ std::map<int, AutomationEventObserver*>::iterator i;
+ for (i = observers_.begin(); i != observers_.end(); i++) {
+ delete (*i).second;
+ }
+ observers_.clear();
+}
+
+bool AutomationEventQueue::CheckReturnEvent() {
+ if (wait_automation_ && wait_reply_message_.get()) {
+ AutomationEventQueue::AutomationEvent* event = wait_observer_id_ < 0 ?
+ PopEvent() :
+ PopEvent(wait_observer_id_);
+ if (event) {
+ event->ReturnValue(wait_automation_, wait_reply_message_.release());
+ delete event;
+ ClearWait();
+ return true;
+ }
+ }
+ return false;
+}
+
+void AutomationEventQueue::SetWait(AutomationProvider* automation,
+ IPC::Message* reply_message,
+ int observer_id) {
+ wait_automation_ = automation;
+ wait_reply_message_.reset(reply_message);
+ wait_observer_id_ = observer_id;
+}
+
+void AutomationEventQueue::ClearWait() {
+ SetWait(NULL, NULL, -1);
+}

Powered by Google App Engine
This is Rietveld 408576698