| Index: ui/display/chromeos/display_configurator.cc
 | 
| diff --git a/ui/display/chromeos/display_configurator.cc b/ui/display/chromeos/display_configurator.cc
 | 
| index a224288fbec9bd3b229bf8b2fec05ff3f7b7ba0e..6be8daa9f09847beeff5f75c13966761e82be971 100644
 | 
| --- a/ui/display/chromeos/display_configurator.cc
 | 
| +++ b/ui/display/chromeos/display_configurator.cc
 | 
| @@ -32,22 +32,29 @@ const int kConfigureDelayMs = 500;
 | 
|  // such that we read an up to date state.
 | 
|  const int kResumeDelayMs = 500;
 | 
|  
 | 
| +struct DisplayState {
 | 
| +  DisplayState()
 | 
| +      : display(nullptr), selected_mode(nullptr), mirror_mode(nullptr) {}
 | 
| +
 | 
| +  DisplaySnapshot* display;  // Not owned.
 | 
| +
 | 
| +  // User-selected mode for the display.
 | 
| +  const DisplayMode* selected_mode;
 | 
| +
 | 
| +  // Mode used when displaying the same desktop on multiple displays.
 | 
| +  const DisplayMode* mirror_mode;
 | 
| +};
 | 
| +
 | 
|  void DoNothing(bool status) {
 | 
|  }
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| -
 | 
|  const int DisplayConfigurator::kSetDisplayPowerNoFlags = 0;
 | 
|  const int DisplayConfigurator::kSetDisplayPowerForceProbe = 1 << 0;
 | 
|  const int
 | 
|  DisplayConfigurator::kSetDisplayPowerOnlyIfSingleInternalDisplay = 1 << 1;
 | 
|  
 | 
| -DisplayConfigurator::DisplayState::DisplayState()
 | 
| -    : display(NULL),
 | 
| -      selected_mode(NULL),
 | 
| -      mirror_mode(NULL) {}
 | 
| -
 | 
