OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/browser/api/system_display/system_display_api.h" | 5 #include "extensions/browser/api/system_display/system_display_api.h" |
6 | 6 |
7 #include <map> | |
7 #include <memory> | 8 #include <memory> |
9 #include <set> | |
8 #include <string> | 10 #include <string> |
9 | 11 |
12 #include "base/macros.h" | |
13 #include "base/memory/ptr_util.h" | |
10 #include "build/build_config.h" | 14 #include "build/build_config.h" |
15 #include "content/public/browser/web_contents.h" | |
16 #include "content/public/browser/web_contents_observer.h" | |
11 #include "extensions/browser/api/system_display/display_info_provider.h" | 17 #include "extensions/browser/api/system_display/display_info_provider.h" |
12 #include "extensions/common/api/system_display.h" | 18 #include "extensions/common/api/system_display.h" |
13 | 19 |
14 #if defined(OS_CHROMEOS) | 20 #if defined(OS_CHROMEOS) |
15 #include "extensions/common/manifest_handlers/kiosk_mode_info.h" | 21 #include "extensions/common/manifest_handlers/kiosk_mode_info.h" |
16 #endif | 22 #endif |
17 | 23 |
18 namespace extensions { | 24 namespace extensions { |
19 | 25 |
20 namespace display = api::system_display; | 26 namespace display = api::system_display; |
21 | 27 |
22 const char SystemDisplayFunction::kCrosOnlyError[] = | 28 const char SystemDisplayFunction::kCrosOnlyError[] = |
23 "Function available only on ChromeOS."; | 29 "Function available only on ChromeOS."; |
24 const char SystemDisplayFunction::kKioskOnlyError[] = | 30 const char SystemDisplayFunction::kKioskOnlyError[] = |
25 "Only kiosk enabled extensions are allowed to use this function."; | 31 "Only kiosk enabled extensions are allowed to use this function."; |
26 | 32 |
33 namespace { | |
34 | |
35 class OverscanTracker; | |
36 | |
37 static OverscanTracker* s_overscan_tracker = nullptr; | |
38 | |
39 // Singleton class to track overscan calibration overlays. An observer is | |
40 // created per WebContents which tracks any calbiration overlays by id. | |
41 // If the render frame is deleted (e.g. the tab is closed) before the overlay | |
42 // calibraiton is completed, the observer will call the overscan complete | |
43 // method to remove the overlay. When all observers are removed, the singleton | |
44 // tracker will delete itself. | |
45 class OverscanTracker { | |
46 public: | |
47 static OverscanTracker* Get(); | |
48 static void AddDisplay(content::WebContents* web_contents, | |
49 const std::string& id); | |
50 static void RemoveDisplay(content::WebContents* web_contents, | |
51 const std::string& id); | |
52 static void RemoveObserver(content::WebContents* web_contents); | |
53 | |
54 OverscanTracker() {} | |
55 ~OverscanTracker() {} | |
56 | |
57 private: | |
58 class OverscanWebObserver; | |
59 | |
60 OverscanWebObserver* GetObserver(content::WebContents* web_contents, | |
61 bool create); | |
62 bool RemoveObserverImpl(content::WebContents* web_contents); | |
63 | |
64 using ObserverMap = | |
65 std::map<content::WebContents*, std::unique_ptr<OverscanWebObserver>>; | |
66 ObserverMap observers_; | |
67 | |
68 DISALLOW_COPY_AND_ASSIGN(OverscanTracker); | |
69 }; | |
70 | |
71 class OverscanTracker::OverscanWebObserver | |
72 : public content::WebContentsObserver { | |
73 public: | |
74 explicit OverscanWebObserver(content::WebContents* web_contents) | |
75 : content::WebContentsObserver(web_contents) {} | |
76 ~OverscanWebObserver() override {} | |
77 | |
78 // WebContentsObserver | |
79 void RenderFrameDeleted( | |
80 content::RenderFrameHost* render_frame_host) override { | |
81 for (const std::string& id : display_ids_) { | |
82 // Reset any uncomitted calibraiton changes and complete calibration to | |
83 // hide the overlay. | |
84 DisplayInfoProvider::Get()->OverscanCalibrationReset(id); | |
85 DisplayInfoProvider::Get()->OverscanCalibrationComplete(id); | |
86 } | |
87 OverscanTracker::RemoveObserver(web_contents()); // Deletes this. | |
88 } | |
89 | |
90 void AddDisplay(const std::string& id) { display_ids_.insert(id); } | |
91 | |
92 void RemoveDisplay(const std::string& id) { | |
93 display_ids_.erase(id); | |
94 if (display_ids_.empty()) | |
95 OverscanTracker::RemoveObserver(web_contents()); // Deletes this. | |
96 } | |
97 | |
98 private: | |
99 std::set<std::string> display_ids_; | |
100 | |
101 DISALLOW_COPY_AND_ASSIGN(OverscanWebObserver); | |
102 }; | |
103 | |
104 // static | |
105 OverscanTracker* OverscanTracker::Get() { | |
106 if (!s_overscan_tracker) | |
107 s_overscan_tracker = new OverscanTracker; | |
108 return s_overscan_tracker; | |
109 } | |
110 | |
111 // static | |
112 void OverscanTracker::AddDisplay(content::WebContents* web_contents, | |
113 const std::string& id) { | |
114 OverscanTracker::Get()->GetObserver(web_contents, true)->AddDisplay(id); | |
115 } | |
116 | |
117 // static | |
118 void OverscanTracker::RemoveDisplay(content::WebContents* web_contents, | |
119 const std::string& id) { | |
120 OverscanTracker* tracker = OverscanTracker::Get(); | |
121 if (!tracker) | |
xiyuan
2016/12/07 21:32:40
Should we use |s_overscan_tracker| directly since
stevenjb
2016/12/07 21:54:42
Oops, yes, thanks for catching! I don't actually n
| |
122 return; | |
123 OverscanWebObserver* observer = tracker->GetObserver(web_contents, false); | |
124 if (observer) | |
125 observer->RemoveDisplay(id); | |
126 } | |
127 | |
128 // static | |
129 void OverscanTracker::RemoveObserver(content::WebContents* web_contents) { | |
130 if (OverscanTracker::Get()->RemoveObserverImpl(web_contents)) { | |
131 delete s_overscan_tracker; | |
132 s_overscan_tracker = nullptr; | |
133 } | |
134 } | |
135 | |
136 OverscanTracker::OverscanWebObserver* OverscanTracker::GetObserver( | |
137 content::WebContents* web_contents, | |
138 bool create) { | |
139 ObserverMap::iterator iter = observers_.find(web_contents); | |
140 if (iter != observers_.end()) | |
141 return iter->second.get(); | |
142 if (!create) | |
143 return nullptr; | |
144 auto owned_observer = base::MakeUnique<OverscanWebObserver>(web_contents); | |
145 auto observer_ptr = owned_observer.get(); | |
146 observers_[web_contents] = std::move(owned_observer); | |
147 return observer_ptr; | |
148 } | |
149 | |
150 bool OverscanTracker::RemoveObserverImpl(content::WebContents* web_contents) { | |
151 observers_.erase(web_contents); | |
152 return observers_.empty(); | |
153 } | |
154 | |
155 } // namespace | |
156 | |
27 bool SystemDisplayFunction::PreRunValidation(std::string* error) { | 157 bool SystemDisplayFunction::PreRunValidation(std::string* error) { |
28 if (!UIThreadExtensionFunction::PreRunValidation(error)) | 158 if (!UIThreadExtensionFunction::PreRunValidation(error)) |
29 return false; | 159 return false; |
30 | 160 |
31 #if !defined(OS_CHROMEOS) | 161 #if !defined(OS_CHROMEOS) |
32 *error = kCrosOnlyError; | 162 *error = kCrosOnlyError; |
33 return false; | 163 return false; |
34 #else | 164 #else |
35 if (!ShouldRestrictToKioskAndWebUI()) | 165 if (!ShouldRestrictToKioskAndWebUI()) |
36 return true; | 166 return true; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 DisplayInfoProvider::Get()->EnableUnifiedDesktop(params->enabled); | 223 DisplayInfoProvider::Get()->EnableUnifiedDesktop(params->enabled); |
94 return RespondNow(NoArguments()); | 224 return RespondNow(NoArguments()); |
95 } | 225 } |
96 | 226 |
97 ExtensionFunction::ResponseAction | 227 ExtensionFunction::ResponseAction |
98 SystemDisplayOverscanCalibrationStartFunction::Run() { | 228 SystemDisplayOverscanCalibrationStartFunction::Run() { |
99 std::unique_ptr<display::OverscanCalibrationStart::Params> params( | 229 std::unique_ptr<display::OverscanCalibrationStart::Params> params( |
100 display::OverscanCalibrationStart::Params::Create(*args_)); | 230 display::OverscanCalibrationStart::Params::Create(*args_)); |
101 if (!DisplayInfoProvider::Get()->OverscanCalibrationStart(params->id)) | 231 if (!DisplayInfoProvider::Get()->OverscanCalibrationStart(params->id)) |
102 return RespondNow(Error("Invalid display ID: " + params->id)); | 232 return RespondNow(Error("Invalid display ID: " + params->id)); |
233 OverscanTracker::AddDisplay(GetSenderWebContents(), params->id); | |
103 return RespondNow(NoArguments()); | 234 return RespondNow(NoArguments()); |
104 } | 235 } |
105 | 236 |
106 ExtensionFunction::ResponseAction | 237 ExtensionFunction::ResponseAction |
107 SystemDisplayOverscanCalibrationAdjustFunction::Run() { | 238 SystemDisplayOverscanCalibrationAdjustFunction::Run() { |
108 std::unique_ptr<display::OverscanCalibrationAdjust::Params> params( | 239 std::unique_ptr<display::OverscanCalibrationAdjust::Params> params( |
109 display::OverscanCalibrationAdjust::Params::Create(*args_)); | 240 display::OverscanCalibrationAdjust::Params::Create(*args_)); |
110 if (!params) | 241 if (!params) |
111 return RespondNow(Error("Invalid parameters")); | 242 return RespondNow(Error("Invalid parameters")); |
112 if (!DisplayInfoProvider::Get()->OverscanCalibrationAdjust(params->id, | 243 if (!DisplayInfoProvider::Get()->OverscanCalibrationAdjust(params->id, |
(...skipping 15 matching lines...) Expand all Loading... | |
128 } | 259 } |
129 | 260 |
130 ExtensionFunction::ResponseAction | 261 ExtensionFunction::ResponseAction |
131 SystemDisplayOverscanCalibrationCompleteFunction::Run() { | 262 SystemDisplayOverscanCalibrationCompleteFunction::Run() { |
132 std::unique_ptr<display::OverscanCalibrationComplete::Params> params( | 263 std::unique_ptr<display::OverscanCalibrationComplete::Params> params( |
133 display::OverscanCalibrationComplete::Params::Create(*args_)); | 264 display::OverscanCalibrationComplete::Params::Create(*args_)); |
134 if (!DisplayInfoProvider::Get()->OverscanCalibrationComplete(params->id)) { | 265 if (!DisplayInfoProvider::Get()->OverscanCalibrationComplete(params->id)) { |
135 return RespondNow( | 266 return RespondNow( |
136 Error("Calibration not started for display ID: " + params->id)); | 267 Error("Calibration not started for display ID: " + params->id)); |
137 } | 268 } |
269 OverscanTracker::RemoveDisplay(GetSenderWebContents(), params->id); | |
138 return RespondNow(NoArguments()); | 270 return RespondNow(NoArguments()); |
139 } | 271 } |
140 | 272 |
141 ExtensionFunction::ResponseAction | 273 ExtensionFunction::ResponseAction |
142 SystemDisplayTouchCalibrationStartFunction::Run() { | 274 SystemDisplayTouchCalibrationStartFunction::Run() { |
143 std::unique_ptr<display::TouchCalibrationStart::Params> params( | 275 std::unique_ptr<display::TouchCalibrationStart::Params> params( |
144 display::TouchCalibrationStart::Params::Create(*args_)); | 276 display::TouchCalibrationStart::Params::Create(*args_)); |
145 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) { | 277 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) { |
146 return RespondNow(Error( | 278 return RespondNow(Error( |
147 "Another touch calibration is already active.")); | 279 "Another touch calibration is already active.")); |
(...skipping 26 matching lines...) Expand all Loading... | |
174 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) { | 306 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) { |
175 return RespondNow(Error( | 307 return RespondNow(Error( |
176 "Another touch calibration is already active.")); | 308 "Another touch calibration is already active.")); |
177 } | 309 } |
178 if (!DisplayInfoProvider::Get()->TouchCalibrationReset(params->id)) | 310 if (!DisplayInfoProvider::Get()->TouchCalibrationReset(params->id)) |
179 return RespondNow(Error("Invalid display ID: " + params->id)); | 311 return RespondNow(Error("Invalid display ID: " + params->id)); |
180 return RespondNow(NoArguments()); | 312 return RespondNow(NoArguments()); |
181 } | 313 } |
182 | 314 |
183 } // namespace extensions | 315 } // namespace extensions |
OLD | NEW |