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);