Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(230)

Side by Side Diff: extensions/browser/api/system_display/system_display_api.cc

Issue 2558453004: SystemDisplayApi: Introdice OverscanTracker (Closed)
Patch Set: Rebase + s_overscan_tracker -> g_overscan_tracker Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 // Singleton class to track overscan calibration overlays. An observer is
38 // created per WebContents which tracks any calbiration overlays by id.
39 // If the render frame is deleted (e.g. the tab is closed) before the overlay
40 // calibraiton is completed, the observer will call the overscan complete
41 // method to remove the overlay. When all observers are removed, the singleton
42 // tracker will delete itself.
43 class OverscanTracker {
44 public:
45 static void AddDisplay(content::WebContents* web_contents,
46 const std::string& id);
47 static void RemoveDisplay(content::WebContents* web_contents,
48 const std::string& id);
49 static void RemoveObserver(content::WebContents* web_contents);
50
51 OverscanTracker() {}
52 ~OverscanTracker() {}
53
54 private:
55 class OverscanWebObserver;
56
57 OverscanWebObserver* GetObserver(content::WebContents* web_contents,
58 bool create);
59 bool RemoveObserverImpl(content::WebContents* web_contents);
60
61 using ObserverMap =
62 std::map<content::WebContents*, std::unique_ptr<OverscanWebObserver>>;
63 ObserverMap observers_;
64
65 DISALLOW_COPY_AND_ASSIGN(OverscanTracker);
66 };
67
68 class OverscanTracker::OverscanWebObserver
69 : public content::WebContentsObserver {
70 public:
71 explicit OverscanWebObserver(content::WebContents* web_contents)
72 : content::WebContentsObserver(web_contents) {}
73 ~OverscanWebObserver() override {}
74
75 // WebContentsObserver
76 void RenderFrameDeleted(
77 content::RenderFrameHost* render_frame_host) override {
78 for (const std::string& id : display_ids_) {
79 // Reset any uncomitted calibraiton changes and complete calibration to
80 // hide the overlay.
81 DisplayInfoProvider::Get()->OverscanCalibrationReset(id);
82 DisplayInfoProvider::Get()->OverscanCalibrationComplete(id);
83 }
84 OverscanTracker::RemoveObserver(web_contents()); // Deletes this.
85 }
86
87 void AddDisplay(const std::string& id) { display_ids_.insert(id); }
88
89 void RemoveDisplay(const std::string& id) {
90 display_ids_.erase(id);
91 if (display_ids_.empty())
92 OverscanTracker::RemoveObserver(web_contents()); // Deletes this.
93 }
94
95 private:
96 std::set<std::string> display_ids_;
97
98 DISALLOW_COPY_AND_ASSIGN(OverscanWebObserver);
99 };
100
101 static OverscanTracker* g_overscan_tracker = nullptr;
102
103 // static
104 void OverscanTracker::AddDisplay(content::WebContents* web_contents,
105 const std::string& id) {
106 if (!g_overscan_tracker)
107 g_overscan_tracker = new OverscanTracker;
108 g_overscan_tracker->GetObserver(web_contents, true)->AddDisplay(id);
109 }
110
111 // static
112 void OverscanTracker::RemoveDisplay(content::WebContents* web_contents,
113 const std::string& id) {
114 if (!g_overscan_tracker)
115 return;
116 OverscanWebObserver* observer =
117 g_overscan_tracker->GetObserver(web_contents, false);
118 if (observer)
119 observer->RemoveDisplay(id);
120 }
121
122 // static
123 void OverscanTracker::RemoveObserver(content::WebContents* web_contents) {
124 if (!g_overscan_tracker)
125 return;
126 if (g_overscan_tracker->RemoveObserverImpl(web_contents)) {
127 delete g_overscan_tracker;
128 g_overscan_tracker = nullptr;
129 }
130 }
131
132 OverscanTracker::OverscanWebObserver* OverscanTracker::GetObserver(
133 content::WebContents* web_contents,
134 bool create) {
135 ObserverMap::iterator iter = observers_.find(web_contents);
136 if (iter != observers_.end())
137 return iter->second.get();
138 if (!create)
139 return nullptr;
140 auto owned_observer = base::MakeUnique<OverscanWebObserver>(web_contents);
141 auto observer_ptr = owned_observer.get();
142 observers_[web_contents] = std::move(owned_observer);
143 return observer_ptr;
144 }
145
146 bool OverscanTracker::RemoveObserverImpl(content::WebContents* web_contents) {
147 observers_.erase(web_contents);
148 return observers_.empty();
149 }
150
151 } // namespace
152
27 bool SystemDisplayFunction::PreRunValidation(std::string* error) { 153 bool SystemDisplayFunction::PreRunValidation(std::string* error) {
28 if (!UIThreadExtensionFunction::PreRunValidation(error)) 154 if (!UIThreadExtensionFunction::PreRunValidation(error))
29 return false; 155 return false;
30 156
31 #if !defined(OS_CHROMEOS) 157 #if !defined(OS_CHROMEOS)
32 *error = kCrosOnlyError; 158 *error = kCrosOnlyError;
33 return false; 159 return false;
34 #else 160 #else
35 if (!ShouldRestrictToKioskAndWebUI()) 161 if (!ShouldRestrictToKioskAndWebUI())
36 return true; 162 return true;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 DisplayInfoProvider::Get()->EnableUnifiedDesktop(params->enabled); 219 DisplayInfoProvider::Get()->EnableUnifiedDesktop(params->enabled);
94 return RespondNow(NoArguments()); 220 return RespondNow(NoArguments());
95 } 221 }
96 222
97 ExtensionFunction::ResponseAction 223 ExtensionFunction::ResponseAction
98 SystemDisplayOverscanCalibrationStartFunction::Run() { 224 SystemDisplayOverscanCalibrationStartFunction::Run() {
99 std::unique_ptr<display::OverscanCalibrationStart::Params> params( 225 std::unique_ptr<display::OverscanCalibrationStart::Params> params(
100 display::OverscanCalibrationStart::Params::Create(*args_)); 226 display::OverscanCalibrationStart::Params::Create(*args_));
101 if (!DisplayInfoProvider::Get()->OverscanCalibrationStart(params->id)) 227 if (!DisplayInfoProvider::Get()->OverscanCalibrationStart(params->id))
102 return RespondNow(Error("Invalid display ID: " + params->id)); 228 return RespondNow(Error("Invalid display ID: " + params->id));
229 OverscanTracker::AddDisplay(GetSenderWebContents(), params->id);
103 return RespondNow(NoArguments()); 230 return RespondNow(NoArguments());
104 } 231 }
105 232
106 ExtensionFunction::ResponseAction 233 ExtensionFunction::ResponseAction
107 SystemDisplayOverscanCalibrationAdjustFunction::Run() { 234 SystemDisplayOverscanCalibrationAdjustFunction::Run() {
108 std::unique_ptr<display::OverscanCalibrationAdjust::Params> params( 235 std::unique_ptr<display::OverscanCalibrationAdjust::Params> params(
109 display::OverscanCalibrationAdjust::Params::Create(*args_)); 236 display::OverscanCalibrationAdjust::Params::Create(*args_));
110 if (!params) 237 if (!params)
111 return RespondNow(Error("Invalid parameters")); 238 return RespondNow(Error("Invalid parameters"));
112 if (!DisplayInfoProvider::Get()->OverscanCalibrationAdjust(params->id, 239 if (!DisplayInfoProvider::Get()->OverscanCalibrationAdjust(params->id,
(...skipping 15 matching lines...) Expand all
128 } 255 }
129 256
130 ExtensionFunction::ResponseAction 257 ExtensionFunction::ResponseAction
131 SystemDisplayOverscanCalibrationCompleteFunction::Run() { 258 SystemDisplayOverscanCalibrationCompleteFunction::Run() {
132 std::unique_ptr<display::OverscanCalibrationComplete::Params> params( 259 std::unique_ptr<display::OverscanCalibrationComplete::Params> params(
133 display::OverscanCalibrationComplete::Params::Create(*args_)); 260 display::OverscanCalibrationComplete::Params::Create(*args_));
134 if (!DisplayInfoProvider::Get()->OverscanCalibrationComplete(params->id)) { 261 if (!DisplayInfoProvider::Get()->OverscanCalibrationComplete(params->id)) {
135 return RespondNow( 262 return RespondNow(
136 Error("Calibration not started for display ID: " + params->id)); 263 Error("Calibration not started for display ID: " + params->id));
137 } 264 }
265 OverscanTracker::RemoveDisplay(GetSenderWebContents(), params->id);
138 return RespondNow(NoArguments()); 266 return RespondNow(NoArguments());
139 } 267 }
140 268
141 ExtensionFunction::ResponseAction 269 ExtensionFunction::ResponseAction
142 SystemDisplayTouchCalibrationStartFunction::Run() { 270 SystemDisplayTouchCalibrationStartFunction::Run() {
143 std::unique_ptr<display::TouchCalibrationStart::Params> params( 271 std::unique_ptr<display::TouchCalibrationStart::Params> params(
144 display::TouchCalibrationStart::Params::Create(*args_)); 272 display::TouchCalibrationStart::Params::Create(*args_));
145 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) { 273 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) {
146 return RespondNow(Error( 274 return RespondNow(Error(
147 "Another touch calibration is already active.")); 275 "Another touch calibration is already active."));
(...skipping 26 matching lines...) Expand all
174 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) { 302 if (!DisplayInfoProvider::Get()->IsTouchCalibrationActive(params->id)) {
175 return RespondNow(Error( 303 return RespondNow(Error(
176 "Another touch calibration is already active.")); 304 "Another touch calibration is already active."));
177 } 305 }
178 if (!DisplayInfoProvider::Get()->TouchCalibrationReset(params->id)) 306 if (!DisplayInfoProvider::Get()->TouchCalibrationReset(params->id))
179 return RespondNow(Error("Invalid display ID: " + params->id)); 307 return RespondNow(Error("Invalid display ID: " + params->id));
180 return RespondNow(NoArguments()); 308 return RespondNow(NoArguments());
181 } 309 }
182 310
183 } // namespace extensions 311 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/api/system_display/BUILD.gn ('k') | extensions/browser/api/system_display/system_display_apitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698