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

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

Issue 2558453004: SystemDisplayApi: Introdice OverscanTracker (Closed)
Patch Set: 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 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698