summaryrefslogtreecommitdiffstats
path: root/chrome/browser/automation/automation_event_queue.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/automation/automation_event_queue.cc')
-rw-r--r--chrome/browser/automation/automation_event_queue.cc127
1 files changed, 127 insertions, 0 deletions
diff --git a/chrome/browser/automation/automation_event_queue.cc b/chrome/browser/automation/automation_event_queue.cc
new file mode 100644
index 0000000..fd4f792
--- /dev/null
+++ b/chrome/browser/automation/automation_event_queue.cc
@@ -0,0 +1,127 @@
+// 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 <algorithm>
+
+#include "chrome/browser/automation/automation_event_observer.h"
+#include "chrome/browser/automation/automation_event_queue.h"
+#include "chrome/browser/automation/automation_provider_json.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+
+AutomationEventQueue::CompareObserverId::CompareObserverId(int id) : id_(id) {}
+
+bool AutomationEventQueue::CompareObserverId::operator()(
+ AutomationEvent* event) const {
+ return event->GetId() < 0 || event->GetId() == id_;
+}
+
+AutomationEventQueue::AutomationEventQueue()
+ : observer_id_count_(0),
+ wait_automation_reply_(NULL),
+ wait_observer_id_(-1) {}
+
+AutomationEventQueue::~AutomationEventQueue() {
+ Clear();
+}
+
+AutomationEventQueue::AutomationEvent::AutomationEvent(
+ int observer_id, DictionaryValue* event_value)
+ : observer_id_(observer_id), event_value_(event_value) {}
+
+void AutomationEventQueue::GetNextEvent(AutomationJSONReply* reply,
+ int observer_id,
+ bool blocking) {
+ wait_automation_reply_.reset(reply);
+ wait_observer_id_ = observer_id;
+ if (!CheckReturnEvent() && !blocking && wait_automation_reply_.get()) {
+ wait_automation_reply_->SendSuccess(NULL);
+ wait_automation_reply_.reset();
+ }
+}
+
+void AutomationEventQueue::Clear() {
+ ClearObservers();
+ ClearEvents();
+}
+
+bool AutomationEventQueue::IsEmpty() const {
+ return event_queue_.empty();
+}
+
+AutomationEventQueue::AutomationEvent* AutomationEventQueue::PopEvent() {
+ if (event_queue_.empty()) {
+ return NULL;
+ }
+ AutomationEvent* event = event_queue_.back();
+ event_queue_.pop_back();
+ return event;
+}
+
+AutomationEventQueue::AutomationEvent* AutomationEventQueue::PopEvent(
+ int observer_id) {
+ AutomationEvent* event = NULL;
+ std::list<AutomationEvent*>::reverse_iterator it =
+ std::find_if(event_queue_.rbegin(), event_queue_.rend(),
+ CompareObserverId(observer_id));
+ if (it != event_queue_.rend()) {
+ event = *it;
+ event_queue_.remove(event);
+ }
+ return event;
+}
+
+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;
+}
+
+bool AutomationEventQueue::RemoveObserver(int observer_id) {
+ if (observers_.find(observer_id) != observers_.end()) {
+ delete observers_[observer_id];
+ observers_.erase(observer_id);
+ return true;
+ }
+ return false;
+}
+
+void AutomationEventQueue::ClearObservers() {
+ std::map<int, AutomationEventObserver*>::iterator it;
+ for (it = observers_.begin(); it != observers_.end(); it++) {
+ delete it->second;
+ }
+ observers_.clear();
+}
+
+void AutomationEventQueue::ClearEvents() {
+ std::list<AutomationEvent*>::iterator it;
+ for (it = event_queue_.begin(); it != event_queue_.end(); it++) {
+ delete *it;
+ }
+ event_queue_.clear();
+}
+
+bool AutomationEventQueue::CheckReturnEvent() {
+ if (wait_automation_reply_.get()) {
+ AutomationEventQueue::AutomationEvent* event = wait_observer_id_ < 0 ?
+ PopEvent() :
+ PopEvent(wait_observer_id_);
+ if (event) {
+ wait_automation_reply_->SendSuccess(event->GetValue());
+ wait_automation_reply_.reset();
+ wait_observer_id_ = -1;
+ delete event;
+ return true;
+ }
+ }
+ return false;
+}