|  bool DisplayConfigurator::TestApi::TriggerConfigureTimeout() {
 | 
|    if (configurator_->configure_timer_.IsRunning()) {
 | 
|      configurator_->configure_timer_.user_task().Run();
 | 
| @@ -72,15 +79,20 @@ class DisplayConfigurator::DisplayLayoutManagerImpl
 | 
|    StateController* GetStateController() const override;
 | 
|    MultipleDisplayState GetDisplayState() const override;
 | 
|    chromeos::DisplayPowerState GetPowerState() const override;
 | 
| -  std::vector<DisplayState> ParseDisplays(
 | 
| -      const std::vector<DisplaySnapshot*>& displays) const override;
 | 
| -  bool GetDisplayLayout(const std::vector<DisplayState>& displays,
 | 
| +  bool GetDisplayLayout(const std::vector<DisplaySnapshot*>& displays,
 | 
|                          MultipleDisplayState new_display_state,
 | 
|                          chromeos::DisplayPowerState new_power_state,
 | 
|                          std::vector<DisplayConfigureRequest>* requests,
 | 
|                          gfx::Size* framebuffer_size) const override;
 | 
|  
 | 
|   private:
 | 
| +  // Parses the |displays| into a list of DisplayStates. This effectively adds
 | 
| +  // |mirror_mode| and |selected_mode| to the returned results.
 | 
| +  // TODO(dnicoara): Break this into GetSelectedMode() and GetMirrorMode() and
 | 
| +  // remove DisplayState.
 | 
| +  std::vector<DisplayState> ParseDisplays(
 | 
| +      const std::vector<DisplaySnapshot*>& displays) const;
 | 
| +
 | 
|    // Helper method for ParseDisplays() that initializes the passed-in
 | 
|    // displays' |mirror_mode| fields by looking for a mode in |internal_display|
 | 
|    // and |external_display| having the same resolution. Returns false if a
 | 
| @@ -132,7 +144,7 @@ DisplayConfigurator::DisplayLayoutManagerImpl::GetPowerState() const {
 | 
|    return configurator_->current_power_state_;
 | 
|  }
 | 
|  
 | 
| -std::vector<DisplayConfigurator::DisplayState>
 | 
| +std::vector<DisplayState>
 | 
|  DisplayConfigurator::DisplayLayoutManagerImpl::ParseDisplays(
 | 
|      const std::vector<DisplaySnapshot*>& snapshots) const {
 | 
|    std::vector<DisplayState> cached_displays;
 | 
| @@ -201,11 +213,12 @@ DisplayConfigurator::DisplayLayoutManagerImpl::ParseDisplays(
 | 
|  }
 | 
|  
 | 
|  bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
 | 
| -    const std::vector<DisplayState>& displays,
 | 
| +    const std::vector<DisplaySnapshot*>& displays,
 | 
|      MultipleDisplayState new_display_state,
 | 
|      chromeos::DisplayPowerState new_power_state,
 | 
|      std::vector<DisplayConfigureRequest>* requests,
 | 
|      gfx::Size* framebuffer_size) const {
 | 
| +  std::vector<DisplayState> states = ParseDisplays(displays);
 | 
|    std::vector<bool> display_power;
 | 
|    int num_on_displays =
 | 
|        GetDisplayPower(displays, new_power_state, &display_power);
 | 
| @@ -218,8 +231,7 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
 | 
|  
 | 
|    for (size_t i = 0; i < displays.size(); ++i) {
 | 
|      requests->push_back(DisplayConfigureRequest(
 | 
| -        displays[i].display, displays[i].display->current_mode(),
 | 
| -        gfx::Point()));
 | 
| +        displays[i], displays[i]->current_mode(), gfx::Point()));
 | 
|    }
 | 
|  
 | 
|    switch (new_display_state) {
 | 
| @@ -243,11 +255,11 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
 | 
|          return false;
 | 
|        }
 | 
|  
 | 
| -      for (size_t i = 0; i < displays.size(); ++i) {
 | 
| -        const DisplayConfigurator::DisplayState* state = &displays[i];
 | 
| +      for (size_t i = 0; i < states.size(); ++i) {
 | 
| +        const DisplayState* state = &states[i];
 | 
|          (*requests)[i].mode = display_power[i] ? state->selected_mode : NULL;
 | 
|  
 | 
| -        if (display_power[i] || displays.size() == 1) {
 | 
| +        if (display_power[i] || states.size() == 1) {
 | 
|            const DisplayMode* mode_info = state->selected_mode;
 | 
|            if (!mode_info) {
 | 
|              LOG(WARNING) << "No selected mode when configuring display: "
 | 
| @@ -256,7 +268,7 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
 | 
|            }
 | 
|            if (mode_info->size() == gfx::Size(1024, 768)) {
 | 
|              VLOG(1) << "Potentially misdetecting display(1024x768):"
 | 
| -                    << " displays size=" << displays.size()
 | 
| +                    << " displays size=" << states.size()
 | 
|                      << ", num_on_displays=" << num_on_displays
 | 
|                      << ", current size:" << size.width() << "x" << size.height()
 | 
|                      << ", i=" << i << ", display=" << state->display->ToString()
 | 
| @@ -268,24 +280,24 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
 | 
|        break;
 | 
|      }
 | 
|      case MULTIPLE_DISPLAY_STATE_DUAL_MIRROR: {
 | 
| -      if (displays.size() != 2 ||
 | 
| +      if (states.size() != 2 ||
 | 
|            (num_on_displays != 0 && num_on_displays != 2)) {
 | 
|          LOG(WARNING) << "Ignoring request to enter mirrored mode with "
 | 
| -                     << displays.size() << " connected display(s) and "
 | 
| +                     << states.size() << " connected display(s) and "
 | 
|                       << num_on_displays << " turned on";
 | 
|          return false;
 | 
|        }
 | 
|  
 | 
| -      const DisplayMode* mode_info = displays[0].mirror_mode;
 | 
| +      const DisplayMode* mode_info = states[0].mirror_mode;
 | 
|        if (!mode_info) {
 | 
|          LOG(WARNING) << "No mirror mode when configuring display: "
 | 
| -                     << displays[0].display->ToString();
 | 
| +                     << states[0].display->ToString();
 | 
|          return false;
 | 
|        }
 | 
|        size = mode_info->size();
 | 
|  
 | 
| -      for (size_t i = 0; i < displays.size(); ++i) {
 | 
| -        const DisplayConfigurator::DisplayState* state = &displays[i];
 | 
| +      for (size_t i = 0; i < states.size(); ++i) {
 | 
| +        const DisplayState* state = &states[i];
 | 
|          (*requests)[i].mode = display_power[i] ? state->mirror_mode : NULL;
 | 
|        }
 | 
|        break;
 | 
| @@ -293,19 +305,19 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
 | 
|      case MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED:
 | 
|      case MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED: {
 | 
|        if ((new_display_state == MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED &&
 | 
| -           displays.size() != 2) ||
 | 
| +           states.size() != 2) ||
 | 
|            (new_display_state == MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED &&
 | 
| -           displays.size() <= 2) ||
 | 
| +           states.size() <= 2) ||
 | 
|            (num_on_displays != 0 &&
 | 
|             num_on_displays != static_cast<int>(displays.size()))) {
 | 
|          LOG(WARNING) << "Ignoring request to enter extended mode with "
 | 
| -                     << displays.size() << " connected display(s) and "
 | 
| +                     << states.size() << " connected display(s) and "
 | 
|                       << num_on_displays << " turned on";
 | 
|          return false;
 | 
|        }
 | 
|  
 | 
| -      for (size_t i = 0; i < displays.size(); ++i) {
 | 
| -        const DisplayConfigurator::DisplayState* state = &displays[i];
 | 
| +      for (size_t i = 0; i < states.size(); ++i) {
 | 
| +        const DisplayState* state = &states[i];
 | 
|          (*requests)[i].origin.set_y(size.height() ? size.height() + kVerticalGap
 | 
|                                                    : 0);
 | 
|          (*requests)[i].mode = display_power[i] ? state->selected_mode : NULL;
 | 
| @@ -313,7 +325,7 @@ bool DisplayConfigurator::DisplayLayoutManagerImpl::GetDisplayLayout(
 | 
|          // Retain the full screen size even if all displays are off so the
 | 
|          // same desktop configuration can be restored when the displays are
 | 
|          // turned back on.
 | 
| -        const DisplayMode* mode_info = displays[i].selected_mode;
 | 
| +        const DisplayMode* mode_info = states[i].selected_mode;
 | 
|          if (!mode_info) {
 | 
|            LOG(WARNING) << "No selected mode when configuring display: "
 | 
|                         << state->display->ToString();
 | 
| @@ -561,12 +573,12 @@ bool DisplayConfigurator::ApplyProtections(const ContentProtections& requests) {
 | 
|             ++request_it)
 | 
|          all_desired |= request_it->second;
 | 
|      } else {
 | 
| -      request_it = requests.find(it->display->display_id());
 | 
| +      request_it = requests.find((*it)->display_id());
 | 
|        if (request_it != requests.end())
 | 
|          all_desired = request_it->second;
 | 
|      }
 | 
|  
 | 
| -    switch (it->display->type()) {
 | 
| +    switch ((*it)->type()) {
 | 
|        case DISPLAY_CONNECTION_TYPE_UNKNOWN:
 | 
|          return false;
 | 
|        // DisplayPort, DVI, and HDMI all support HDCP.
 | 
| @@ -576,8 +588,7 @@ bool DisplayConfigurator::ApplyProtections(const ContentProtections& requests) {
 | 
|          HDCPState current_state;
 | 
|          // Need to poll the driver for updates since other applications may
 | 
|          // have updated the state.
 | 
| -        if (!native_display_delegate_->GetHDCPState(*it->display,
 | 
| -                                                    ¤t_state))
 | 
| +        if (!native_display_delegate_->GetHDCPState(**it, ¤t_state))
 | 
|            return false;
 | 
|          bool current_desired = (current_state != HDCP_STATE_UNDESIRED);
 | 
|          bool new_desired = (all_desired & CONTENT_PROTECTION_METHOD_HDCP);
 | 
| @@ -586,7 +597,7 @@ bool DisplayConfigurator::ApplyProtections(const ContentProtections& requests) {
 | 
|          if (current_desired != new_desired) {
 | 
|            HDCPState new_state =
 | 
|                new_desired ? HDCP_STATE_DESIRED : HDCP_STATE_UNDESIRED;
 | 
| -          if (!native_display_delegate_->SetHDCPState(*it->display, new_state))
 | 
| +          if (!native_display_delegate_->SetHDCPState(**it, new_state))
 | 
|              return false;
 | 
|          }
 | 
|          break;
 | 
| @@ -647,11 +658,11 @@ bool DisplayConfigurator::QueryContentProtectionStatus(
 | 
|         it != cached_displays_.end();
 | 
|         ++it) {
 | 
|      // Query display if it is in mirror mode or client on the same display.
 | 
| -    if (!IsMirroring() && it->display->display_id() != display_id)
 | 
| +    if (!IsMirroring() && (*it)->display_id() != display_id)
 | 
|        continue;
 | 
|  
 | 
| -    *link_mask |= it->display->type();
 | 
| -    switch (it->display->type()) {
 | 
| +    *link_mask |= (*it)->type();
 | 
| +    switch ((*it)->type()) {
 | 
|        case DISPLAY_CONNECTION_TYPE_UNKNOWN:
 | 
|          return false;
 | 
|        // DisplayPort, DVI, and HDMI all support HDCP.
 | 
| @@ -659,7 +670,7 @@ bool DisplayConfigurator::QueryContentProtectionStatus(
 | 
|        case DISPLAY_CONNECTION_TYPE_DVI:
 | 
|        case DISPLAY_CONNECTION_TYPE_HDMI: {
 | 
|          HDCPState state;
 | 
| -        if (!native_display_delegate_->GetHDCPState(*it->display, &state))
 | 
| +        if (!native_display_delegate_->GetHDCPState(**it, &state))
 | 
|            return false;
 | 
|          if (state == HDCP_STATE_ENABLED)
 | 
|            enabled |= CONTENT_PROTECTION_METHOD_HDCP;
 | 
| @@ -735,10 +746,9 @@ DisplayConfigurator::GetAvailableColorCalibrationProfiles(int64_t display_id) {
 | 
|    if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
 | 
|            switches::kDisableDisplayColorCalibration)) {
 | 
|      for (size_t i = 0; i < cached_displays_.size(); ++i) {
 | 
| -      if (cached_displays_[i].display &&
 | 
| -          cached_displays_[i].display->display_id() == display_id) {
 | 
| +      if (cached_displays_[i]->display_id() == display_id) {
 | 
|          return native_display_delegate_->GetAvailableColorCalibrationProfiles(
 | 
| -            *cached_displays_[i].display);
 | 
| +            *cached_displays_[i]);
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| @@ -750,10 +760,9 @@ bool DisplayConfigurator::SetColorCalibrationProfile(
 | 
|      int64_t display_id,
 | 
|      ui::ColorCalibrationProfile new_profile) {
 | 
|    for (size_t i = 0; i < cached_displays_.size(); ++i) {
 | 
| -    if (cached_displays_[i].display &&
 | 
| -        cached_displays_[i].display->display_id() == display_id) {
 | 
| +    if (cached_displays_[i]->display_id() == display_id) {
 | 
|        return native_display_delegate_->SetColorCalibrationProfile(
 | 
| -          *cached_displays_[i].display, new_profile);
 | 
| +          *cached_displays_[i], new_profile);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -925,7 +934,7 @@ void DisplayConfigurator::RunPendingConfiguration() {
 | 
|  
 | 
|  void DisplayConfigurator::OnConfigured(
 | 
|      bool success,
 | 
| -    const std::vector<DisplayState>& displays,
 | 
| +    const std::vector<DisplaySnapshot*>& displays,
 | 
|      const gfx::Size& framebuffer_size,
 | 
|      MultipleDisplayState new_display_state,
 | 
|      chromeos::DisplayPowerState new_power_state) {
 | 
| 
 |