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

#include "content/web_test/renderer/blink_test_helpers.h"

#include <string_view>

#include "base/command_line.h"
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "content/public/common/content_switches.h"
#include "content/web_test/common/web_test_switches.h"
#include "content/web_test/renderer/test_preferences.h"
#include "net/base/filename_util.h"
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
#include "ui/display/display.h"

#if BUILDFLAG(IS_MAC)
#include "base/apple/bundle_locations.h"
#include "base/apple/foundation_util.h"
#endif

using blink::WebURL;

namespace {

constexpr std::string_view kFileScheme = "file:///";

base::FilePath GetWebTestsFilePath() {
  static base::FilePath path;
  if (path.empty()) {
    base::FilePath root_path;
    bool success =
        base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &root_path);
    CHECK(success);
    path = root_path.Append(FILE_PATH_LITERAL("third_party/blink/web_tests/"));
  }
  return path;
}

base::FilePath GetExternalWPTFilePath() {
  static base::FilePath path;
  if (path.empty()) {
    base::FilePath root_path;
    bool success =
        base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &root_path);
    CHECK(success);
    path = root_path.Append(
        FILE_PATH_LITERAL("third_party/blink/web_tests/external/wpt"));
  }
  return path;
}

// WPT tests use absolute path links such as
//   <script src="/resources/testharness.js">.
// If we load the tests as local files (e.g. when we run
// `content_shell --run-web-tests manually for testing or debugging), such
// links don't work. This function fixes this issue by rewriting file: URLs
// which were produced from such links so that they point actual files under
// the WPT test directory.
//
// Note that this doesn't apply when the WPT tests are run by the python script.
WebURL RewriteWPTAbsolutePath(std::string_view utf8_url) {
  if (!utf8_url.starts_with(kFileScheme) ||
      utf8_url.find("/web_tests/") != std::string::npos) {
    return WebURL(GURL(utf8_url));
  }

#if BUILDFLAG(IS_WIN)
  // +3 for a drive letter, :, and /.
  static constexpr size_t kFileSchemeAndDriveLen = kFileScheme.size() + 3;
  if (utf8_url.size() <= kFileSchemeAndDriveLen)
    return WebURL();
  std::string_view path = utf8_url.substr(kFileSchemeAndDriveLen);
#else
  std::string_view path = utf8_url.substr(kFileScheme.size());
#endif
  base::FilePath new_path = GetExternalWPTFilePath().AppendASCII(path);
  return WebURL(net::FilePathToFileURL(new_path));
}

}  // namespace

namespace content {

void ExportWebTestSpecificPreferences(const TestPreferences& from,
                                      blink::web_pref::WebPreferences* to) {
  to->javascript_can_access_clipboard = from.java_script_can_access_clipboard;
  to->editing_behavior = from.editing_behavior;
  to->default_font_size = from.default_font_size;
  to->minimum_font_size = from.minimum_font_size;
  to->default_encoding = from.default_text_encoding_name.Utf8().data();
  to->javascript_enabled = from.java_script_enabled;
  to->supports_multiple_windows = from.supports_multiple_windows;
  to->loads_images_automatically = from.loads_images_automatically;
  to->plugins_enabled = from.plugins_enabled;
  to->tabs_to_links = from.tabs_to_links;
  // experimentalCSSRegionsEnabled is deprecated and ignored.
  to->hyperlink_auditing_enabled = from.hyperlink_auditing_enabled;
  to->allow_running_insecure_content = from.allow_running_of_insecure_content;
  to->allow_file_access_from_file_urls = from.allow_file_access_from_file_urls;
  to->web_security_enabled = from.web_security_enabled;
  to->disable_reading_from_canvas = from.disable_reading_from_canvas;
  to->strict_mixed_content_checking = from.strict_mixed_content_checking;
  to->strict_powerful_feature_restrictions =
      from.strict_powerful_feature_restrictions;
  to->spatial_navigation_enabled = from.spatial_navigation_enabled;
}

static base::FilePath GetBuildDirectory() {
#if BUILDFLAG(IS_MAC)
  if (base::apple::AmIBundled()) {
    // If this is a bundled Content Shell.app, go up one from the outer bundle
    // directory.
    return base::apple::OuterBundlePath().DirName();
  }
#endif

  base::FilePath result;
  bool success = base::PathService::Get(base::DIR_EXE, &result);
  CHECK(success);

  return result;
}

WebURL RewriteWebTestsURL(std::string_view utf8_url, bool is_wpt_mode) {
  if (is_wpt_mode)
    return RewriteWPTAbsolutePath(utf8_url);

  static constexpr std::string_view kGenPrefix = "file:///gen/";

  // Map "file:///gen/" to "file://<build directory>/gen/".
  if (utf8_url.starts_with(kGenPrefix)) {
    base::FilePath gen_directory_path =
        GetBuildDirectory().Append(FILE_PATH_LITERAL("gen/"));
    std::string new_url("file://");
    new_url.append(gen_directory_path.AsUTF8Unsafe());
    new_url.append(utf8_url.substr(kGenPrefix.size()));
    return WebURL(GURL(new_url));
  }

  static constexpr std::string_view kPrefix = "file:///tmp/web_tests/";

  if (!utf8_url.starts_with(kPrefix)) {
    return WebURL(GURL(utf8_url));
  }

  std::string new_url("file://");
  new_url.append(GetWebTestsFilePath().AsUTF8Unsafe());
  new_url.append(utf8_url.substr(kPrefix.size()));
  return WebURL(GURL(new_url));
}

WebURL RewriteFileURLToLocalResource(std::string_view resource) {
  return RewriteWebTestsURL(resource, /*is_wpt_mode=*/false);
}

bool IsWebPlatformTest(std::string_view test_url) {
  // ://web-platform.test is a part of the http/https URL of a wpt test run by
  // the python script.
  return test_url.find("://web-platform.test") != std::string::npos ||
         // These are part of the file URL of a wpt test run manually with
         // content_shell without a web server.
         test_url.find("/external/wpt/") != std::string::npos ||
         test_url.find("/wpt_internal/") != std::string::npos;
}

}  // namespace content
