Chromium Code Reviews| 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 |