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/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_file_value_serializer.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension_test_util.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/extensions/features/feature_channel.h"
148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/common/extensions/permissions/chrome_permission_message_provider.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/error_utils.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_builder.h"
198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/permissions/permission_message_provider.h"
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/common/permissions/permission_message_util.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/common/permissions/permissions_info.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/common/permissions/socket_permission.h"
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/value_builder.h"
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/strings/grit/extensions_strings.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/base/l10n/l10n_util.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using extension_test_util::LoadManifest;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int schemes = URLPattern::SCHEME_ALL;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extent->AddPattern(URLPattern(schemes, pattern));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)size_t IndexOf(const std::vector<base::string16>& warnings,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const std::string& warning) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < warnings.size(); ++i) {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (warnings[i] == base::ASCIIToUTF16(warning))
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return i;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return warnings.size();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool Contains(const std::vector<base::string16>& warnings,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const std::string& warning) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IndexOf(warnings, warning) != warnings.size();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetByID.
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetByID) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionsInfo* info = PermissionsInfo::GetInstance();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis = info->GetAll();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (APIPermissionSet::const_iterator i = apis.begin();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != apis.end(); ++i) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(i->id(), i->info()->id());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that GetByName works with normal permission names and aliases.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetByName) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionsInfo* info = PermissionsInfo::GetInstance();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(APIPermission::kTab, info->GetByName("tabs")->id());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(APIPermission::kManagement,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info->GetByName("management")->id());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(info->GetByName("alsdkfjasldkfj"));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetAll) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t count = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionsInfo* info = PermissionsInfo::GetInstance();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis = info->GetAll();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (APIPermissionSet::const_iterator api = apis.begin();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       api != apis.end(); ++api) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure only the valid permission IDs get returned.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(APIPermission::kInvalid, api->id());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(APIPermission::kUnknown, api->id());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count++;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(count, info->get_permission_count());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetAllByName) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> names;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  names.insert("background");
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  names.insert("management");
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is an alias of kTab
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  names.insert("windows");
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This unknown name should get dropped.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  names.insert("sdlkfjasdlkfj");
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet expected;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert(APIPermission::kBackground);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert(APIPermission::kManagement);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert(APIPermission::kTab);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PermissionsInfo::GetInstance()->GetAllByName(names));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the aliases are properly mapped.
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, Aliases) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionsInfo* info = PermissionsInfo::GetInstance();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tabs: tabs, windows
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string tabs_name = "tabs";
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(tabs_name, info->GetByID(APIPermission::kTab)->name());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(APIPermission::kTab, info->GetByName("tabs")->id());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(APIPermission::kTab, info->GetByName("windows")->id());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unlimitedStorage: unlimitedStorage, unlimited_storage
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string storage_name = "unlimitedStorage";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(storage_name, info->GetByID(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      APIPermission::kUnlimitedStorage)->name());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(APIPermission::kUnlimitedStorage,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info->GetByName("unlimitedStorage")->id());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(APIPermission::kUnlimitedStorage,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            info->GetByName("unlimited_storage")->id());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, EffectiveHostPermissions) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<const PermissionSet> permissions;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions", "empty.json");
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0u,
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            extension->permissions_data()
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                ->GetEffectiveHostPermissions()
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                .patterns()
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                .size());
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      permissions->HasEffectiveAccessToURL(GURL("http://www.google.com")));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToAllHosts());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions", "one_host.json");
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.google.com")));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToURL(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://www.google.com")));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToAllHosts());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions",
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "one_host_wildcard.json");
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(GURL("http://google.com")));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://foo.google.com")));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToAllHosts());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions", "two_hosts.json");
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.google.com")));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.reddit.com")));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToAllHosts());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions",
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "https_not_considered.json");
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(GURL("http://google.com")));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(GURL("https://google.com")));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToAllHosts());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions",
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "two_content_scripts.json");
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(GURL("http://google.com")));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.reddit.com")));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://news.ycombinator.com")));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToAllHosts());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions", "all_hosts.json");
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(GURL("http://test/")));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToURL(GURL("https://test/")));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      permissions->HasEffectiveAccessToURL(GURL("http://www.google.com")));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToAllHosts());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions", "all_hosts2.json");
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(GURL("http://test/")));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      permissions->HasEffectiveAccessToURL(GURL("http://www.google.com")));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToAllHosts());
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("effective_host_permissions", "all_hosts3.json");
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  permissions = extension->permissions_data()->active_permissions();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(permissions->HasEffectiveAccessToURL(GURL("http://test/")));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToURL(GURL("https://test/")));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      permissions->HasEffectiveAccessToURL(GURL("http://www.google.com")));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(permissions->HasEffectiveAccessToAllHosts());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, ExplicitAccessToOrigin) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis;
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ManifestPermissionSet manifest_permissions;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet scriptable_hosts;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts, "http://*.google.com/*");
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The explicit host paths should get set to /*.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts, "http://www.example.com/a/particular/path/*");
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> perm_set = new PermissionSet(
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      apis, manifest_permissions, explicit_hosts, scriptable_hosts);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(perm_set->HasExplicitAccessToOrigin(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.google.com/")));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(perm_set->HasExplicitAccessToOrigin(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://test.google.com/")));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(perm_set->HasExplicitAccessToOrigin(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com")));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(perm_set->HasEffectiveAccessToURL(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com")));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(perm_set->HasExplicitAccessToOrigin(
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://test.example.com")));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, CreateUnion) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermission* permission = NULL;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ManifestPermissionSet manifest_permissions;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis1;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis2;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet expected_apis;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts1;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts2;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_explicit_hosts;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet scriptable_hosts1;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet scriptable_hosts2;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_scriptable_hosts;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet effective_hosts;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set1;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set2;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> union_set;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const APIPermissionInfo* permission_info =
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("tcp-connect:*.example.com:80"));
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-bind::8080"));
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8888"));
264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Union with an empty set.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(APIPermission::kTab);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(APIPermission::kBackground);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(permission->Clone());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kTab);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kBackground);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(permission);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts1, "http://*.google.com/*");
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_explicit_hosts, "http://*.google.com/*");
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&effective_hosts, "http://*.google.com/*");
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set1 = new PermissionSet(apis1, manifest_permissions,
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts1, scriptable_hosts1);
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(apis2, manifest_permissions,
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts2, scriptable_hosts2);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union_set = PermissionSet::CreateUnion(set1.get(), set2.get());
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set1->Contains(*set2.get()));
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set1->Contains(*union_set.get()));
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set2->Contains(*set1.get()));
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set2->Contains(*union_set.get()));
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(union_set->Contains(*set1.get()));
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(union_set->Contains(*set2.get()));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(union_set->HasEffectiveFullAccess());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_apis, union_set->apis());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_explicit_hosts, union_set->explicit_hosts());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_scriptable_hosts, union_set->scriptable_hosts());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_explicit_hosts, union_set->effective_hosts());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now use a real second set.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kTab);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kProxy);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kClipboardWrite);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kPlugin);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("tcp-connect:*.example.com:80"));
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8899"));
308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(permission);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kTab);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kProxy);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kClipboardWrite);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kPlugin);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("tcp-connect:*.example.com:80"));
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-bind::8080"));
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8888"));
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8899"));
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert a new permission socket permisssion which will replace the old one.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(permission);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts2, "http://*.example.com/*");
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&scriptable_hosts2, "http://*.google.com/*");
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_explicit_hosts, "http://*.example.com/*");
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_scriptable_hosts, "http://*.google.com/*");
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet::CreateUnion(
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      explicit_hosts2, scriptable_hosts2, &effective_hosts);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(apis2, manifest_permissions,
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts2, scriptable_hosts2);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union_set = PermissionSet::CreateUnion(set1.get(), set2.get());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set1->Contains(*set2.get()));
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set1->Contains(*union_set.get()));
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set2->Contains(*set1.get()));
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set2->Contains(*union_set.get()));
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(union_set->Contains(*set1.get()));
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(union_set->Contains(*set2.get()));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(union_set->HasEffectiveFullAccess());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(union_set->HasEffectiveAccessToAllHosts());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_apis, union_set->apis());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_explicit_hosts, union_set->explicit_hosts());
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_scriptable_hosts, union_set->scriptable_hosts());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(effective_hosts, union_set->effective_hosts());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, CreateIntersection) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermission* permission = NULL;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ManifestPermissionSet manifest_permissions;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis1;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis2;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet expected_apis;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts1;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts2;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_explicit_hosts;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet scriptable_hosts1;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet scriptable_hosts2;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_scriptable_hosts;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet effective_hosts;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set1;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set2;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> new_set;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const APIPermissionInfo* permission_info =
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intersection with an empty set.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(APIPermission::kTab);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(APIPermission::kBackground);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("tcp-connect:*.example.com:80"));
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-bind::8080"));
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8888"));
390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(permission);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts1, "http://*.google.com/*");
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&scriptable_hosts1, "http://www.reddit.com/*");
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set1 = new PermissionSet(apis1, manifest_permissions,
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts1, scriptable_hosts1);
399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(apis2, manifest_permissions,
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts2, scriptable_hosts2);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_set = PermissionSet::CreateIntersection(set1.get(), set2.get());
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set1->Contains(*new_set.get()));
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set2->Contains(*new_set.get()));
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set1->Contains(*set2.get()));
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set2->Contains(*set1.get()));
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(new_set->Contains(*set1.get()));
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(new_set->Contains(*set2.get()));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_set->IsEmpty());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_set->HasEffectiveFullAccess());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_apis, new_set->apis());
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_explicit_hosts, new_set->explicit_hosts());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_scriptable_hosts, new_set->scriptable_hosts());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_explicit_hosts, new_set->effective_hosts());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now use a real second set.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kTab);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kProxy);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kClipboardWrite);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kPlugin);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-bind::8080"));
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8888"));
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8899"));
427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(permission);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kTab);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-bind::8080"));
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8888"));
437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(permission);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts2, "http://*.example.com/*");
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts2, "http://*.google.com/*");
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&scriptable_hosts2, "http://*.google.com/*");
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_explicit_hosts, "http://*.google.com/*");
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  effective_hosts.ClearPatterns();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&effective_hosts, "http://*.google.com/*");
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(apis2, manifest_permissions,
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts2, scriptable_hosts2);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_set = PermissionSet::CreateIntersection(set1.get(), set2.get());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set1->Contains(*new_set.get()));
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set2->Contains(*new_set.get()));
455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set1->Contains(*set2.get()));
456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set2->Contains(*set1.get()));
457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(new_set->Contains(*set1.get()));
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(new_set->Contains(*set2.get()));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_set->HasEffectiveFullAccess());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_set->HasEffectiveAccessToAllHosts());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_apis, new_set->apis());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_explicit_hosts, new_set->explicit_hosts());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_scriptable_hosts, new_set->scriptable_hosts());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(effective_hosts, new_set->effective_hosts());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, CreateDifference) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermission* permission = NULL;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ManifestPermissionSet manifest_permissions;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis1;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis2;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet expected_apis;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts1;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts2;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_explicit_hosts;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet scriptable_hosts1;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet scriptable_hosts2;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet expected_scriptable_hosts;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet effective_hosts;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set1;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set2;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> new_set;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const APIPermissionInfo* permission_info =
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Difference with an empty set.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(APIPermission::kTab);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(APIPermission::kBackground);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("tcp-connect:*.example.com:80"));
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-bind::8080"));
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8888"));
502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis1.insert(permission);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts1, "http://*.google.com/*");
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&scriptable_hosts1, "http://www.reddit.com/*");
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set1 = new PermissionSet(apis1, manifest_permissions,
510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts1, scriptable_hosts1);
511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(apis2, manifest_permissions,
512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts2, scriptable_hosts2);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_set = PermissionSet::CreateDifference(set1.get(), set2.get());
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(*set1.get(), *new_set.get());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now use a real second set.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kTab);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kProxy);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kClipboardWrite);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(APIPermission::kPlugin);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("tcp-connect:*.example.com:80"));
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8899"));
526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis2.insert(permission);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(APIPermission::kBackground);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  permission = permission_info->CreateAPIPermission();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    scoped_ptr<base::ListValue> value(new base::ListValue());
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-bind::8080"));
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value->Append(new base::StringValue("udp-send-to::8888"));
536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(permission->FromValue(value.get(), NULL, NULL));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_apis.insert(permission);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts2, "http://*.example.com/*");
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&explicit_hosts2, "http://*.google.com/*");
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&scriptable_hosts2, "http://*.google.com/*");
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&expected_scriptable_hosts, "http://www.reddit.com/*");
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  effective_hosts.ClearPatterns();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&effective_hosts, "http://www.reddit.com/*");
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(apis2, manifest_permissions,
549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           explicit_hosts2, scriptable_hosts2);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_set = PermissionSet::CreateDifference(set1.get(), set2.get());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(set1->Contains(*new_set.get()));
553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(set2->Contains(*new_set.get()));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_set->HasEffectiveFullAccess());
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_set->HasEffectiveAccessToAllHosts());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_apis, new_set->apis());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_explicit_hosts, new_set->explicit_hosts());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_scriptable_hosts, new_set->scriptable_hosts());
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(effective_hosts, new_set->effective_hosts());
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |set3| = |set1| - |set2| --> |set3| intersect |set2| == empty_set
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set1 = PermissionSet::CreateIntersection(new_set.get(), set2.get());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(set1->IsEmpty());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST(PermissionsTest, IsPrivilegeIncrease) {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* base_name;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool expect_increase;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } kTests[] = {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "allhosts1", false },  // all -> all
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "allhosts2", false },  // all -> one
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "allhosts3", true },  // one -> all
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "hosts1", false },  // http://a,http://b -> http://a,http://b
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "hosts2", true },  // http://a,http://b -> https://a,http://*.b
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "hosts3", false },  // http://a,http://b -> http://a
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "hosts4", true },  // http://a -> http://a,http://b
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "hosts5", false },  // http://a,b,c -> http://a,b,c + https://a,b,c
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "hosts6", false },  // http://a.com -> http://a.com + http://a.co.uk
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "permissions1", false },  // tabs -> tabs
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "permissions2", true },  // tabs -> tabs,bookmarks
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "permissions3", true },  // http://a -> http://a,tabs
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "permissions5", true },  // bookmarks -> bookmarks,history
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "equivalent_warnings", false },  // tabs --> tabs, webNavigation
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)  // plugins aren't allowed in ChromeOS
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "permissions4", false },  // plugin -> plugin,tabs
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "plugin1", false },  // plugin -> plugin
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "plugin2", false },  // plugin -> none
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "plugin3", true },  // none -> plugin
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "storage", false },  // none -> storage
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "notifications", false },  // none -> notifications
5947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "platformapp1", false },  // host permissions for platform apps
5957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    { "platformapp2", true },  // API permissions for platform apps
5968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    { "media_galleries1", true },  // all -> read|all
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { "media_galleries2", true },  // read|all -> read|delete|copyTo|all
598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { "media_galleries3", true },  // all -> read|delete|all
599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    { "media_galleries4", false },  // read|all -> all
600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { "media_galleries5", false },  // read|copyTo|delete|all -> read|all
601558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    { "media_galleries6", false },  // read|all -> read|all
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { "media_galleries7", true },  // read|delete|all -> read|copyTo|delete|all
603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { "sockets1", true },  // none -> tcp:*:*
604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { "sockets2", false },  // tcp:*:* -> tcp:*:*
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { "sockets3", true },  // tcp:a.com:80 -> tcp:*:*
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<Extension> old_extension(
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LoadManifest("allow_silent_upgrade",
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     std::string(kTests[i].base_name) + "_old.json"));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<Extension> new_extension(
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LoadManifest("allow_silent_upgrade",
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     std::string(kTests[i].base_name) + "_new.json"));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(new_extension.get()) << kTests[i].base_name << "_new.json";
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!new_extension.get())
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<const PermissionSet> old_p(
62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        old_extension->permissions_data()->active_permissions());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<const PermissionSet> new_p(
62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new_extension->permissions_data()->active_permissions());
6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Manifest::Type extension_type = old_extension->GetType();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool increased = PermissionMessageProvider::Get()->IsPrivilegeIncrease(
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        old_p.get(), new_p.get(), extension_type);
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(kTests[i].expect_increase, increased) << kTests[i].base_name;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, PermissionMessages) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that all permissions that needs to show install UI actually have
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // strings associated with them.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet skip;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are considered "nuisance" or "trivial" permissions that don't need
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a prompt.
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kActiveTab);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kAlarms);
6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  skip.insert(APIPermission::kAlphaEnabled);
642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  skip.insert(APIPermission::kAlwaysOnTopWindows);
643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  skip.insert(APIPermission::kAppView);
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skip.insert(APIPermission::kAudio);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kBrowsingData);
646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  skip.insert(APIPermission::kCastStreaming);
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  skip.insert(APIPermission::kCommandsAccessibility);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kContextMenus);
6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  skip.insert(APIPermission::kCopresencePrivate);
650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  skip.insert(APIPermission::kDiagnostics);
65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  skip.insert(APIPermission::kDns);
652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  skip.insert(APIPermission::kDownloadsShelf);
6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  skip.insert(APIPermission::kEmbeddedExtensionOptions);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kFontSettings);
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kFullscreen);
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  skip.insert(APIPermission::kGcm);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kIdle);
65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  skip.insert(APIPermission::kIdltest);
659bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  skip.insert(APIPermission::kLogPrivate);
6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  skip.insert(APIPermission::kNotifications);
6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  skip.insert(APIPermission::kNotificationProvider);
662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  skip.insert(APIPermission::kOverrideEscFullscreen);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kPointerLock);
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kPower);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kPushMessaging);
6663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  skip.insert(APIPermission::kSessions);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kStorage);
6689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  skip.insert(APIPermission::kSystemCpu);
669ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  skip.insert(APIPermission::kSystemDisplay);
670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  skip.insert(APIPermission::kSystemMemory);
671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  skip.insert(APIPermission::kSystemNetwork);
672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  skip.insert(APIPermission::kSystemStorage);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kTts);
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kUnlimitedStorage);
675a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  skip.insert(APIPermission::kWebcamPrivate);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kWebView);
677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  skip.insert(APIPermission::kWindowShape);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // These permissions are restricted to extensions force-installed by policy
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and don't require a prompt, i.e. they're restricted to location 'policy'.
681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  skip.insert(APIPermission::kEnterprisePlatformKeys);
682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erikkay) add a string for this permission.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kBackground);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kClipboardWrite);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cookie permission does nothing unless you have associated host
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // permissions.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kCookie);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are warned as part of host permission checks.
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kDeclarativeContent);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kPageCapture);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kProxy);
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kTabCapture);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kWebRequest);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kWebRequestBlocking);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This permission requires explicit user action (context menu handler)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so we won't prompt for it for now.
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kFileBrowserHandler);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These permissions require explicit user action (configuration dialog)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so we don't prompt for them at install time.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kMediaGalleries);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If you've turned on the experimental command-line flag, we don't need
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to warn you further.
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kExperimental);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The Identity API has its own server-driven permission prompts.
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skip.insert(APIPermission::kIdentity);
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These are private.
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  skip.insert(APIPermission::kAccessibilityPrivate);
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kAutoTestPrivate);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kBookmarkManagerPrivate);
71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  skip.insert(APIPermission::kBrailleDisplayPrivate);
7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  skip.insert(APIPermission::kCast);
721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  skip.insert(APIPermission::kCastStreaming);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kChromeosInfoPrivate);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kCloudPrintPrivate);
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skip.insert(APIPermission::kCommandLinePrivate);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kDeveloperPrivate);
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kDial);
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kDownloadsInternal);
7285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  skip.insert(APIPermission::kEasyUnlockPrivate);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kEchoPrivate);
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skip.insert(APIPermission::kEnterprisePlatformKeysPrivate);
7317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  skip.insert(APIPermission::kFeedbackPrivate);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kFileBrowserHandlerInternal);
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  skip.insert(APIPermission::kFileManagerPrivate);
734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  skip.insert(APIPermission::kFirstRunPrivate);
735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  skip.insert(APIPermission::kGcdPrivate);
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  skip.insert(APIPermission::kHotwordPrivate);
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  skip.insert(APIPermission::kIdentityPrivate);
738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  skip.insert(APIPermission::kInfobars);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kInputMethodPrivate);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kMediaGalleriesPrivate);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kMediaPlayerPrivate);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kMetricsPrivate);
74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  skip.insert(APIPermission::kMDns);
7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  skip.insert(APIPermission::kPreferencesPrivate);
7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  skip.insert(APIPermission::kPrincipalsPrivate);
746d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  skip.insert(APIPermission::kImageWriterPrivate);
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  skip.insert(APIPermission::kReadingListPrivate);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kRtcPrivate);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kStreamsPrivate);
750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  skip.insert(APIPermission::kSyncedNotificationsPrivate);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kSystemPrivate);
752d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  skip.insert(APIPermission::kTabCaptureForTab);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kTerminalPrivate);
75458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  skip.insert(APIPermission::kVirtualKeyboardPrivate);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kWallpaperPrivate);
7561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  skip.insert(APIPermission::kWebrtcAudioPrivate);
75768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  skip.insert(APIPermission::kWebrtcLoggingPrivate);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kWebstorePrivate);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Warned as part of host permissions.
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kDevtools);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Platform apps.
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  skip.insert(APIPermission::kBrowser);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kFileSystem);
766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  skip.insert(APIPermission::kFileSystemProvider);
7677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  skip.insert(APIPermission::kFileSystemRetainEntries);
7685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  skip.insert(APIPermission::kFileSystemWrite);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skip.insert(APIPermission::kSocket);
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skip.insert(APIPermission::kUsbDevice);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // We already have a generic message for declaring externally_connectable.
7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  skip.insert(APIPermission::kExternallyConnectableAllUrls);
7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionsInfo* info = PermissionsInfo::GetInstance();
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet permissions = info->GetAll();
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (APIPermissionSet::const_iterator i = permissions.begin();
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != permissions.end(); ++i) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const APIPermissionInfo* permission_info = i->info();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(permission_info != NULL);
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (skip.count(i->id())) {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(PermissionMessage::kNone, permission_info->message_id())
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "unexpected message_id for " << permission_info->name();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(PermissionMessage::kNone, permission_info->message_id())
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "missing message_id for " << permission_info->name();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(PermissionsTest, FileSystemPermissionMessages) {
79358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  APIPermissionSet api_permissions;
79458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  api_permissions.insert(APIPermission::kFileSystemWrite);
79558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  api_permissions.insert(APIPermission::kFileSystemDirectory);
79658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<PermissionSet> permissions(
797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new PermissionSet(api_permissions, ManifestPermissionSet(),
798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        URLPatternSet(), URLPatternSet()));
79958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PermissionMessages messages =
8008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      PermissionMessageProvider::Get()->GetPermissionMessages(
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          permissions.get(), Manifest::TYPE_PLATFORM_APP);
8025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_EQ(1u, messages.size());
80358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::sort(messages.begin(), messages.end());
80458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::set<PermissionMessage::ID> ids;
80558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (PermissionMessages::const_iterator it = messages.begin();
80658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       it != messages.end(); ++it) {
80758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ids.insert(it->id());
80858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
80958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(ContainsKey(ids, PermissionMessage::kFileSystemDirectory));
81058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
81158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The file system permissions have a special-case hack to show a warning for
8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// write and directory at the same time.
8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(sammc): Remove this. See http://crbug.com/284849.
8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(PermissionsTest, FileSystemImplicitPermissions) {
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  APIPermissionSet apis;
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apis.insert(APIPermission::kFileSystemWrite);
8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apis.AddImpliedPermissions();
8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.find(APIPermission::kFileSystemWrite)->id(),
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            APIPermission::kFileSystemWrite);
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.size(), 1u);
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apis.erase(APIPermission::kFileSystemWrite);
8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apis.insert(APIPermission::kFileSystemDirectory);
8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apis.AddImpliedPermissions();
8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.find(APIPermission::kFileSystemDirectory)->id(),
8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            APIPermission::kFileSystemDirectory);
8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.size(), 1u);
8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apis.insert(APIPermission::kFileSystemWrite);
8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  apis.AddImpliedPermissions();
8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.find(APIPermission::kFileSystemWrite)->id(),
8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            APIPermission::kFileSystemWrite);
8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.find(APIPermission::kFileSystemDirectory)->id(),
8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            APIPermission::kFileSystemDirectory);
8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.find(APIPermission::kFileSystemWriteDirectory)->id(),
8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            APIPermission::kFileSystemWriteDirectory);
8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(apis.size(), 3u);
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
84458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(PermissionsTest, HiddenFileSystemPermissionMessages) {
84558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  APIPermissionSet api_permissions;
84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  api_permissions.insert(APIPermission::kFileSystemWrite);
84758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  api_permissions.insert(APIPermission::kFileSystemDirectory);
84858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  api_permissions.insert(APIPermission::kFileSystemWriteDirectory);
84958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<PermissionSet> permissions(
850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new PermissionSet(api_permissions, ManifestPermissionSet(),
851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        URLPatternSet(), URLPatternSet()));
85258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PermissionMessages messages =
8538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      PermissionMessageProvider::Get()->GetPermissionMessages(
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          permissions.get(), Manifest::TYPE_PLATFORM_APP);
85558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1u, messages.size());
85658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(PermissionMessage::kFileSystemWriteDirectory, messages[0].id());
85758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
85858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8590529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST(PermissionsTest, SuppressedPermissionMessages) {
8600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Tabs warning suppresses favicon warning.
8620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    APIPermissionSet api_permissions;
8630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    api_permissions.insert(APIPermission::kTab);
864f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    URLPatternSet hosts;
865f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    hosts.AddPattern(URLPattern(URLPattern::SCHEME_CHROMEUI,
866f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                "chrome://favicon/"));
8670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    scoped_refptr<PermissionSet> permissions(
8680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        new PermissionSet(api_permissions, ManifestPermissionSet(),
869f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          hosts, URLPatternSet()));
8700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    PermissionMessages messages =
8710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        PermissionMessageProvider::Get()->GetPermissionMessages(
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
8730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(1u, messages.size());
874f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(PermissionMessage::kTabs, messages[0].id());
8750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
8760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // History warning suppresses favicon warning.
8780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    APIPermissionSet api_permissions;
879f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kHistory);
8800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    URLPatternSet hosts;
8810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    hosts.AddPattern(URLPattern(URLPattern::SCHEME_CHROMEUI,
8820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                "chrome://favicon/"));
8830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    scoped_refptr<PermissionSet> permissions(
8840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        new PermissionSet(api_permissions, ManifestPermissionSet(),
8850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          hosts, URLPatternSet()));
8860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    PermissionMessages messages =
8870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        PermissionMessageProvider::Get()->GetPermissionMessages(
8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
8890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(1u, messages.size());
890f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(PermissionMessage::kBrowsingHistory, messages[0].id());
8910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
8920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // All sites warning suppresses tabs warning.
8940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    APIPermissionSet api_permissions;
8950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    URLPatternSet hosts;
896f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    hosts.AddPattern(URLPattern(URLPattern::SCHEME_CHROMEUI, "*://*/*"));
897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTab);
898f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<PermissionSet> permissions(new PermissionSet(
899f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        api_permissions, ManifestPermissionSet(), hosts, URLPatternSet()));
900f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PermissionMessages messages =
901f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        PermissionMessageProvider::Get()->GetPermissionMessages(
9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1u, messages.size());
9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(PermissionMessage::kHostsAll, messages[0].id());
9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // All sites warning suppresses topSites warning.
9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    APIPermissionSet api_permissions;
9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    URLPatternSet hosts;
9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    hosts.AddPattern(URLPattern(URLPattern::SCHEME_CHROMEUI, "*://*/*"));
9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    api_permissions.insert(APIPermission::kTopSites);
9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<PermissionSet> permissions(new PermissionSet(
9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        api_permissions, ManifestPermissionSet(), hosts, URLPatternSet()));
9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PermissionMessages messages =
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        PermissionMessageProvider::Get()->GetPermissionMessages(
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
917f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(1u, messages.size());
918f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(PermissionMessage::kHostsAll, messages[0].id());
919f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
920f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  {
9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // All sites warning suppresses declarativeWebRequest warning.
922f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    APIPermissionSet api_permissions;
923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    URLPatternSet hosts;
924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    hosts.AddPattern(URLPattern(URLPattern::SCHEME_CHROMEUI, "*://*/*"));
925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kDeclarativeWebRequest);
926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<PermissionSet> permissions(new PermissionSet(
927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        api_permissions, ManifestPermissionSet(), hosts, URLPatternSet()));
928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PermissionMessages messages =
929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        PermissionMessageProvider::Get()->GetPermissionMessages(
9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, messages.size());
932116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(PermissionMessage::kHostsAll, messages[0].id());
933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
9351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // BrowsingHistory warning suppresses all history read/write warnings.
936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    APIPermissionSet api_permissions;
937f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kHistory);
938f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTab);
939f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTopSites);
940f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kProcesses);
941f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kWebNavigation);
9420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    scoped_refptr<PermissionSet> permissions(
9430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        new PermissionSet(api_permissions, ManifestPermissionSet(),
944f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          URLPatternSet(), URLPatternSet()));
9450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    PermissionMessages messages =
9460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        PermissionMessageProvider::Get()->GetPermissionMessages(
9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
9480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(1u, messages.size());
9490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(PermissionMessage::kBrowsingHistory, messages[0].id());
9500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
951f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  {
9521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Tabs warning suppresses all read-only history warnings.
953f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    APIPermissionSet api_permissions;
954f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTab);
955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTopSites);
956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kProcesses);
957f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kWebNavigation);
958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<PermissionSet> permissions(
959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new PermissionSet(api_permissions, ManifestPermissionSet(),
960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          URLPatternSet(), URLPatternSet()));
961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PermissionMessages messages =
962f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        PermissionMessageProvider::Get()->GetPermissionMessages(
9631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(1u, messages.size());
965f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(PermissionMessage::kTabs, messages[0].id());
966f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
9670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
9680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
969116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST(PermissionsTest, AccessToDevicesMessages) {
970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
971116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    APIPermissionSet api_permissions;
972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kUsb);
973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<PermissionSet> permissions(
974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new PermissionSet(api_permissions,
975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ManifestPermissionSet(),
976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet(),
977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet()));
978116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> messages =
979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        PermissionMessageProvider::Get()->GetWarningMessages(
9801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, messages.size());
982116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_USB),
983116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              messages[0]);
984116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
985116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Testing that multiple permissions will show the one message.
987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    APIPermissionSet api_permissions;
988116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kUsb);
989116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kUsb);
990116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<PermissionSet> permissions(
991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new PermissionSet(api_permissions,
992116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ManifestPermissionSet(),
993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet(),
994116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet()));
995116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> messages =
996116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        PermissionMessageProvider::Get()->GetWarningMessages(
9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
998116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, messages.size());
999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_USB),
1000116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              messages[0]);
1001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
1003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    APIPermissionSet api_permissions;
1004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kSerial);
1005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<PermissionSet> permissions(
1006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new PermissionSet(api_permissions,
1007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ManifestPermissionSet(),
1008116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet(),
1009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet()));
1010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> messages =
1011116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        PermissionMessageProvider::Get()->GetWarningMessages(
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
1013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, messages.size());
1014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_SERIAL),
1015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              messages[0]);
1016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
1018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    APIPermissionSet api_permissions;
1019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kUsb);
1020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kSerial);
1021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<PermissionSet> permissions(
1022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new PermissionSet(api_permissions,
1023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ManifestPermissionSet(),
1024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet(),
1025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet()));
1026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> messages =
1027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        PermissionMessageProvider::Get()->GetWarningMessages(
10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
1029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, messages.size());
1030116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(
1031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_USB_SERIAL),
1032116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        messages[0]);
1033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
1035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Testing that the same permission(s) will show one message.
1036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    APIPermissionSet api_permissions;
1037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kUsb);
1038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kSerial);
1039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    api_permissions.insert(APIPermission::kUsb);
1040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<PermissionSet> permissions(
1041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new PermissionSet(api_permissions,
1042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ManifestPermissionSet(),
1043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet(),
1044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          URLPatternSet()));
1045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> messages =
1046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        PermissionMessageProvider::Get()->GetWarningMessages(
10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
1048116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, messages.size());
1049116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(
1050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_USB_SERIAL),
1051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        messages[0]);
1052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
1054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<Extension> extension =
1055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        LoadManifest("permissions", "access_to_devices_bluetooth.json");
1056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const PermissionMessageProvider* provider =
1057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        PermissionMessageProvider::Get();
1058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PermissionSet* set = const_cast<PermissionSet*>(
1059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extension->permissions_data()->active_permissions().get());
1060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<base::string16> warnings =
1061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        provider->GetWarningMessages(set, extension->GetType());
1062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, warnings.size());
1063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH),
1064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              warnings[0]);
1065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Test Bluetooth and Serial
1067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    set->apis_.insert(APIPermission::kSerial);
1068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    warnings = provider->GetWarningMessages(set, extension->GetType());
1069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, warnings.size());
1070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(l10n_util::GetStringUTF16(
1071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH_SERIAL),
1072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              warnings[0]);
1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    set->apis_.erase(APIPermission::kSerial);
1074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Test USB and Bluetooth
1076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    set->apis_.insert(APIPermission::kUsb);
1077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    warnings = provider->GetWarningMessages(set, extension->GetType());
1078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, warnings.size());
1079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(
1080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_USB_BLUETOOTH),
1081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        warnings[0]);
1082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Test USB, Bluetooth and Serial
1084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    set->apis_.insert(APIPermission::kSerial);
1085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    warnings = provider->GetWarningMessages(set, extension->GetType());
1086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, warnings.size());
1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(
1088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_DEVICES),
1089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        warnings[0]);
1090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
109358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(PermissionsTest, MergedFileSystemPermissionComparison) {
109458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  APIPermissionSet write_api_permissions;
109558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  write_api_permissions.insert(APIPermission::kFileSystemWrite);
1096f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<PermissionSet> write_permissions(
1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new PermissionSet(write_api_permissions, ManifestPermissionSet(),
1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        URLPatternSet(), URLPatternSet()));
109958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
110058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  APIPermissionSet directory_api_permissions;
110158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  directory_api_permissions.insert(APIPermission::kFileSystemDirectory);
1102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<PermissionSet> directory_permissions(
1103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new PermissionSet(directory_api_permissions, ManifestPermissionSet(),
1104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        URLPatternSet(), URLPatternSet()));
110558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
110658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  APIPermissionSet write_directory_api_permissions;
110758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  write_directory_api_permissions.insert(
110858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      APIPermission::kFileSystemWriteDirectory);
1109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<PermissionSet> write_directory_permissions(
1110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new PermissionSet(write_directory_api_permissions,
1111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        ManifestPermissionSet(),
1112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        URLPatternSet(),
1113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        URLPatternSet()));
111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const PermissionMessageProvider* provider = PermissionMessageProvider::Get();
11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(write_directory_permissions.get(),
11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             write_permissions.get(),
11188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                             Manifest::TYPE_PLATFORM_APP));
11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(write_directory_permissions.get(),
11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             directory_permissions.get(),
11218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                             Manifest::TYPE_PLATFORM_APP));
11221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(provider->IsPrivilegeIncrease(write_permissions.get(),
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            directory_permissions.get(),
11248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                            Manifest::TYPE_PLATFORM_APP));
11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(provider->IsPrivilegeIncrease(write_permissions.get(),
11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            write_directory_permissions.get(),
11278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                            Manifest::TYPE_PLATFORM_APP));
11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(directory_permissions.get(),
11291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             write_permissions.get(),
11305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                             Manifest::TYPE_PLATFORM_APP));
11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(provider->IsPrivilegeIncrease(directory_permissions.get(),
11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            write_directory_permissions.get(),
11338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                            Manifest::TYPE_PLATFORM_APP));
113458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
113558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_ManyHosts) {
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension;
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "many-hosts.json");
1140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
114146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, warnings.size());
1143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
11445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Read and change your data on encrypted.google.com and "
1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "www.google.com",
1146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::UTF16ToUTF8(warnings[0]));
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_Plugins) {
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> permissions;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "plugins.json");
1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
115546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
1156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// We don't parse the plugins key on Chrome OS, so it should not ask for any
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // permissions.
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, warnings.size());
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, warnings.size());
1162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Read and change all your data on your computer and the websites "
1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "you visit",
1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::UTF16ToUTF8(warnings[0]));
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_AudioVideo) {
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both audio and video present.
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension =
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadManifest("permissions", "audio-video.json");
11738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const PermissionMessageProvider* provider = PermissionMessageProvider::Get();
117446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  PermissionSet* set = const_cast<PermissionSet*>(
117546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->active_permissions().get());
1176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
11778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      provider->GetWarningMessages(set, extension->GetType());
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Contains(warnings, "Use your microphone"));
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Contains(warnings, "Use your camera"));
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Contains(warnings, "Use your microphone and camera"));
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t combined_index = IndexOf(warnings, "Use your microphone and camera");
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t combined_size = warnings.size();
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just audio present.
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->apis_.erase(APIPermission::kVideoCapture);
11868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  warnings = provider->GetWarningMessages(set, extension->GetType());
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(combined_size, warnings.size());
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(combined_index, IndexOf(warnings, "Use your microphone"));
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Contains(warnings, "Use your camera"));
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Contains(warnings, "Use your microphone and camera"));
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just video present.
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->apis_.erase(APIPermission::kAudioCapture);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set->apis_.insert(APIPermission::kVideoCapture);
11958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  warnings = provider->GetWarningMessages(set, extension->GetType());
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(combined_size, warnings.size());
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Contains(warnings, "Use your microphone"));
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Contains(warnings, "Use your microphone and camera"));
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Contains(warnings, "Use your camera"));
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_CombinedSessions) {
1203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  {
1204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    APIPermissionSet api_permissions;
1205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTab);
1206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTopSites);
1207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kProcesses);
1208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kWebNavigation);
1209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kSessions);
1210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<PermissionSet> permissions(
1211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new PermissionSet(api_permissions, ManifestPermissionSet(),
1212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          URLPatternSet(), URLPatternSet()));
1213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::vector<base::string16> messages =
1214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        PermissionMessageProvider::Get()->GetWarningMessages(
12151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
1216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(1u, messages.size());
1217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(l10n_util::GetStringUTF16(
1218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  IDS_EXTENSION_PROMPT_WARNING_HISTORY_READ_AND_SESSIONS),
1219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              messages[0]);
1220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  {
1222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    APIPermissionSet api_permissions;
1223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kHistory);
1224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTab);
1225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kTopSites);
1226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kProcesses);
1227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kWebNavigation);
1228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    api_permissions.insert(APIPermission::kSessions);
1229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<PermissionSet> permissions(
1230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new PermissionSet(api_permissions, ManifestPermissionSet(),
1231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          URLPatternSet(), URLPatternSet()));
1232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::vector<base::string16> messages =
1233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        PermissionMessageProvider::Get()->GetWarningMessages(
12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            permissions.get(), Manifest::TYPE_EXTENSION);
1235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(1u, messages.size());
1236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(l10n_util::GetStringUTF16(
1237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  IDS_EXTENSION_PROMPT_WARNING_HISTORY_WRITE_AND_SESSIONS),
1238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              messages[0]);
1239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
12423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_DeclarativeWebRequest) {
12433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Test that if the declarativeWebRequest permission is present
12443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // in combination with all hosts permission, then only the warning
12453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // for host permissions is shown, because that covers the use of
12463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // declarativeWebRequest.
12473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Until Declarative Web Request is in stable, let's make sure it is enabled
12493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // on the current channel.
12503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedCurrentChannel sc(chrome::VersionInfo::CHANNEL_CANARY);
12513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // First verify that declarativeWebRequest produces a message when host
12533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // permissions do not cover all hosts.
12543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<Extension> extension =
1255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      LoadManifest("permissions", "web_request_not_all_host_permissions.json");
12568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const PermissionMessageProvider* provider = PermissionMessageProvider::Get();
125746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const PermissionSet* set =
125846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->active_permissions().get();
1259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
12608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      provider->GetWarningMessages(set, extension->GetType());
12613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(Contains(warnings, "Block parts of web pages"));
1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(Contains(
1263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      warnings, "Read and change all your data on the websites you visit"));
12643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Now verify that declarativeWebRequest does not produce a message when host
12663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // permissions do cover all hosts.
12673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  extension =
12683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LoadManifest("permissions", "web_request_all_host_permissions.json");
126946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  set = extension->permissions_data()->active_permissions().get();
12708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  warnings = provider->GetWarningMessages(set, extension->GetType());
12713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(Contains(warnings, "Block parts of web pages"));
1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(Contains(
1273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      warnings, "Read and change all your data on the websites you visit"));
12743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
12753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_Serial) {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension =
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadManifest("permissions", "serial.json");
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->is_platform_app());
128146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(
128246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->HasAPIPermission(APIPermission::kSerial));
1283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
128446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
1285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(Contains(warnings, "Access your serial devices"));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, warnings.size());
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_Socket_AnyHost) {
1290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV);
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension =
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadManifest("permissions", "socket_any_host.json");
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->is_platform_app());
129546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(
129646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->HasAPIPermission(APIPermission::kSocket));
1297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
129846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, warnings.size());
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Contains(warnings, "Exchange data with any computer "
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 "on the local network or internet"));
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_Socket_OneDomainTwoHostnames) {
1305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV);
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension =
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadManifest("permissions", "socket_one_domain_two_hostnames.json");
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->is_platform_app());
131046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(
131146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->HasAPIPermission(APIPermission::kSocket));
1312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
131346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the warnings, including support for unicode characters, the fact
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that domain host warnings come before specific host warnings, and the fact
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that domains and hostnames are in alphabetical order regardless of the
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // order in the manifest file.
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, warnings.size());
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (warnings.size() > 0)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(warnings[0],
13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              base::UTF8ToUTF16("Exchange data with any computer in the domain "
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "example.org"));
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (warnings.size() > 1)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(warnings[1],
13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              base::UTF8ToUTF16("Exchange data with the computers named: "
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          "b\xC3\xA5r.example.com foo.example.com"));
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          // "\xC3\xA5" = UTF-8 for lowercase A with ring above
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_Socket_TwoDomainsOneHostname) {
1332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ScopedCurrentChannel channel(chrome::VersionInfo::CHANNEL_DEV);
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension =
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LoadManifest("permissions", "socket_two_domains_one_hostname.json");
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->is_platform_app());
133746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(
133846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->HasAPIPermission(APIPermission::kSocket));
1339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
134046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the warnings, including the fact that domain host warnings come
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before specific host warnings and the fact that domains and hostnames are
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in alphabetical order regardless of the order in the manifest file.
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, warnings.size());
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (warnings.size() > 0)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(warnings[0],
13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              base::UTF8ToUTF16("Exchange data with any computer in the "
13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                "domains: example.com foo.example.org"));
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (warnings.size() > 1)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(warnings[1],
13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              base::UTF8ToUTF16("Exchange data with the computer named "
13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                "bar.example.org"));
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetWarningMessages_PlatformApppHosts) {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "platform_app_hosts.json");
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->is_platform_app());
1361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
136246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, warnings.size());
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension = LoadManifest("permissions", "platform_app_all_urls.json");
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(extension->is_platform_app());
136746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  warnings = extension->permissions_data()->GetPermissionMessageStrings();
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, warnings.size());
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool ShowsAllHostsWarning(const std::string& pattern) {
1372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<Extension> extension =
1373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ExtensionBuilder()
1374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          .SetManifest(DictionaryBuilder()
1375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           .Set("name", "TLDWildCardTest")
1376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           .Set("version", "0.1.0")
1377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           .Set("permissions", ListBuilder().Append(pattern))
1378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                           .Build())
1379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          .Build();
1380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::vector<base::string16> warnings =
138246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
1383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (warnings.empty())
1385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
1386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (warnings[0] !=
1388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS)) {
1389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return false;
1390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
1393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(PermissionsTest, GetWarningMessages_TLDWildcardTreatedAsAllHosts) {
1396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(ShowsAllHostsWarning("http://*.com/*"));    // most popular.
1397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(ShowsAllHostsWarning("http://*.org/*"));    // sanity check.
1398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(ShowsAllHostsWarning("http://*.co.uk/*"));  // eTLD.
1399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(ShowsAllHostsWarning("http://*.de/*"));  // foreign country tld.
1400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We should still show the normal permissions (i.e., "Can access your data on
1402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // *.rdcronin.com") for things that are not TLDs.
1403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(ShowsAllHostsWarning("http://*.rdcronin.com/*"));
1404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Pseudo-TLDs, like appspot.com, should not show all hosts.
1406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(ShowsAllHostsWarning("http://*.appspot.com/*"));
1407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Non-TLDs should be likewise exempt.
1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(ShowsAllHostsWarning("http://*.notarealtld/*"));
1410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Our internal checks use "foo", so let's make sure we're not messing
1412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // something up with it.
1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(ShowsAllHostsWarning("http://*.foo.com"));
1414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(ShowsAllHostsWarning("http://foo.com"));
1415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // This will fail if foo becomes a recognized TLD. Which could be soon.
1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Update as needed.
1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(ShowsAllHostsWarning("http://*.foo"));
1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
14204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(PermissionsTest, GetDistinctHosts) {
14214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  URLPatternSet explicit_hosts;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> expected;
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert("www.foo.com");
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert("www.bar.com");
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert("www.baz.com");
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("no dupes");
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Simple list with no dupes.
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.bar.com/path"));
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.baz.com/path"));
14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
14388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
14398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("two dupes");
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add some dupes.
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.baz.com/path"));
14504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
14518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
14528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("schemes differ");
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add a pattern that differs only by scheme. This should be filtered out.
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTPS, "https://www.bar.com/path"));
14614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
14628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
14638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("paths differ");
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add some dupes by path.
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.bar.com/pathypath"));
14724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
14738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
14748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("subdomains differ");
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't do anything special for subdomains.
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://monkey.www.bar.com/path"));
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://bar.com/path"));
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.insert("monkey.www.bar.com");
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.insert("bar.com");
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
14908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
14918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("RCDs differ");
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now test for RCD uniquing.
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.de/path"));
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca.us/path"));
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.net/path"));
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com.my/path"));
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is an unknown RCD, which shouldn't be uniqued out.
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.xyzzy/path"));
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // But it should only occur once.
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.xyzzy/path"));
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.insert("www.foo.xyzzy");
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
15218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
15228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("wildcards");
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://*.google.com/*"));
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.insert("*.google.com");
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
15348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
15358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("scriptable hosts");
15404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    APIPermissionSet empty_perms;
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.ClearPatterns();
15434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    URLPatternSet scriptable_hosts;
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.clear();
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://*.google.com/*"));
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scriptable_hosts.AddPattern(
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_HTTP, "http://*.example.com/*"));
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.insert("*.google.com");
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.insert("*.example.com");
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<PermissionSet> perm_set(new PermissionSet(
1555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        empty_perms, ManifestPermissionSet(),
1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        explicit_hosts, scriptable_hosts));
15574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
15588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
15598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  perm_set->effective_hosts(), true, true));
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't display warnings for file URLs because they are off by default.
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("file urls");
15654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.ClearPatterns();
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected.clear();
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit_hosts.AddPattern(
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLPattern(URLPattern::SCHEME_FILE, "file:///*"));
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(expected,
15738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)              permission_message_util::GetDistinctHosts(
15748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                  explicit_hosts, true, true));
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(PermissionsTest, GetDistinctHosts_ComIsBestRcd) {
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.org/path"));
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.net/path"));
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.com/path"));
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> expected;
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert("www.foo.com");
15954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(expected,
15968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            permission_message_util::GetDistinctHosts(
15978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                explicit_hosts, true, true));
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(PermissionsTest, GetDistinctHosts_NetIs2ndBestRcd) {
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.org/path"));
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.net/path"));
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No http://www.foo.com/path
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> expected;
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert("www.foo.net");
16164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(expected,
16178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            permission_message_util::GetDistinctHosts(
16188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                explicit_hosts, true, true));
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(PermissionsTest, GetDistinctHosts_OrgIs3rdBestRcd) {
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts;
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.org/path"));
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No http://www.foo.net/path
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No http://www.foo.com/path
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> expected;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert("www.foo.org");
16364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(expected,
16378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            permission_message_util::GetDistinctHosts(
16388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                explicit_hosts, true, true));
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(PermissionsTest, GetDistinctHosts_FirstInListIs4thBestRcd) {
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet explicit_hosts;
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.ca/path"));
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No http://www.foo.org/path
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.co.uk/path"));
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No http://www.foo.net/path
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit_hosts.AddPattern(
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.foo.jp/path"));
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No http://www.foo.com/path
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> expected;
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.insert("www.foo.ca");
16554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(expected,
16568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            permission_message_util::GetDistinctHosts(
16578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                explicit_hosts, true, true));
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST(PermissionsTest, IsHostPrivilegeIncrease) {
16618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Manifest::Type type = Manifest::TYPE_EXTENSION;
16628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const PermissionMessageProvider* provider = PermissionMessageProvider::Get();
1663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ManifestPermissionSet empty_manifest_permissions;
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet elist1;
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet elist2;
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet slist1;
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet slist2;
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set1;
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> set2;
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet empty_perms;
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist1.AddPattern(
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com.hk/path"));
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist1.AddPattern(
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/path"));
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that the host order does not matter.
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/path"));
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com.hk/path"));
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set1 = new PermissionSet(empty_perms, empty_manifest_permissions,
1683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           elist1, slist1);
1684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(empty_perms, empty_manifest_permissions,
1685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           elist2, slist2);
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set1.get(), set2.get(), type));
16881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set2.get(), set1.get(), type));
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that paths are ignored.
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.ClearPatterns();
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/*"));
1694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(empty_perms, empty_manifest_permissions,
1695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           elist2, slist2);
16961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set1.get(), set2.get(), type));
16971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set2.get(), set1.get(), type));
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that RCDs are ignored.
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.ClearPatterns();
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com.hk/*"));
1703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(empty_perms, empty_manifest_permissions,
1704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           elist2, slist2);
17051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set1.get(), set2.get(), type));
17061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set2.get(), set1.get(), type));
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that subdomain wildcards are handled properly.
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.ClearPatterns();
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://*.google.com.hk/*"));
1712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(empty_perms, empty_manifest_permissions,
1713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           elist2, slist2);
17141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(provider->IsPrivilegeIncrease(set1.get(), set2.get(), type));
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jstritar): Does not match subdomains properly. http://crbug.com/65337
17168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // EXPECT_FALSE(provider->IsPrivilegeIncrease(set2, set1, type));
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that different domains count as different hosts.
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.ClearPatterns();
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.google.com/path"));
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://www.example.org/path"));
1724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(empty_perms, empty_manifest_permissions,
1725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           elist2, slist2);
17261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(provider->IsPrivilegeIncrease(set1.get(), set2.get(), type));
17271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set2.get(), set1.get(), type));
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that different subdomains count as different hosts.
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.ClearPatterns();
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elist2.AddPattern(
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_HTTP, "http://mail.google.com/*"));
1733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  set2 = new PermissionSet(empty_perms, empty_manifest_permissions,
1734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           elist2, slist2);
17351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(provider->IsPrivilegeIncrease(set1.get(), set2.get(), type));
17361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(provider->IsPrivilegeIncrease(set2.get(), set1.get(), type));
17377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
17387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Test that platform apps do not have host permissions increases.
17398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  type = Manifest::TYPE_PLATFORM_APP;
17401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set1.get(), set2.get(), type));
17411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(provider->IsPrivilegeIncrease(set2.get(), set1.get(), type));
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, GetAPIsAsStrings) {
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis;
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet empty_set;
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis.insert(APIPermission::kProxy);
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis.insert(APIPermission::kBackground);
17505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  apis.insert(APIPermission::kNotifications);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis.insert(APIPermission::kTab);
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> perm_set = new PermissionSet(
1754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      apis, ManifestPermissionSet(), empty_set, empty_set);
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> api_names = perm_set->GetAPIsAsStrings();
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The result is correct if it has the same number of elements
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and we can convert it back to the id set.
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4u, api_names.size());
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(apis,
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PermissionsInfo::GetInstance()->GetAllByName(api_names));
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, IsEmpty) {
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet empty_apis;
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet empty_extent;
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> empty = new PermissionSet();
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(empty->IsEmpty());
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> perm_set;
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  perm_set = new PermissionSet(empty_apis, ManifestPermissionSet(),
1773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               empty_extent, empty_extent);
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(perm_set->IsEmpty());
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet non_empty_apis;
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  non_empty_apis.insert(APIPermission::kBackground);
1778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  perm_set = new PermissionSet(non_empty_apis, ManifestPermissionSet(),
1779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               empty_extent, empty_extent);
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(perm_set->IsEmpty());
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try non standard host
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet non_empty_extent;
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPattern(&non_empty_extent, "http://www.google.com/*");
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  perm_set = new PermissionSet(empty_apis, ManifestPermissionSet(),
1787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               non_empty_extent, empty_extent);
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(perm_set->IsEmpty());
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  perm_set = new PermissionSet(empty_apis, ManifestPermissionSet(),
1791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               empty_extent, non_empty_extent);
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(perm_set->IsEmpty());
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, ImpliedPermissions) {
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet empty_extent;
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  APIPermissionSet apis;
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apis.insert(APIPermission::kFileBrowserHandler);
1799a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(1U, apis.size());
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PermissionSet> perm_set;
1802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  perm_set = new PermissionSet(apis, ManifestPermissionSet(),
1803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               empty_extent, empty_extent);
1804a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(2U, perm_set->apis().size());
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PermissionsTest, SyncFileSystemPermission) {
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Extension> extension = LoadManifest(
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "permissions", "sync_file_system.json");
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  APIPermissionSet apis;
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  apis.insert(APIPermission::kSyncFileSystem);
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(extension->is_platform_app());
181346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
181446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      APIPermission::kSyncFileSystem));
1815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> warnings =
181646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->GetPermissionMessageStrings();
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(Contains(warnings, "Store data in your Google Drive account"));
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, warnings.size());
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Make sure that we don't crash when we're trying to show the permissions
1822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// even though chrome://thumb (and everything that's not chrome://favicon with
1823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// a chrome:// scheme) is not a valid permission.
1824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// More details here: crbug/246314.
1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(PermissionsTest, ChromeURLs) {
1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  URLPatternSet allowed_hosts;
1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  allowed_hosts.AddPattern(
1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "http://www.google.com/"));
1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  allowed_hosts.AddPattern(
1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "chrome://favicon/"));
1831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  allowed_hosts.AddPattern(
1832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      URLPattern(URLPattern::SCHEME_ALL, "chrome://thumb/"));
1833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<PermissionSet> permissions(
1834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new PermissionSet(APIPermissionSet(), ManifestPermissionSet(),
1835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        allowed_hosts, URLPatternSet()));
18361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PermissionMessageProvider::Get()->GetPermissionMessages(
18371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      permissions.get(), Manifest::TYPE_EXTENSION);
1838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
18408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST(PermissionsTest, IsPrivilegeIncrease_DeclarativeWebRequest) {
18413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<Extension> extension(
18423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LoadManifest("permissions", "permissions_all_urls.json"));
18433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<const PermissionSet> permissions(
184446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension->permissions_data()->active_permissions());
18453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
18463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<Extension> extension_dwr(
18473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LoadManifest("permissions", "web_request_all_host_permissions.json"));
18483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<const PermissionSet> permissions_dwr(
184946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      extension_dwr->permissions_data()->active_permissions());
18503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
18518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(PermissionMessageProvider::Get()->
18528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                   IsPrivilegeIncrease(permissions.get(),
18538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                       permissions_dwr.get(),
18548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                       extension->GetType()));
18553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
18568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
1858