diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-08 09:37:23 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-08 09:37:23 +0000 |
commit | 9220f6c63876425d2a8925e2eeb755064f5ba0d9 (patch) | |
tree | 43dd17582732d884926425efa9e77ffd22babac8 /chrome/browser/extensions/extension_webnavigation_api.cc | |
parent | feeac1b5044abf164fee557f7853a5dcf96a0a6e (diff) | |
download | chromium_src-9220f6c63876425d2a8925e2eeb755064f5ba0d9.zip chromium_src-9220f6c63876425d2a8925e2eeb755064f5ba0d9.tar.gz chromium_src-9220f6c63876425d2a8925e2eeb755064f5ba0d9.tar.bz2 |
Implement the webNavigation.onCommitted event.
BUG=50943
TEST=ExtensionApiTest.WebNavigationEvents
Review URL: http://codereview.chromium.org/3307013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58802 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_webnavigation_api.cc')
-rw-r--r-- | chrome/browser/extensions/extension_webnavigation_api.cc | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_webnavigation_api.cc b/chrome/browser/extensions/extension_webnavigation_api.cc new file mode 100644 index 0000000..4a545fd --- /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()); + } +} |