Index: chrome/browser/extensions/extension_webnavigation_api.cc |
diff --git a/chrome/browser/extensions/extension_webnavigation_api.cc b/chrome/browser/extensions/extension_webnavigation_api.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4a545fdf4d5379e3a5c24abda550fb67d84bef6d |
--- /dev/null |
+++ b/chrome/browser/extensions/extension_webnavigation_api.cc |
@@ -0,0 +1,85 @@ |
+// Copyright (c) 2010 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. |
+ |
+// Implements the Chrome Extensions WebNavigation API. |
+ |
+#include "chrome/browser/extensions/extension_webnavigation_api.h" |
+ |
+#include "base/json/json_writer.h" |
+#include "base/time.h" |
+#include "base/values.h" |
+#include "chrome/browser/extensions/extension_message_service.h" |
+#include "chrome/browser/extensions/extension_tabs_module.h" |
+#include "chrome/browser/extensions/extension_webnavigation_api_constants.h" |
+#include "chrome/browser/profile.h" |
+#include "chrome/browser/tab_contents/navigation_entry.h" |
+#include "chrome/common/notification_type.h" |
+#include "chrome/common/notification_service.h" |
+ |
+namespace keys = extension_webnavigation_api_constants; |
+ |
+// static |
+ExtensionWebNavigationEventRouter* |
+ExtensionWebNavigationEventRouter::GetInstance() { |
+ return Singleton<ExtensionWebNavigationEventRouter>::get(); |
+} |
+ |
+void ExtensionWebNavigationEventRouter::Init() { |
+ if (registrar_.IsEmpty()) { |
+ registrar_.Add(this, |
+ NotificationType::NAV_ENTRY_COMMITTED, |
+ NotificationService::AllSources()); |
+ } |
+} |
+ |
+void ExtensionWebNavigationEventRouter::Observe( |
+ NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
+ switch (type.value) { |
+ case NotificationType::NAV_ENTRY_COMMITTED: |
+ NavEntryCommitted( |
+ Source<NavigationController>(source).ptr(), |
+ Details<NavigationController::LoadCommittedDetails>(details).ptr()); |
+ break; |
+ |
+ default: |
+ NOTREACHED(); |
+ } |
+} |
+ |
+void ExtensionWebNavigationEventRouter::NavEntryCommitted( |
+ NavigationController* controller, |
+ NavigationController::LoadCommittedDetails* details) { |
+ ListValue args; |
+ DictionaryValue* dict = new DictionaryValue(); |
+ dict->SetInteger(keys::kTabIdKey, |
+ ExtensionTabUtil::GetTabId(controller->tab_contents())); |
+ dict->SetString(keys::kUrlKey, |
+ details->entry->url().spec()); |
+ dict->SetInteger(keys::kFrameIdKey, |
+ details->is_main_frame ? 0 : details->entry->page_id()); |
+ dict->SetString(keys::kTransitionTypeKey, |
+ PageTransition::CoreTransitionString( |
+ details->entry->transition_type())); |
+ dict->SetString(keys::kTransitionQualifiersKey, |
+ PageTransition::QualifierString( |
+ details->entry->transition_type())); |
+ dict->SetReal(keys::kTimeStampKey, base::Time::Now().ToDoubleT()); |
+ args.Append(dict); |
+ |
+ std::string json_args; |
+ base::JSONWriter::Write(&args, false, &json_args); |
+ DispatchEvent(controller->profile(), keys::kOnCommitted, json_args); |
+} |
+ |
+void ExtensionWebNavigationEventRouter::DispatchEvent( |
+ Profile* profile, |
+ const char* event_name, |
+ const std::string& json_args) { |
+ if (profile && profile->GetExtensionMessageService()) { |
+ profile->GetExtensionMessageService()->DispatchEventToRenderers( |
+ event_name, json_args, profile, GURL()); |
+ } |
+} |