display/ui: Restrict Internal Displays to Preferred Mode
Most internal panels expose a single native mode, and for those
internal displays with additional modes, Chrome does not have
use-cases which require those extra modes.
This CL restrict internal displays to expose only their preferred
mode to Chrome.
Test: ozone_unittests && display_unittests
Change-Id: I0f9480846dc7876992110aca0f28e81384a33cb2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2595621
Reviewed-by: Daniel Nicoara <[email protected]>
Commit-Queue: Gil Dekel <[email protected]>
Cr-Commit-Position: refs/heads/master@{#840218}
diff --git a/ui/display/manager/configure_displays_task.cc b/ui/display/manager/configure_displays_task.cc
index 7c3dd61..fb78ce8 100644
--- a/ui/display/manager/configure_displays_task.cc
+++ b/ui/display/manager/configure_displays_task.cc
@@ -16,6 +16,7 @@
#include "base/stl_util.h"
#include "ui/display/manager/display_util.h"
#include "ui/display/types/display_configuration_params.h"
+#include "ui/display/types/display_constants.h"
#include "ui/display/types/display_snapshot.h"
#include "ui/display/types/native_display_delegate.h"
@@ -34,6 +35,12 @@
// nullptr.
const DisplayMode* FindNextMode(const DisplaySnapshot& display_state,
const DisplayMode* display_mode) {
+ // Internal displays are restricted to their native mode. We do not attempt to
+ // downgrade their modes upon failure.
+ if (display_state.type() == DISPLAY_CONNECTION_TYPE_INTERNAL) {
+ return nullptr;
+ }
+
if (!display_mode)
return nullptr;
@@ -51,6 +58,28 @@
return best_mode;
}
+void LogIfInvalidRequestForInternalDisplay(
+ const DisplayConfigureRequest& request) {
+ if (request.display->type() != DISPLAY_CONNECTION_TYPE_INTERNAL)
+ return;
+
+ if (request.mode == nullptr)
+ return;
+
+ if (request.mode == request.display->native_mode())
+ return;
+
+ LOG(ERROR) << "A mode other than the preferred mode was requested for the "
+ "internal display: preferred="
+ << request.display->native_mode()->ToString()
+ << " vs. requested=" << request.mode->ToString()
+ << ". Current mode="
+ << (request.display->current_mode()
+ ? request.display->current_mode()->ToString()
+ : "nullptr (disabled)")
+ << ".";
+}
+
// Samples used to define buckets used by DisplayResolution enum.
// The enum is used to record screen resolution statistics.
const int32_t kDisplayResolutionSamples[] = {1024, 1280, 1440, 1920,
@@ -185,6 +214,8 @@
std::vector<display::DisplayConfigurationParams> config_requests;
for (const auto& request : requests_) {
+ LogIfInvalidRequestForInternalDisplay(request);
+
config_requests.emplace_back(request.display->display_id(), request.origin,
request.mode);