12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/tabs/tabs_windows_api.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/api/tabs/tabs_event_router.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/tabs/windows_event_router.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/api/tabs.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/extensions/api/windows.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TabsWindowsAPI::TabsWindowsAPI(content::BrowserContext* context)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : browser_context_(context) {
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter* event_router = EventRouter::Get(browser_context_);
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Tabs API Events.
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnCreated::kEventName);
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnUpdated::kEventName);
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnMoved::kEventName);
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this,
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 api::tabs::OnSelectionChanged::kEventName);
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnActiveChanged::kEventName);
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnActivated::kEventName);
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this,
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 api::tabs::OnHighlightChanged::kEventName);
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnHighlighted::kEventName);
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnDetached::kEventName);
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnAttached::kEventName);
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnRemoved::kEventName);
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::tabs::OnReplaced::kEventName);
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  event_router->RegisterObserver(this, api::tabs::OnZoomChange::kEventName);
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Windows API Events.
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::windows::OnCreated::kEventName);
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this, api::windows::OnRemoved::kEventName);
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_router->RegisterObserver(this,
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 api::windows::OnFocusChanged::kEventName);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TabsWindowsAPI::~TabsWindowsAPI() {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TabsWindowsAPI* TabsWindowsAPI::Get(content::BrowserContext* context) {
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return BrowserContextKeyedAPIFactory<TabsWindowsAPI>::Get(context);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TabsEventRouter* TabsWindowsAPI::tabs_event_router() {
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!tabs_event_router_.get())
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    tabs_event_router_.reset(
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        new TabsEventRouter(Profile::FromBrowserContext(browser_context_)));
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return tabs_event_router_.get();
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WindowsEventRouter* TabsWindowsAPI::windows_event_router() {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!windows_event_router_)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    windows_event_router_.reset(
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        new WindowsEventRouter(Profile::FromBrowserContext(browser_context_)));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return windows_event_router_.get();
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabsWindowsAPI::Shutdown() {
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter::Get(browser_context_)->UnregisterObserver(this);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<BrowserContextKeyedAPIFactory<TabsWindowsAPI> >
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    g_factory = LAZY_INSTANCE_INITIALIZER;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BrowserContextKeyedAPIFactory<TabsWindowsAPI>*
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TabsWindowsAPI::GetFactoryInstance() {
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_factory.Pointer();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TabsWindowsAPI::OnListenerAdded(const EventListenerInfo& details) {
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Initialize the event routers.
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  tabs_event_router();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  windows_event_router();
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter::Get(browser_context_)->UnregisterObserver(this);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
88