15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_version_info.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_version_info_win.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/navigation_constraints.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/registry_list_preferences_holder.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome_frame/test/chrome_frame_test_utils.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/utils.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kChannelName[] = L"-dev";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kSuffix[] = L"-fix";
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Registry override in the UtilsTest will cause shell APIs to fail
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// So separate this test from the rest
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SimpleUtilTests, GetTempInternetFiles) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path = GetIETemporaryFilesFolder();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(path.empty());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UtilTests : public testing::Test {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUp() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteAllSingletons();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TearDown() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_virtualization_.RemoveAllOverrides();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is used to manage life cycle of PolicySettings singleton.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // base::ShadowingAtExitManager at_exit_manager_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome_frame_test::ScopedVirtualizeHklmAndHkcu registry_virtualization_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, GetModuleVersionTest) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HMODULE mod = GetModuleHandle(L"kernel32.dll");
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(mod, static_cast<HMODULE>(NULL));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t path[MAX_PATH] = {0};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetModuleFileName(mod, path, arraysize(path));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use the method that goes to disk
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FileVersionInfo> base_info(
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FileVersionInfo::CreateFileVersionInfo(base::FilePath(path)));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base_info.get() != NULL);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use the method that doesn't go to disk
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 low = 0, high = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetModuleVersion(mod, &high, &low));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(high, 0u);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(low, 0u);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure they give the same results.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileVersionInfoWin* base_info_win =
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<FileVersionInfoWin*>(base_info.get());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VS_FIXEDFILEINFO* fixed_info = base_info_win->fixed_file_info();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fixed_info != NULL);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(fixed_info->dwFileVersionMS, static_cast<DWORD>(high));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(fixed_info->dwFileVersionLS, static_cast<DWORD>(low));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, HaveSameOrigin) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct OriginCompare {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* a;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* b;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool same_origin;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_cases[] = {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "", "", true },
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "*", "*", true },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "*", "+", false },
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.google.com/", "http://www.google.com/", true },
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.google.com", "http://www.google.com/", true },
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.google.com:80/", "http://www.google.com/", true },
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.google.com:8080/", "http://www.google.com/", false },
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://www.google.com/", "http://www.google.com/", false },
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://docs.google.com/", "http://www.google.com/", false },
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://www.google.com/", "https://www.google.com:443/", true },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://www.google.com/", "https://www.google.com:443", true },
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(test_cases); ++i) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const OriginCompare& test = test_cases[i];
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test.same_origin, HaveSameOrigin(test.a, test.b));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, IsValidUrlScheme) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cases {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* url;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_privileged;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool expected;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_cases[] = {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-privileged test cases
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"http://www.google.ca", false, true },
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"https://www.google.ca", false, true },
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"about:config", false, true },
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"view-source:http://www.google.ca", false, true },
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"chrome-extension://aaaaaaaaaaaaaaaaaaa/monkey.html", false, false },
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"ftp://www.google.ca", false, false },
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"file://www.google.ca", false, false },
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"file://C:\boot.ini", false, false },
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // privileged test cases
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"http://www.google.ca", true, true },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"https://www.google.ca", true, true },
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"about:config", true, true },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"view-source:http://www.google.ca", true, true },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"chrome-extension://aaaaaaaaaaaaaaaaaaa/monkey.html", true, true },
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"ftp://www.google.ca", true, false },
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"file://www.google.ca", true, false },
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"file://C:\boot.ini", true, false },
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(test_cases); ++i) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Cases& test = test_cases[i];
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test.expected, IsValidUrlScheme(GURL(test.url),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              test.is_privileged));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, GuidToString) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // {3C5E2125-35BA-48df-A841-5F669B9D69FC}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GUID test_guid = { 0x3c5e2125, 0x35ba, 0x48df,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { 0xa8, 0x41, 0x5f, 0x66, 0x9b, 0x9d, 0x69, 0xfc } };
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t compare[64] = {0};
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::StringFromGUID2(test_guid, compare, arraysize(compare));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring str_guid(GuidToString(test_guid));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, str_guid.compare(compare));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<size_t>(lstrlenW(compare)), str_guid.length());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, ParseAttachTabUrlTest) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeFrameUrl cf_url;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const std::string kProfileName("iexplore");
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.Parse(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"http://f/?attach_external_tab&10&1&2&3&123&321&iexplore"));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.attach_to_external_tab());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.is_chrome_protocol());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10, cf_url.cookie());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cf_url.disposition());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(2, 3, 123, 321), cf_url.dimensions());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kProfileName, cf_url.profile_name());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.Parse(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"http://www.foobar.com?&10&1&2&3&123&321&iexplore"));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.attach_to_external_tab());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.is_chrome_protocol());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.cookie());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.disposition());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.profile_name().empty());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.Parse(L"attach_external_tab&10&1"));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.attach_to_external_tab());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.is_chrome_protocol());
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.cookie());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.disposition());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.profile_name().empty());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.Parse(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"gcf:http://f/?attach_tab&10&1&2&3&123&321&iexplore"));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.attach_to_external_tab());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.is_chrome_protocol());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.cookie());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.disposition());
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.profile_name().empty());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.Parse(L"gcf:http://google.com"));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cf_url.attach_to_external_tab());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.is_chrome_protocol());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.cookie());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cf_url.disposition());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(cf_url.gurl(), GURL("http://google.com"));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cf_url.profile_name().empty());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock for the IInternetSecurityManager interface
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockIInternetSecurityManager : public IInternetSecurityManager {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2_WITH_CALLTYPE(__stdcall, QueryInterface,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(REFIID iid, void** object));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0_WITH_CALLTYPE(__stdcall, AddRef, ULONG());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Release, ULONG());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1_WITH_CALLTYPE(__stdcall, SetSecuritySite,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(IInternetSecurityMgrSite* site));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1_WITH_CALLTYPE(__stdcall, GetSecuritySite,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(IInternetSecurityMgrSite** site));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3_WITH_CALLTYPE(__stdcall, MapUrlToZone,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(LPCWSTR url, DWORD* zone, DWORD flags));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4_WITH_CALLTYPE(__stdcall, GetSecurityId,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(LPCWSTR url, BYTE* security_id, DWORD* security_size,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              DWORD_PTR reserved));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD8_WITH_CALLTYPE(__stdcall, ProcessUrlAction,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(LPCWSTR url, DWORD action, BYTE* policy, DWORD cb_policy,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              BYTE* context, DWORD context_size, DWORD flags,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              DWORD reserved));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD7_WITH_CALLTYPE(__stdcall, QueryCustomPolicy,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(LPCWSTR url, REFGUID guid, BYTE** policy, DWORD* cb_policy,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              BYTE* context, DWORD cb_context, DWORD reserved));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3_WITH_CALLTYPE(__stdcall, SetZoneMapping,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(DWORD zone, LPCWSTR pattern, DWORD flags));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3_WITH_CALLTYPE(__stdcall, GetZoneMappings,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HRESULT(DWORD zone, IEnumString** enum_string, DWORD flags));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class provides a partial mock for the NavigationConstraints
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interface by providing specialized zone overrides.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockNavigationConstraintsZoneOverride
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public NavigationConstraintsImpl {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(IsZoneAllowed, bool(const GURL&url));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mock NavigationConstraints
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockNavigationConstraints : public NavigationConstraints {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(AllowUnsafeUrls, bool());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(IsSchemeAllowed, bool(const GURL& url));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(IsZoneAllowed, bool(const GURL& url));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Matcher which returns true if the URL passed in starts with the prefix
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(UrlPathStartsWith, url_prefix, "url starts with prefix") {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return StartsWith(UTF8ToWide(arg.spec()), url_prefix, false);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P3(HandleZone, mock, url_prefix, zone) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (StartsWith(UTF8ToWide(arg0.spec()), url_prefix, false))
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return zone != URLZONE_UNTRUSTED;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, CanNavigateTest) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockNavigationConstraintsZoneOverride mock;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Zones {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const wchar_t* url_prefix;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLZONE zone;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_zones[] = {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"http://blah", URLZONE_INTERNET },
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"http://untrusted", URLZONE_UNTRUSTED },
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"about:", URLZONE_TRUSTED },
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"view-source:", URLZONE_TRUSTED },
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"chrome-extension:", URLZONE_TRUSTED },
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"data:", URLZONE_INTERNET },
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"ftp:", URLZONE_UNTRUSTED },
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"file:", URLZONE_LOCAL_MACHINE },
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { L"sip:", URLZONE_UNTRUSTED },
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(test_zones); ++i) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Zones& zone = test_zones[i];
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(mock, IsZoneAllowed(UrlPathStartsWith(zone.url_prefix)))
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(testing::Return(zone.zone != URLZONE_UNTRUSTED));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cases {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* url;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool default_expected;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool unsafe_expected;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_privileged;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_cases[] = {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Invalid URL
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "          ", false, false, false },
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "foo bar", false, false, false },
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-privileged test cases
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore", true,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       true, false },
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://untrusted/bar.html", false, true, false },
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore", true,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       true, false },
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "view-source:http://www.google.ca", true, true, false },
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "view-source:javascript:alert('foo');", false, true, false },
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "about:blank", true, true, false },
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "About:Version", true, true, false },
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "about:config", false, true, false },
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome-extension://aaaaaaaaaaaaaaaaaaa/monkey.html", false, true,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       false },
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://www.google.ca", false, true, false },
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "file://www.google.ca", false, true, false },
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "file://C:\boot.ini", false, true, false },
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "SIP:someone@10.1.2.3", false, true, false },
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // privileged test cases
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome-extension://aaaaaaaaaaaaaaaaaaa/monkey.html", true, true,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       true },
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "data://aaaaaaaaaaaaaaaaaaa/monkey.html", true, true, true },
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(test_cases); ++i) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Cases& test = test_cases[i];
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock.set_is_privileged(test.is_privileged);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool actual = CanNavigate(GURL(test.url), &mock);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test.default_expected, actual) << "Failure url: " << test.url;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, CanNavigateTestDenyAll) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockNavigationConstraints mock;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, IsZoneAllowed(testing::_))
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AnyNumber())
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(testing::Return(false));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, IsSchemeAllowed(testing::_))
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AnyNumber())
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(testing::Return(false));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, AllowUnsafeUrls())
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AnyNumber())
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(testing::Return(false));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *urls[] = {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "          "},
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "foo bar"},
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-privileged test cases
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore"},
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://untrusted/bar.html"},
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore"},
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "view-source:http://www.google.ca"},
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "view-source:javascript:alert('foo');"},
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "about:blank"},
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "About:Version"},
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "about:config"},
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome-extension://aaaaaaaaaaaaaaaaaaa/monkey.html"},
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://www.google.ca"},
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "file://www.google.ca"},
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "file://C:\boot.ini"},
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "SIP:someone@10.1.2.3"},
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(urls); ++i) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(CanNavigate(GURL(urls[i]), &mock));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, CanNavigateTestAllowAll) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockNavigationConstraints mock;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, AllowUnsafeUrls())
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AnyNumber())
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(testing::Return(false));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, IsSchemeAllowed(testing::_))
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AnyNumber())
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(testing::Return(true));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, IsZoneAllowed(testing::_))
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AnyNumber())
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(testing::Return(true));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *urls[] = {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-privileged test cases
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore"},
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://untrusted/bar.html"},
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore"},
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "view-source:http://www.google.ca"},
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "view-source:javascript:alert('foo');"},
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "about:blank"},
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "About:Version"},
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "about:config"},
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome-extension://aaaaaaaaaaaaaaaaaaa/monkey.html"},
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://www.google.ca"},
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "file://www.google.ca"},
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "file://C:\boot.ini"},
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "SIP:someone@10.1.2.3"},
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "gcf:about:cache"},
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "gcf:about:plugins"},
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(urls); ++i) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(CanNavigate(GURL(urls[i]), &mock));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, CanNavigateTestAllowAllUnsafeUrls) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockNavigationConstraints mock;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock, AllowUnsafeUrls())
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(testing::AnyNumber())
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(testing::Return(true));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *urls[] = {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"gcf:about:cache"},
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"gcf:http://www.google.com"},
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"view-source:javascript:alert('foo');"},
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"http://www.google.com"},
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < arraysize(urls); ++i) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(CanNavigate(GURL(urls[i]), &mock));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, IsDefaultRendererTest) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey config_key(HKEY_CURRENT_USER, kChromeFrameConfigKey, KEY_ALL_ACCESS);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(config_key.Valid());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD saved_default_renderer = 0;  // NOLINT
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.ReadValueDW(kEnableGCFRendererByDefault, &saved_default_renderer);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.DeleteValue(kEnableGCFRendererByDefault);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsGcfDefaultRenderer());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.WriteValue(kEnableGCFRendererByDefault, static_cast<DWORD>(0));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsGcfDefaultRenderer());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.WriteValue(kEnableGCFRendererByDefault, static_cast<DWORD>(1));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsGcfDefaultRenderer());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.WriteValue(kEnableGCFRendererByDefault, saved_default_renderer);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, RendererTypeForUrlTest) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open all the keys we need.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey config_key(HKEY_CURRENT_USER, kChromeFrameConfigKey, KEY_ALL_ACCESS);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(config_key.Valid());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey opt_for_gcf(config_key.Handle(), kRenderInGCFUrlList, KEY_ALL_ACCESS);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(opt_for_gcf.Valid());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegKey opt_for_host(config_key.Handle(), kRenderInHostUrlList,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      KEY_ALL_ACCESS);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(opt_for_host.Valid());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!config_key.Valid() || !opt_for_gcf.Valid() || !opt_for_host.Valid())
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t kTestFilter[] = L"*.testing.chromium.org";
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const wchar_t kTestUrl[] = L"www.testing.chromium.org";
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save the current state of the registry.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD saved_default_renderer = 0;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.ReadValueDW(kEnableGCFRendererByDefault, &saved_default_renderer);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to manually reset the holder between checks.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(robertshield): Remove this when the RegistryWatcher is wired up.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegistryListPreferencesHolder& renderer_type_preferences_holder =
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRendererTypePreferencesHolderForTesting();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the host is the default renderer.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.WriteValue(kEnableGCFRendererByDefault, static_cast<DWORD>(0));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsGcfDefaultRenderer());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opt_for_gcf.DeleteValue(kTestFilter);  // Just in case this exists
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(RENDERER_TYPE_UNDETERMINED, RendererTypeForUrl(kTestUrl));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opt_for_gcf.WriteValue(kTestFilter, L"");
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_type_preferences_holder.ResetForTesting();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(RENDERER_TYPE_CHROME_OPT_IN_URL, RendererTypeForUrl(kTestUrl));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now set GCF as the default renderer.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.WriteValue(kEnableGCFRendererByDefault, static_cast<DWORD>(1));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsGcfDefaultRenderer());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opt_for_host.DeleteValue(kTestFilter);  // Just in case this exists
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_type_preferences_holder.ResetForTesting();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(RENDERER_TYPE_CHROME_DEFAULT_RENDERER,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RendererTypeForUrl(kTestUrl));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opt_for_host.WriteValue(kTestFilter, L"");
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_type_preferences_holder.ResetForTesting();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(RENDERER_TYPE_UNDETERMINED, RendererTypeForUrl(kTestUrl));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cleanup.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opt_for_gcf.DeleteValue(kTestFilter);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opt_for_host.DeleteValue(kTestFilter);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_key.WriteValue(kEnableGCFRendererByDefault, saved_default_renderer);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_type_preferences_holder.ResetForTesting();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererTypeForUrl(L"");
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(UtilTests, XUaCompatibleDirectiveTest) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int all_versions[] = {0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 99, 100, 101, 1000};
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cases {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* header_value;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_version;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } test_cases[] = {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Negative cases
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "", -1 },
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=", -1 },
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome", -1 },
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=X", -1 },
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE", -1 },
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE-7", -1 },
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE+7", -1 },
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE 7", -1 },
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE7.0", -1 },
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=FF7", -1 },
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE7+", -1 },
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE99999999999999999999", -1 },
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE0", -1 },
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Always on
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=1", INT_MAX },
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Basic positive cases
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "chrome=IE1", 1 },
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "CHROME=IE6", 6 },
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "Chrome=IE10", 10 },
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ChRoMe=IE100", 100 },
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Positive formatting variations
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  chrome=IE6  ", 6 },
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  chrome=IE6;  ", 6 },
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  chrome=IE6; IE=8 ", 6 },
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8;chrome=IE6;", 6 },
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8;chrome=IE6;", 6 },
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8 ; chrome = IE6 ;", 6 },
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ignore unrecognized values
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8 ; chrome = IE7.1; chrome = IE6;", 6 },
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // First valid wins
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8 ; chrome = IE6; chrome = IE8;", 6 },
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Comma delimiter
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8,chrome=IE6;", -1 },
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8,chrome=IE6", 6 },
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8,chrome=IE6, Something=Else;Why;Not", 6 },
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8,chrome=1,Something=Else", INT_MAX },
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "  IE=8(a;b;c),chrome=IE7,Something=Else", 7 }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int case_index = 0; case_index < arraysize(test_cases); ++case_index) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Cases& test = test_cases[case_index];
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check that all versions <= max_version are matched
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t version_index = 0;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         version_index < arraysize(all_versions);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++version_index) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool expect_match = (all_versions[version_index] <= test.max_version);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(expect_match,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                CheckXUaCompatibleDirective(test.header_value,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            all_versions[version_index]))
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "Expect '" << test.header_value << "' to "
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << (expect_match ? "match" : "not match") << " IE major version "
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << all_versions[version_index];
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
556