// Copyright 2017 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.

#import <ChromeWebView/ChromeWebView.h>
#import <Foundation/Foundation.h>

#include "base/strings/stringprintf.h"
#import "base/strings/sys_string_conversions.h"
#import "ios/web_view/test/observer.h"
#import "ios/web_view/test/web_view_inttest_base.h"
#import "ios/web_view/test/web_view_test_util.h"
#import "net/base/mac/url_conversions.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gtest_mac.h"
#include "url/gurl.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

namespace ios_web_view {

// Tests that the KVO compliant properties of CWVWebView correctly report
// changes.
typedef ios_web_view::WebViewInttestBase WebViewKvoTest;

// Tests that CWVWebView correctly reports |canGoBack| and |canGoForward| state.
TEST_F(WebViewKvoTest, CanGoBackForward) {
  ASSERT_TRUE(test_server_->Start());

  Observer* back_observer = [[Observer alloc] init];
  [back_observer setObservedObject:web_view_ keyPath:@"canGoBack"];

  Observer* forward_observer = [[Observer alloc] init];
  [forward_observer setObservedObject:web_view_ keyPath:@"canGoForward"];

  ASSERT_FALSE(back_observer.lastValue);
  ASSERT_FALSE(forward_observer.lastValue);

  // Define pages in reverse order so the links can reference the "next" page.
  GURL page_3_url = GetUrlForPageWithTitleAndBody("Page 3", "Body 3");

  std::string page_2_html =
      "<a id='link_2' href='" + page_3_url.spec() + "'>Link 2</a>";
  GURL page_2_url = GetUrlForPageWithHtmlBody(page_2_html);

  std::string page_1_html =
      "<a id='link_1' href='" + page_2_url.spec() + "'>Link 1</a>";
  GURL page_1_url = GetUrlForPageWithHtmlBody(page_1_html);

  ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page_1_url)));
  // Loading initial URL should not affect back/forward navigation state.
  EXPECT_FALSE([back_observer.lastValue boolValue]);
  EXPECT_FALSE([forward_observer.lastValue boolValue]);

  // Navigate to page 2.
  EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 2"));
  EXPECT_TRUE([back_observer.lastValue boolValue]);
  EXPECT_FALSE([forward_observer.lastValue boolValue]);

  // Navigate back to page 1.
  [web_view_ goBack];
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  EXPECT_FALSE([back_observer.lastValue boolValue]);
  EXPECT_TRUE([forward_observer.lastValue boolValue]);

  // Navigate forward to page 2.
  [web_view_ goForward];
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 2"));
  EXPECT_TRUE([back_observer.lastValue boolValue]);
  EXPECT_FALSE([forward_observer.lastValue boolValue]);

  // Navigate to page 3.
  EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_2"));
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 3"));
  EXPECT_TRUE([back_observer.lastValue boolValue]);
  EXPECT_FALSE([forward_observer.lastValue boolValue]);

  // Navigate back to page 2.
  [web_view_ goBack];
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 2"));
  EXPECT_TRUE([back_observer.lastValue boolValue]);
  EXPECT_TRUE([forward_observer.lastValue boolValue]);
}

// Tests that CWVWebView correctly reports current |title|.
TEST_F(WebViewKvoTest, Title) {
  ASSERT_TRUE(test_server_->Start());

  Observer* observer = [[Observer alloc] init];
  [observer setObservedObject:web_view_ keyPath:@"title"];

  NSString* page_2_title = @"Page 2";
  GURL page_2_url = GetUrlForPageWithTitleAndBody(
      base::SysNSStringToUTF8(page_2_title), "Body 2");

  NSString* page_1_title = @"Page 1";
  std::string page_1_html = base::StringPrintf(
      "<a id='link_1' href='%s'>Link 1</a>", page_2_url.spec().c_str());
  GURL page_1_url = GetUrlForPageWithTitleAndBody(
      base::SysNSStringToUTF8(page_1_title), page_1_html);

  ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page_1_url)));
  EXPECT_NSEQ(page_1_title, observer.lastValue);

  // Navigate to page 2.
  EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 2"));
  EXPECT_NSEQ(page_2_title, observer.lastValue);

  // Navigate back to page 1.
  [web_view_ goBack];
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  EXPECT_NSEQ(page_1_title, observer.lastValue);
}

// Tests that CWVWebView correctly reports |isLoading| value.
TEST_F(WebViewKvoTest, Loading) {
  ASSERT_TRUE(test_server_->Start());

  Observer* observer = [[Observer alloc] init];
  [observer setObservedObject:web_view_ keyPath:@"loading"];

  GURL page_2_url = GetUrlForPageWithTitleAndBody("Page 2", "Body 2");

  std::string page_1_html = base::StringPrintf(
      "<a id='link_1' href='%s'>Link 1</a>", page_2_url.spec().c_str());
  GURL page_1_url = GetUrlForPageWithTitleAndBody("Page 1", page_1_html);

  ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page_1_url)));
  EXPECT_TRUE([observer.previousValue boolValue]);
  EXPECT_FALSE([observer.lastValue boolValue]);

  // Navigate to page 2.
  EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 2"));
  EXPECT_TRUE([observer.previousValue boolValue]);
  EXPECT_FALSE([observer.lastValue boolValue]);

  // Navigate back to page 1.
  [web_view_ goBack];
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  EXPECT_TRUE([observer.previousValue boolValue]);
  EXPECT_FALSE([observer.lastValue boolValue]);
}

// Tests that CWVWebView correctly reports |visibleURL| and |lastCommittedURL|.
TEST_F(WebViewKvoTest, URLs) {
  ASSERT_TRUE(test_server_->Start());

  Observer* last_committed_url_observer = [[Observer alloc] init];
  [last_committed_url_observer setObservedObject:web_view_
                                         keyPath:@"lastCommittedURL"];

  Observer* visible_url_observer = [[Observer alloc] init];
  [visible_url_observer setObservedObject:web_view_ keyPath:@"visibleURL"];

  GURL page_2 = GetUrlForPageWithTitleAndBody("Page 2", "Body 2");
  NSURL* page_2_url = net::NSURLWithGURL(page_2);

  std::string page_1_html = base::StringPrintf(
      "<a id='link_1' href='%s'>Link 1</a>", page_2.spec().c_str());
  NSURL* page_1_url =
      net::NSURLWithGURL(GetUrlForPageWithTitleAndBody("Page 1", page_1_html));

  [web_view_ loadRequest:[NSURLRequest requestWithURL:page_1_url]];

  // |visibleURL| will update immediately
  EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);

  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  EXPECT_NSEQ(page_1_url, last_committed_url_observer.lastValue);
  EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);

  // Navigate to page 2.
  EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 2"));
  EXPECT_NSEQ(page_2_url, last_committed_url_observer.lastValue);
  EXPECT_NSEQ(page_2_url, visible_url_observer.lastValue);

  // Navigate back to page 1.
  [web_view_ goBack];
  ASSERT_TRUE(
      test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  EXPECT_NSEQ(page_1_url, last_committed_url_observer.lastValue);
  EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);
}

}  // namespace ios_web_view
