page_viewport_state.mm 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #import "ios/web/web_state/page_viewport_state.h"
  5. #if !defined(__has_feature) || !__has_feature(objc_arc)
  6. #error "This file requires ARC support."
  7. #endif
  8. namespace {
  9. // Parses a double from |viewport_content|. |viewport_content| is expected to
  10. // have no leading whitespace.
  11. double ParseDouble(NSString* viewport_content) {
  12. double value = [viewport_content doubleValue];
  13. // |-doubleValue| returns zero when parsing a non-numerical string, so check
  14. // that the string actually contains zero to verify that the value was
  15. // represented in the string.
  16. if (!value && ![viewport_content hasPrefix:@"0"])
  17. value = NAN;
  18. return value;
  19. }
  20. }
  21. namespace web {
  22. ViewportLength::ViewportLength() : use_device_length_(false), value_(NAN) {}
  23. ViewportLength::ViewportLength(NSString* value) : ViewportLength() {
  24. use_device_length_ = ![value caseInsensitiveCompare:@"device-width"] ||
  25. ![value caseInsensitiveCompare:@"device-height"];
  26. if (!use_device_length_)
  27. value_ = ParseDouble(value);
  28. }
  29. ViewportLength::~ViewportLength() {}
  30. PageViewportState::PageViewportState()
  31. : viewport_tag_present_(false),
  32. user_scalable_(false),
  33. minimum_zoom_scale_(NAN),
  34. maximum_zoom_scale_(NAN),
  35. initial_zoom_scale_(NAN) {}
  36. PageViewportState::PageViewportState(NSString* const viewport_content)
  37. : PageViewportState() {
  38. UpdateWithViewportContent(viewport_content);
  39. }
  40. PageViewportState::~PageViewportState() {}
  41. void PageViewportState::UpdateWithViewportContent(
  42. NSString* const viewport_content) {
  43. viewport_tag_present_ = viewport_content.length > 0;
  44. if (!viewport_tag_present_)
  45. return;
  46. // Pages are scalable by default, unless prohibited by the viewport tag.
  47. user_scalable_ = true;
  48. NSCharacterSet* whitespace_set =
  49. [NSCharacterSet whitespaceAndNewlineCharacterSet];
  50. NSArray* content_items = [viewport_content componentsSeparatedByString:@","];
  51. for (NSString* item in content_items) {
  52. NSArray* components = [item componentsSeparatedByString:@"="];
  53. if (components.count == 2) {
  54. NSString* name = [[components firstObject]
  55. stringByTrimmingCharactersInSet:whitespace_set];
  56. NSString* value = [[components lastObject]
  57. stringByTrimmingCharactersInSet:whitespace_set];
  58. if (![name caseInsensitiveCompare:@"user-scalable"]) {
  59. user_scalable_ = [value boolValue];
  60. } else if (![name caseInsensitiveCompare:@"width"]) {
  61. width_ = ViewportLength(value);
  62. } else if (![name caseInsensitiveCompare:@"height"]) {
  63. height_ = ViewportLength(value);
  64. } else if (![name caseInsensitiveCompare:@"minimum-scale"]) {
  65. minimum_zoom_scale_ = ParseDouble(value);
  66. } else if (![name caseInsensitiveCompare:@"maximum-scale"]) {
  67. maximum_zoom_scale_ = ParseDouble(value);
  68. } else if (![name caseInsensitiveCompare:@"initial-scale"]) {
  69. initial_zoom_scale_ = ParseDouble(value);
  70. }
  71. }
  72. }
  73. }
  74. } // namespace web