- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / braille_display_private / braille_display_private_api.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h"
6
7 #include "base/lazy_instance.h"
8 #include "chrome/browser/extensions/api/braille_display_private/braille_controller.h"
9 #include "chrome/browser/extensions/extension_system.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/profiles/profile_manager.h"
12
13 #if defined(OS_CHROMEOS)
14 #include "chrome/browser/chromeos/login/screen_locker.h"
15 #include "chrome/browser/chromeos/profiles/profile_helper.h"
16 #endif
17
18 namespace OnDisplayStateChanged =
19     extensions::api::braille_display_private::OnDisplayStateChanged;
20 namespace OnKeyEvent = extensions::api::braille_display_private::OnKeyEvent;
21 namespace WriteDots = extensions::api::braille_display_private::WriteDots;
22 using extensions::api::braille_display_private::DisplayState;
23 using extensions::api::braille_display_private::KeyEvent;
24 using extensions::api::braille_display_private::BrailleController;
25
26 namespace extensions {
27
28 class BrailleDisplayPrivateAPI::DefaultEventDelegate
29     : public BrailleDisplayPrivateAPI::EventDelegate {
30  public:
31   DefaultEventDelegate(EventRouter::Observer* observer, Profile* profile);
32   virtual ~DefaultEventDelegate();
33
34   virtual void BroadcastEvent(scoped_ptr<Event> event) OVERRIDE;
35   virtual bool HasListener() OVERRIDE;
36
37  private:
38   EventRouter::Observer* observer_;
39   Profile* profile_;
40 };
41
42 BrailleDisplayPrivateAPI::BrailleDisplayPrivateAPI(Profile* profile)
43     : profile_(profile), scoped_observer_(this),
44       event_delegate_(new DefaultEventDelegate(this, profile_)) {
45 }
46
47 BrailleDisplayPrivateAPI::~BrailleDisplayPrivateAPI() {
48 }
49
50 void BrailleDisplayPrivateAPI::Shutdown() {
51 }
52
53 static base::LazyInstance<ProfileKeyedAPIFactory<BrailleDisplayPrivateAPI> >
54 g_factory = LAZY_INSTANCE_INITIALIZER;
55
56 // static
57 ProfileKeyedAPIFactory<BrailleDisplayPrivateAPI>*
58 BrailleDisplayPrivateAPI::GetFactoryInstance() {
59   return &g_factory.Get();
60 }
61
62 void BrailleDisplayPrivateAPI::OnDisplayStateChanged(
63     const DisplayState& display_state) {
64   scoped_ptr<Event> event(new Event(
65       OnDisplayStateChanged::kEventName,
66       OnDisplayStateChanged::Create(display_state)));
67   event_delegate_->BroadcastEvent(event.Pass());
68 }
69
70 void BrailleDisplayPrivateAPI::OnKeyEvent(
71     const KeyEvent& key_event) {
72   // Key events only go to extensions of the active profile.
73   if (!IsProfileActive())
74     return;
75   scoped_ptr<Event> event(new Event(
76       OnKeyEvent::kEventName, OnKeyEvent::Create(key_event)));
77   event_delegate_->BroadcastEvent(event.Pass());
78 }
79
80 bool BrailleDisplayPrivateAPI::IsProfileActive() {
81 #if defined(OS_CHROMEOS)
82   Profile* active_profile;
83   chromeos::ScreenLocker* screen_locker =
84       chromeos::ScreenLocker::default_screen_locker();
85   if (screen_locker && screen_locker->locked())
86     active_profile = chromeos::ProfileHelper::GetSigninProfile();
87   else
88     active_profile = ProfileManager::GetDefaultProfile();
89   return profile_->IsSameProfile(active_profile);
90 #else  // !defined(OS_CHROMEOS)
91   return true;
92 #endif
93 }
94
95 void BrailleDisplayPrivateAPI::SetEventDelegateForTest(
96     scoped_ptr<EventDelegate> delegate) {
97   event_delegate_ = delegate.Pass();
98 }
99
100 void BrailleDisplayPrivateAPI::OnListenerAdded(
101     const EventListenerInfo& details) {
102   BrailleController* braille_controller = BrailleController::GetInstance();
103   if (!scoped_observer_.IsObserving(braille_controller))
104     scoped_observer_.Add(braille_controller);
105 }
106
107 void BrailleDisplayPrivateAPI::OnListenerRemoved(
108     const EventListenerInfo& details) {
109   BrailleController* braille_controller = BrailleController::GetInstance();
110   if (!event_delegate_->HasListener() &&
111       scoped_observer_.IsObserving(braille_controller)) {
112     scoped_observer_.Remove(braille_controller);
113   }
114 }
115
116 BrailleDisplayPrivateAPI::DefaultEventDelegate::DefaultEventDelegate(
117     EventRouter::Observer* observer, Profile* profile)
118     : observer_(observer), profile_(profile) {
119   EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router();
120   event_router->RegisterObserver(observer_, OnDisplayStateChanged::kEventName);
121   event_router->RegisterObserver(observer_, OnKeyEvent::kEventName);
122 }
123
124 BrailleDisplayPrivateAPI::DefaultEventDelegate::~DefaultEventDelegate() {
125   ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(observer_);
126 }
127
128 void BrailleDisplayPrivateAPI::DefaultEventDelegate::BroadcastEvent(
129     scoped_ptr<Event> event) {
130   ExtensionSystem::Get(profile_)->event_router()->BroadcastEvent(event.Pass());
131 }
132
133 bool BrailleDisplayPrivateAPI::DefaultEventDelegate::HasListener() {
134   EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router();
135   return (event_router->HasEventListener(OnDisplayStateChanged::kEventName) ||
136           event_router->HasEventListener(OnKeyEvent::kEventName));
137 }
138
139 namespace api {
140 bool BrailleDisplayPrivateGetDisplayStateFunction::Prepare() {
141   return true;
142 }
143
144 void BrailleDisplayPrivateGetDisplayStateFunction::Work() {
145   SetResult(
146       BrailleController::GetInstance()->GetDisplayState()->ToValue().release());
147 }
148
149 bool BrailleDisplayPrivateGetDisplayStateFunction::Respond() {
150   return true;
151 }
152
153 BrailleDisplayPrivateWriteDotsFunction::
154 BrailleDisplayPrivateWriteDotsFunction() {
155 }
156
157 BrailleDisplayPrivateWriteDotsFunction::
158 ~BrailleDisplayPrivateWriteDotsFunction() {
159 }
160
161 bool BrailleDisplayPrivateWriteDotsFunction::Prepare() {
162   params_ = WriteDots::Params::Create(*args_);
163   EXTENSION_FUNCTION_VALIDATE(params_);
164   return true;
165 }
166
167 void BrailleDisplayPrivateWriteDotsFunction::Work() {
168   BrailleController::GetInstance()->WriteDots(params_->cells);
169 }
170
171 bool BrailleDisplayPrivateWriteDotsFunction::Respond() {
172   return true;
173 }
174 }  // namespace api
175 }  // namespace extensions