// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_WEB_WEB_STATE_PAGE_VIEWPORT_STATE_H_
#define IOS_WEB_WEB_STATE_PAGE_VIEWPORT_STATE_H_

#import <Foundation/Foundation.h>

namespace web {

// Class to describe the viewport width or height.
class ViewportLength {
 public:
  // Default constructor.  Initializes values to false and NAN.
  explicit ViewportLength();
  // Constructor with the dimension value specified by the viewport tag.
  // Possible valid values include "device-width", "device-height", or numerical
  // strings.
  ViewportLength(NSString* value);
  ~ViewportLength();

  // Accessors.
  bool use_device_length() const { return use_device_length_; }
  double value() const { return value_; }

 private:
  // Whether the dimension is specified to use the device height/width.
  bool use_device_length_;
  // The hardcoded dimension value.  Will be NAN if unspecified or if
  // |use_device_length_| is true.
  double value_;
};

// Class that describes the viewport meta tag of a page.  The parsed values for
// this class correspond with the actual contents of viewport tag within the
// page's HTML.  The zoom scale values are often different than those recorded
// in a page's PageZoomState, which correspond to the web view's scroll view
// zooming properties.
class PageViewportState {
 public:
  // Default constructor.  Initializes all bools to false and doubles to NAN.
  explicit PageViewportState();
  // Constructor with a viewport tag's content string.
  explicit PageViewportState(NSString* viewport_content);
  ~PageViewportState();

  // Parses |viewport_content| and updates properties accordingly.
  void UpdateWithViewportContent(NSString* const viewport_content);

  // Accessors.
  bool viewport_tag_present() const { return viewport_tag_present_; }
  bool user_scalable() const { return user_scalable_; }
  const ViewportLength& width() const { return width_; }
  const ViewportLength& height() const { return height_; }
  double minimum_zoom_scale() const { return minimum_zoom_scale_; }
  double maximum_zoom_scale() const { return maximum_zoom_scale_; }
  double initial_zoom_scale() const { return initial_zoom_scale_; }

 private:
  // Whether the page has a viewport meta tag.
  bool viewport_tag_present_;
  // Whether the viewport tag allows user scalability.  Defaults to true if the
  // value is not found in the viewport tag's content.
  bool user_scalable_;
  // The specified width and height.
  ViewportLength width_;
  ViewportLength height_;
  // The minimum, maximum, and initial zoom scales.  These values are not always
  // the same as those reported in PageZoomState, as web views render various
  // viewport values differently.  These values will be NAN if they aren't
  // present in the extracted viewport tag.
  double minimum_zoom_scale_;
  double maximum_zoom_scale_;
  double initial_zoom_scale_;
};

}  // namespace web

#endif  // IOS_WEB_WEB_STATE_PAGE_VIEWPORT_STATE_H_
