| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <memory> |
| 7 #include <utility> | 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/macros.h" | 10 #include "base/macros.h" |
| 10 #include "base/memory/scoped_ptr.h" | |
| 11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 12 #include "chrome/browser/extensions/extension_service.h" | 12 #include "chrome/browser/extensions/extension_service.h" |
| 13 #include "chrome/browser/extensions/permissions_updater.h" | 13 #include "chrome/browser/extensions/permissions_updater.h" |
| 14 #include "chrome/browser/extensions/test_extension_environment.h" | 14 #include "chrome/browser/extensions/test_extension_environment.h" |
| 15 #include "chrome/common/extensions/permissions/chrome_permission_message_provide
r.h" | 15 #include "chrome/common/extensions/permissions/chrome_permission_message_provide
r.h" |
| 16 #include "chrome/grit/generated_resources.h" | 16 #include "chrome/grit/generated_resources.h" |
| 17 #include "chrome/test/base/testing_profile.h" | 17 #include "chrome/test/base/testing_profile.h" |
| 18 #include "components/crx_file/id_util.h" | 18 #include "components/crx_file/id_util.h" |
| 19 #include "extensions/browser/extension_prefs.h" | 19 #include "extensions/browser/extension_prefs.h" |
| 20 #include "extensions/common/extension.h" | 20 #include "extensions/common/extension.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 47 // be changed as the correct behaviour is implemented. TODOs in the test explain | 47 // be changed as the correct behaviour is implemented. TODOs in the test explain |
| 48 // the currently problematic behaviour. | 48 // the currently problematic behaviour. |
| 49 class PermissionMessagesUnittest : public testing::Test { | 49 class PermissionMessagesUnittest : public testing::Test { |
| 50 public: | 50 public: |
| 51 PermissionMessagesUnittest() | 51 PermissionMessagesUnittest() |
| 52 : message_provider_(new ChromePermissionMessageProvider()) {} | 52 : message_provider_(new ChromePermissionMessageProvider()) {} |
| 53 ~PermissionMessagesUnittest() override {} | 53 ~PermissionMessagesUnittest() override {} |
| 54 | 54 |
| 55 protected: | 55 protected: |
| 56 void CreateAndInstallExtensionWithPermissions( | 56 void CreateAndInstallExtensionWithPermissions( |
| 57 scoped_ptr<base::ListValue> required_permissions, | 57 std::unique_ptr<base::ListValue> required_permissions, |
| 58 scoped_ptr<base::ListValue> optional_permissions) { | 58 std::unique_ptr<base::ListValue> optional_permissions) { |
| 59 app_ = test_util::BuildExtension(ExtensionBuilder()) | 59 app_ = test_util::BuildExtension(ExtensionBuilder()) |
| 60 .MergeManifest( | 60 .MergeManifest( |
| 61 DictionaryBuilder() | 61 DictionaryBuilder() |
| 62 .Set("permissions", std::move(required_permissions)) | 62 .Set("permissions", std::move(required_permissions)) |
| 63 .Set("optional_permissions", | 63 .Set("optional_permissions", |
| 64 std::move(optional_permissions)) | 64 std::move(optional_permissions)) |
| 65 .Build()) | 65 .Build()) |
| 66 .SetID(crx_file::id_util::GenerateId("extension")) | 66 .SetID(crx_file::id_util::GenerateId("extension")) |
| 67 .SetLocation(Manifest::INTERNAL) | 67 .SetLocation(Manifest::INTERNAL) |
| 68 .Build(); | 68 .Build(); |
| 69 env_.GetExtensionService()->AddExtension(app_.get()); | 69 env_.GetExtensionService()->AddExtension(app_.get()); |
| 70 } | 70 } |
| 71 | 71 |
| 72 // Returns the permission messages that would display in the prompt that | 72 // Returns the permission messages that would display in the prompt that |
| 73 // requests all the optional permissions for the current |app_|. | 73 // requests all the optional permissions for the current |app_|. |
| 74 std::vector<base::string16> GetOptionalPermissionMessages() { | 74 std::vector<base::string16> GetOptionalPermissionMessages() { |
| 75 scoped_ptr<const PermissionSet> granted_permissions = | 75 std::unique_ptr<const PermissionSet> granted_permissions = |
| 76 env_.GetExtensionPrefs()->GetGrantedPermissions(app_->id()); | 76 env_.GetExtensionPrefs()->GetGrantedPermissions(app_->id()); |
| 77 const PermissionSet& optional_permissions = | 77 const PermissionSet& optional_permissions = |
| 78 PermissionsParser::GetOptionalPermissions(app_.get()); | 78 PermissionsParser::GetOptionalPermissions(app_.get()); |
| 79 scoped_ptr<const PermissionSet> requested_permissions = | 79 std::unique_ptr<const PermissionSet> requested_permissions = |
| 80 PermissionSet::CreateDifference(optional_permissions, | 80 PermissionSet::CreateDifference(optional_permissions, |
| 81 *granted_permissions); | 81 *granted_permissions); |
| 82 return GetMessages(*requested_permissions); | 82 return GetMessages(*requested_permissions); |
| 83 } | 83 } |
| 84 | 84 |
| 85 void GrantOptionalPermissions() { | 85 void GrantOptionalPermissions() { |
| 86 PermissionsUpdater perms_updater(env_.profile()); | 86 PermissionsUpdater perms_updater(env_.profile()); |
| 87 perms_updater.AddPermissions( | 87 perms_updater.AddPermissions( |
| 88 app_.get(), PermissionsParser::GetOptionalPermissions(app_.get())); | 88 app_.get(), PermissionsParser::GetOptionalPermissions(app_.get())); |
| 89 } | 89 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 106 for (const PermissionMessage& msg : | 106 for (const PermissionMessage& msg : |
| 107 message_provider_->GetPermissionMessages( | 107 message_provider_->GetPermissionMessages( |
| 108 message_provider_->GetAllPermissionIDs(permissions, | 108 message_provider_->GetAllPermissionIDs(permissions, |
| 109 app_->GetType()))) { | 109 app_->GetType()))) { |
| 110 messages.push_back(msg.message()); | 110 messages.push_back(msg.message()); |
| 111 } | 111 } |
| 112 return messages; | 112 return messages; |
| 113 } | 113 } |
| 114 | 114 |
| 115 extensions::TestExtensionEnvironment env_; | 115 extensions::TestExtensionEnvironment env_; |
| 116 scoped_ptr<ChromePermissionMessageProvider> message_provider_; | 116 std::unique_ptr<ChromePermissionMessageProvider> message_provider_; |
| 117 scoped_refptr<const Extension> app_; | 117 scoped_refptr<const Extension> app_; |
| 118 | 118 |
| 119 DISALLOW_COPY_AND_ASSIGN(PermissionMessagesUnittest); | 119 DISALLOW_COPY_AND_ASSIGN(PermissionMessagesUnittest); |
| 120 }; | 120 }; |
| 121 | 121 |
| 122 // If an app has both the 'history' and 'tabs' permission, one should hide the | 122 // If an app has both the 'history' and 'tabs' permission, one should hide the |
| 123 // other (the 'history' permission has superset permissions). | 123 // other (the 'history' permission has superset permissions). |
| 124 TEST_F(PermissionMessagesUnittest, HistoryHidesTabsMessage) { | 124 TEST_F(PermissionMessagesUnittest, HistoryHidesTabsMessage) { |
| 125 CreateAndInstallExtensionWithPermissions( | 125 CreateAndInstallExtensionWithPermissions( |
| 126 ListBuilder().Append("tabs").Append("history").Build(), | 126 ListBuilder().Append("tabs").Append("history").Build(), |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 public: | 249 public: |
| 250 USBDevicePermissionMessagesTest() | 250 USBDevicePermissionMessagesTest() |
| 251 : message_provider_(new ChromePermissionMessageProvider()) {} | 251 : message_provider_(new ChromePermissionMessageProvider()) {} |
| 252 ~USBDevicePermissionMessagesTest() override {} | 252 ~USBDevicePermissionMessagesTest() override {} |
| 253 | 253 |
| 254 PermissionMessages GetMessages(const PermissionIDSet& permissions) { | 254 PermissionMessages GetMessages(const PermissionIDSet& permissions) { |
| 255 return message_provider_->GetPermissionMessages(permissions); | 255 return message_provider_->GetPermissionMessages(permissions); |
| 256 } | 256 } |
| 257 | 257 |
| 258 private: | 258 private: |
| 259 scoped_ptr<ChromePermissionMessageProvider> message_provider_; | 259 std::unique_ptr<ChromePermissionMessageProvider> message_provider_; |
| 260 }; | 260 }; |
| 261 | 261 |
| 262 TEST_F(USBDevicePermissionMessagesTest, SingleDevice) { | 262 TEST_F(USBDevicePermissionMessagesTest, SingleDevice) { |
| 263 { | 263 { |
| 264 const char kMessage[] = | 264 const char kMessage[] = |
| 265 "Access any PVR Mass Storage from HUMAX Co., Ltd. via USB"; | 265 "Access any PVR Mass Storage from HUMAX Co., Ltd. via USB"; |
| 266 | 266 |
| 267 scoped_ptr<base::ListValue> permission_list(new base::ListValue()); | 267 std::unique_ptr<base::ListValue> permission_list(new base::ListValue()); |
| 268 permission_list->Append( | 268 permission_list->Append( |
| 269 UsbDevicePermissionData(0x02ad, 0x138c, -1).ToValue().release()); | 269 UsbDevicePermissionData(0x02ad, 0x138c, -1).ToValue().release()); |
| 270 | 270 |
| 271 UsbDevicePermission permission( | 271 UsbDevicePermission permission( |
| 272 PermissionsInfo::GetInstance()->GetByID(APIPermission::kUsbDevice)); | 272 PermissionsInfo::GetInstance()->GetByID(APIPermission::kUsbDevice)); |
| 273 ASSERT_TRUE(permission.FromValue(permission_list.get(), NULL, NULL)); | 273 ASSERT_TRUE(permission.FromValue(permission_list.get(), NULL, NULL)); |
| 274 | 274 |
| 275 PermissionMessages messages = GetMessages(permission.GetPermissions()); | 275 PermissionMessages messages = GetMessages(permission.GetPermissions()); |
| 276 ASSERT_EQ(1U, messages.size()); | 276 ASSERT_EQ(1U, messages.size()); |
| 277 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); | 277 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); |
| 278 } | 278 } |
| 279 { | 279 { |
| 280 const char kMessage[] = "Access USB devices from HUMAX Co., Ltd."; | 280 const char kMessage[] = "Access USB devices from HUMAX Co., Ltd."; |
| 281 | 281 |
| 282 scoped_ptr<base::ListValue> permission_list(new base::ListValue()); | 282 std::unique_ptr<base::ListValue> permission_list(new base::ListValue()); |
| 283 permission_list->Append( | 283 permission_list->Append( |
| 284 UsbDevicePermissionData(0x02ad, 0x138d, -1).ToValue().release()); | 284 UsbDevicePermissionData(0x02ad, 0x138d, -1).ToValue().release()); |
| 285 | 285 |
| 286 UsbDevicePermission permission( | 286 UsbDevicePermission permission( |
| 287 PermissionsInfo::GetInstance()->GetByID(APIPermission::kUsbDevice)); | 287 PermissionsInfo::GetInstance()->GetByID(APIPermission::kUsbDevice)); |
| 288 ASSERT_TRUE(permission.FromValue(permission_list.get(), NULL, NULL)); | 288 ASSERT_TRUE(permission.FromValue(permission_list.get(), NULL, NULL)); |
| 289 | 289 |
| 290 PermissionMessages messages = GetMessages(permission.GetPermissions()); | 290 PermissionMessages messages = GetMessages(permission.GetPermissions()); |
| 291 ASSERT_EQ(1U, messages.size()); | 291 ASSERT_EQ(1U, messages.size()); |
| 292 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); | 292 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); |
| 293 } | 293 } |
| 294 { | 294 { |
| 295 const char kMessage[] = "Access USB devices from an unknown vendor"; | 295 const char kMessage[] = "Access USB devices from an unknown vendor"; |
| 296 | 296 |
| 297 scoped_ptr<base::ListValue> permission_list(new base::ListValue()); | 297 std::unique_ptr<base::ListValue> permission_list(new base::ListValue()); |
| 298 permission_list->Append( | 298 permission_list->Append( |
| 299 UsbDevicePermissionData(0x02ae, 0x138d, -1).ToValue().release()); | 299 UsbDevicePermissionData(0x02ae, 0x138d, -1).ToValue().release()); |
| 300 | 300 |
| 301 UsbDevicePermission permission( | 301 UsbDevicePermission permission( |
| 302 PermissionsInfo::GetInstance()->GetByID(APIPermission::kUsbDevice)); | 302 PermissionsInfo::GetInstance()->GetByID(APIPermission::kUsbDevice)); |
| 303 ASSERT_TRUE(permission.FromValue(permission_list.get(), NULL, NULL)); | 303 ASSERT_TRUE(permission.FromValue(permission_list.get(), NULL, NULL)); |
| 304 | 304 |
| 305 PermissionMessages messages = GetMessages(permission.GetPermissions()); | 305 PermissionMessages messages = GetMessages(permission.GetPermissions()); |
| 306 ASSERT_EQ(1U, messages.size()); | 306 ASSERT_EQ(1U, messages.size()); |
| 307 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); | 307 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); |
| 308 } | 308 } |
| 309 } | 309 } |
| 310 | 310 |
| 311 TEST_F(USBDevicePermissionMessagesTest, MultipleDevice) { | 311 TEST_F(USBDevicePermissionMessagesTest, MultipleDevice) { |
| 312 const char kMessage[] = "Access any of these USB devices"; | 312 const char kMessage[] = "Access any of these USB devices"; |
| 313 const char* kDetails[] = { | 313 const char* kDetails[] = { |
| 314 "PVR Mass Storage from HUMAX Co., Ltd.", | 314 "PVR Mass Storage from HUMAX Co., Ltd.", |
| 315 "unknown devices from HUMAX Co., Ltd.", | 315 "unknown devices from HUMAX Co., Ltd.", |
| 316 "devices from an unknown vendor" | 316 "devices from an unknown vendor" |
| 317 }; | 317 }; |
| 318 | 318 |
| 319 // Prepare data set | 319 // Prepare data set |
| 320 scoped_ptr<base::ListValue> permission_list(new base::ListValue()); | 320 std::unique_ptr<base::ListValue> permission_list(new base::ListValue()); |
| 321 permission_list->Append( | 321 permission_list->Append( |
| 322 UsbDevicePermissionData(0x02ad, 0x138c, -1).ToValue().release()); | 322 UsbDevicePermissionData(0x02ad, 0x138c, -1).ToValue().release()); |
| 323 // This device's product ID is not in Chrome's database. | 323 // This device's product ID is not in Chrome's database. |
| 324 permission_list->Append( | 324 permission_list->Append( |
| 325 UsbDevicePermissionData(0x02ad, 0x138d, -1).ToValue().release()); | 325 UsbDevicePermissionData(0x02ad, 0x138d, -1).ToValue().release()); |
| 326 // This additional unknown product will be collapsed into the entry above. | 326 // This additional unknown product will be collapsed into the entry above. |
| 327 permission_list->Append( | 327 permission_list->Append( |
| 328 UsbDevicePermissionData(0x02ad, 0x138e, -1).ToValue().release()); | 328 UsbDevicePermissionData(0x02ad, 0x138e, -1).ToValue().release()); |
| 329 // This device's vendor ID is not in Chrome's database. | 329 // This device's vendor ID is not in Chrome's database. |
| 330 permission_list->Append( | 330 permission_list->Append( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 341 ASSERT_EQ(1U, messages.size()); | 341 ASSERT_EQ(1U, messages.size()); |
| 342 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); | 342 EXPECT_EQ(base::ASCIIToUTF16(kMessage), messages.front().message()); |
| 343 const std::vector<base::string16>& submessages = | 343 const std::vector<base::string16>& submessages = |
| 344 messages.front().submessages(); | 344 messages.front().submessages(); |
| 345 ASSERT_EQ(arraysize(kDetails), submessages.size()); | 345 ASSERT_EQ(arraysize(kDetails), submessages.size()); |
| 346 for (size_t i = 0; i < submessages.size(); i++) | 346 for (size_t i = 0; i < submessages.size(); i++) |
| 347 EXPECT_EQ(base::ASCIIToUTF16(kDetails[i]), submessages[i]); | 347 EXPECT_EQ(base::ASCIIToUTF16(kDetails[i]), submessages[i]); |
| 348 } | 348 } |
| 349 | 349 |
| 350 } // namespace extensions | 350 } // namespace extensions |
| OLD | NEW |