| Index: content/browser/renderer_host/dip_util.cc
|
| diff --git a/content/browser/renderer_host/dip_util.cc b/content/browser/renderer_host/dip_util.cc
|
| index 225d17bcb44f8733049a79adc6c1ca29ba51de89..95330ab5f797d30e809395de1433fc35eef16367 100644
|
| --- a/content/browser/renderer_host/dip_util.cc
|
| +++ b/content/browser/renderer_host/dip_util.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "content/browser/renderer_host/dip_util.h"
|
|
|
| +#include "cc/output/compositor_frame_metadata.h"
|
| #include "content/public/browser/render_widget_host_view.h"
|
| #include "ui/base/layout.h"
|
| #include "ui/gfx/display.h"
|
| @@ -16,6 +17,28 @@
|
| #include "ui/gfx/geometry/size_conversions.h"
|
| #include "ui/gfx/screen.h"
|
|
|
| +namespace {
|
| +
|
| +// Used to accomodate finite precision when comparing scaled viewport and
|
| +// content widths. While this value may seem large, width=device-width on an N7
|
| +// V1 saw errors of ~0.065 between computed window and content widths.
|
| +const float kMobileViewportWidthEpsilon = 0.15f;
|
| +
|
| +bool HasFixedPageScale(const cc::CompositorFrameMetadata& frame_metadata) {
|
| + return frame_metadata.min_page_scale_factor ==
|
| + frame_metadata.max_page_scale_factor;
|
| +}
|
| +
|
| +bool HasMobileViewport(const cc::CompositorFrameMetadata& frame_metadata) {
|
| + float window_width_dip =
|
| + frame_metadata.page_scale_factor *
|
| + frame_metadata.scrollable_viewport_size.width();
|
| + float content_width_css = frame_metadata.root_layer_size.width();
|
| + return content_width_css <= window_width_dip + kMobileViewportWidthEpsilon;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| namespace content {
|
|
|
| float GetScaleFactorForView(const RenderWidgetHostView* view) {
|
| @@ -37,4 +60,14 @@ gfx::Rect ConvertViewRectToPixel(const RenderWidgetHostView* view,
|
| return gfx::ConvertRectToPixel(GetScaleFactorForView(view), rect_in_dip);
|
| }
|
|
|
| +bool IsMobileOptimizedFrame(const cc::CompositorFrameMetadata& frame_metadata) {
|
| + // Disable double tap zoom for pages that have a width=device-width or
|
| + // narrower viewport (indicating that this is a mobile-optimized or responsive
|
| + // web design, so text will be legible without zooming). Also disable
|
| + // double tap and pinch for pages that prevent zooming in or out.
|
| + bool has_mobile_viewport = HasMobileViewport(frame_metadata);
|
| + bool has_fixed_page_scale = HasFixedPageScale(frame_metadata);
|
| + return !has_fixed_page_scale && !has_mobile_viewport;
|
| +}
|
| +
|
| } // namespace content
|
|
|