| Index: content/browser/devtools/protocol/emulation_handler.cc
 | 
| diff --git a/content/browser/devtools/protocol/emulation_handler.cc b/content/browser/devtools/protocol/emulation_handler.cc
 | 
| index 12c377a4fc84eab5396d2d195ded5158134a463f..da4a13da485e762f35e49a94c834f7124b5e73f0 100644
 | 
| --- a/content/browser/devtools/protocol/emulation_handler.cc
 | 
| +++ b/content/browser/devtools/protocol/emulation_handler.cc
 | 
| @@ -146,7 +146,14 @@ Response EmulationHandler::SetDeviceMetricsOverride(
 | 
|      const int* screen_height,
 | 
|      const int* position_x,
 | 
|      const int* position_y,
 | 
| -    const std::unique_ptr<base::DictionaryValue>& screen_orientation) {
 | 
| +    const std::unique_ptr<base::DictionaryValue>& screen_orientation,
 | 
| +    const int* scroll_position_x,
 | 
| +    const int* scroll_position_y,
 | 
| +    const int* visual_viewport_width,
 | 
| +    const int* visual_viewport_height,
 | 
| +    const double* visual_viewport_position_x,
 | 
| +    const double* visual_viewport_position_y,
 | 
| +    const double* visual_viewport_scale) {
 | 
|    const static int max_size = 10000000;
 | 
|    const static double max_scale = 10;
 | 
|    const static int max_orientation_angle = 360;
 | 
| @@ -207,6 +214,44 @@ Response EmulationHandler::SetDeviceMetricsOverride(
 | 
|      }
 | 
|    }
 | 
|  
 | 
| +  if ((scroll_position_x &&
 | 
| +       (*scroll_position_x < 0 || *scroll_position_x > max_size)) ||
 | 
| +      (scroll_position_y &&
 | 
| +       (*scroll_position_y < 0 || *scroll_position_y > max_size))) {
 | 
| +    return Response::InvalidParams(
 | 
| +        "Scroll position coordinates must be non-negative, not greater than " +
 | 
| +        base::IntToString(max_size));
 | 
| +  }
 | 
| +
 | 
| +  if ((visual_viewport_width &&
 | 
| +       (*visual_viewport_width < 0 || *visual_viewport_width > max_size)) ||
 | 
| +      (visual_viewport_height &&
 | 
| +       (*visual_viewport_height < 0 || *visual_viewport_height > max_size))) {
 | 
| +    return Response::InvalidParams(
 | 
| +        "Visible_width and visible_height values must be positive, not greater "
 | 
| +        "than " +
 | 
| +        base::IntToString(max_size));
 | 
| +  }
 | 
| +
 | 
| +  if ((visual_viewport_position_x &&
 | 
| +       (*visual_viewport_position_x < 0 ||
 | 
| +        *visual_viewport_position_x > max_size)) ||
 | 
| +      (visual_viewport_position_y &&
 | 
| +       (*visual_viewport_position_y < 0 ||
 | 
| +        *visual_viewport_position_y > max_size))) {
 | 
| +    return Response::InvalidParams(
 | 
| +        "Visual viewport position coordinates must be non-negative, not "
 | 
| +        "greater than " +
 | 
| +        base::IntToString(max_size));
 | 
| +  }
 | 
| +
 | 
| +  if (visual_viewport_scale &&
 | 
| +      (*visual_viewport_scale <= 0 || *visual_viewport_scale > max_scale)) {
 | 
| +    return Response::InvalidParams(
 | 
| +        "Scale must be positive and not greater than " +
 | 
| +        base::DoubleToString(max_scale));
 | 
| +  }
 | 
| +
 | 
|    blink::WebDeviceEmulationParams params;
 | 
|    params.screenPosition = mobile ? blink::WebDeviceEmulationParams::Mobile :
 | 
|        blink::WebDeviceEmulationParams::Desktop;
 | 
| @@ -223,6 +268,17 @@ Response EmulationHandler::SetDeviceMetricsOverride(
 | 
|        optional_offset_y ? *optional_offset_y : 0.f);
 | 
|    params.screenOrientationType = orientationType;
 | 
|    params.screenOrientationAngle = orientationAngle;
 | 
| +  params.scrollPosition =
 | 
| +      blink::WebPoint(scroll_position_x ? *scroll_position_x : -1,
 | 
| +                      scroll_position_y ? *scroll_position_y : -1);
 | 
| +  params.visualViewportSize =
 | 
| +      blink::WebSize(visual_viewport_width ? *visual_viewport_width : 0,
 | 
| +                     visual_viewport_height ? *visual_viewport_height : 0);
 | 
| +  params.visualViewportPosition = blink::WebFloatPoint(
 | 
| +      visual_viewport_position_x ? *visual_viewport_position_x : -1,
 | 
| +      visual_viewport_position_y ? *visual_viewport_position_y : -1);
 | 
| +  params.visualViewportScale =
 | 
| +      visual_viewport_scale ? *visual_viewport_scale : 0;
 | 
|  
 | 
|    if (device_emulation_enabled_ && params == device_emulation_params_)
 | 
|      return Response::OK();
 | 
| @@ -266,6 +322,7 @@ void EmulationHandler::UpdateDeviceEmulationState() {
 | 
|        host_ ? host_->GetRenderWidgetHost() : nullptr;
 | 
|    if (!widget_host)
 | 
|      return;
 | 
| +
 | 
|    if (device_emulation_enabled_) {
 | 
|      widget_host->Send(new ViewMsg_EnableDeviceEmulation(
 | 
|          widget_host->GetRoutingID(), device_emulation_params_));
 | 
| 
 |