Commit bc82d3c4 authored by reillyg's avatar reillyg Committed by Commit bot

Rewrite apps::SavedDevicesService as extensions::DevicePermissionsManager.

This service doesn't need any Chrome dependencies after all and so it
can move into //extensions. This will make it possible for the USB
extensions API code to directly depend on it. In the process I have
rewritten the service with a couple improvements:

* C++11 for-each loops are used instead of explicit iterators.
* The DevicePermissions object is no longer an inner class (so it can
  be forward declared) and it is explicitly copied when requested so
  that the ownership of data on the FILE and UI threads is clear.

BUG=

Review URL: https://codereview.chromium.org/606503002

Cr-Commit-Position: refs/heads/master@{#297230}
parent e01e6de4
...@@ -26,10 +26,6 @@ static_library("apps") { ...@@ -26,10 +26,6 @@ static_library("apps") {
"launcher.cc", "launcher.cc",
"launcher.h", "launcher.h",
"metrics_names.h", "metrics_names.h",
"saved_devices_service.cc",
"saved_devices_service.h",
"saved_devices_service_factory.cc",
"saved_devices_service_factory.h",
"saved_files_service.cc", "saved_files_service.cc",
"saved_files_service.h", "saved_files_service.h",
"saved_files_service_factory.cc", "saved_files_service_factory.cc",
...@@ -45,7 +41,6 @@ static_library("apps") { ...@@ -45,7 +41,6 @@ static_library("apps") {
"//chrome/browser/extensions", "//chrome/browser/extensions",
"//chrome/common/extensions/api:api", "//chrome/common/extensions/api:api",
"//components/web_modal", "//components/web_modal",
"//device/usb",
"//skia", "//skia",
] ]
......
...@@ -9,7 +9,6 @@ include_rules = [ ...@@ -9,7 +9,6 @@ include_rules = [
"+components/sessions", "+components/sessions",
"+components/user_manager", "+components/user_manager",
"+components/web_modal", "+components/web_modal",
"+device/usb",
"+extensions", "+extensions",
"+net/base", "+net/base",
"+skia/ext", "+skia/ext",
......
...@@ -45,10 +45,6 @@ ...@@ -45,10 +45,6 @@
'launcher.cc', 'launcher.cc',
'launcher.h', 'launcher.h',
'metrics_names.h', 'metrics_names.h',
'saved_devices_service.cc',
'saved_devices_service.h',
'saved_devices_service_factory.cc',
'saved_devices_service_factory.h',
'saved_files_service.cc', 'saved_files_service.cc',
'saved_files_service.h', 'saved_files_service.h',
'saved_files_service_factory.cc', 'saved_files_service_factory.cc',
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef APPS_SAVED_DEVICES_SERVICE_H_
#define APPS_SAVED_DEVICES_SERVICE_H_
#include <map>
#include <set>
#include <string>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/stl_util.h"
#include "base/strings/string16.h"
#include "base/threading/thread_checker.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "device/usb/usb_device.h"
class Profile;
namespace base {
class Value;
}
namespace extensions {
class Extension;
}
namespace apps {
// Represents a device that a user has given an app permission to access. It
// will be persisted to disk (in the Preferences file) and so should remain
// serializable.
struct SavedDeviceEntry {
SavedDeviceEntry(uint16_t vendor_id,
uint16_t product_id,
const base::string16& serial_number);
base::Value* ToValue() const;
// The vendor ID of this device.
uint16_t vendor_id;
// The product ID of this device.
uint16_t product_id;
// The serial number (possibly alphanumeric) of this device.
base::string16 serial_number;
};
// Tracks the devices that apps have retained access to both while running and
// when suspended.
class SavedDevicesService : public KeyedService,
public content::NotificationObserver {
public:
// Tracks the devices that a particular extension has retained access to.
// Unlike SavedDevicesService the functions of this class can be called from
// the FILE thread.
class SavedDevices : device::UsbDevice::Observer {
public:
bool IsRegistered(scoped_refptr<device::UsbDevice> device) const;
void RegisterDevice(scoped_refptr<device::UsbDevice> device,
/* optional */ base::string16* serial_number);
private:
friend class SavedDevicesService;
SavedDevices(Profile* profile, const std::string& extension_id);
virtual ~SavedDevices();
// device::UsbDevice::Observer
virtual void OnDisconnect(scoped_refptr<device::UsbDevice> device) OVERRIDE;
Profile* profile_;
const std::string extension_id_;
// Devices with serial numbers are written to the prefs file.
std::vector<SavedDeviceEntry> persistent_devices_;
// Other devices are ephemeral devices and cleared when the extension host
// is destroyed.
std::set<scoped_refptr<device::UsbDevice> > ephemeral_devices_;
DISALLOW_COPY_AND_ASSIGN(SavedDevices);
};
explicit SavedDevicesService(Profile* profile);
virtual ~SavedDevicesService();
static SavedDevicesService* Get(Profile* profile);
// Returns the SavedDevices for |extension_id|, creating it if necessary.
SavedDevices* GetOrInsert(const std::string& extension_id);
std::vector<SavedDeviceEntry> GetAllDevices(
const std::string& extension_id) const;
// Clears the SavedDevices for |extension_id|.
void Clear(const std::string& extension_id);
private:
// content::NotificationObserver.
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// Returns the SavedDevices for |extension_id| or NULL if one does not exist.
SavedDevices* Get(const std::string& extension_id) const;
std::map<std::string, SavedDevices*> extension_id_to_saved_devices_;
Profile* profile_;
content::NotificationRegistrar registrar_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(SavedDevicesService);
};
} // namespace apps
#endif // APPS_SAVED_DEVICES_SERVICE_H_
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "apps/saved_devices_service_factory.h"
#include "apps/saved_devices_service.h"
#include "chrome/browser/profiles/profile.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
namespace apps {
// static
SavedDevicesService* SavedDevicesServiceFactory::GetForProfile(
Profile* profile) {
return static_cast<SavedDevicesService*>(
GetInstance()->GetServiceForBrowserContext(profile, true));
}
// static
SavedDevicesServiceFactory* SavedDevicesServiceFactory::GetInstance() {
return Singleton<SavedDevicesServiceFactory>::get();
}
SavedDevicesServiceFactory::SavedDevicesServiceFactory()
: BrowserContextKeyedServiceFactory(
"SavedDevicesService",
BrowserContextDependencyManager::GetInstance()) {
}
SavedDevicesServiceFactory::~SavedDevicesServiceFactory() {
}
KeyedService* SavedDevicesServiceFactory::BuildServiceInstanceFor(
content::BrowserContext* profile) const {
return new SavedDevicesService(static_cast<Profile*>(profile));
}
} // namespace apps
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef APPS_SAVED_DEVICES_SERVICE_FACTORY_H_
#define APPS_SAVED_DEVICES_SERVICE_FACTORY_H_
#include "base/memory/singleton.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
class Profile;
namespace apps {
class SavedDevicesService;
// BrowserContextKeyedServiceFactory for SavedDevicesService.
class SavedDevicesServiceFactory : public BrowserContextKeyedServiceFactory {
public:
static SavedDevicesService* GetForProfile(Profile* profile);
static SavedDevicesServiceFactory* GetInstance();
private:
SavedDevicesServiceFactory();
virtual ~SavedDevicesServiceFactory();
friend struct DefaultSingletonTraits<SavedDevicesServiceFactory>;
virtual KeyedService* BuildServiceInstanceFor(
content::BrowserContext* profile) const OVERRIDE;
};
} // namespace apps
#endif // APPS_SAVED_DEVICES_SERVICE_FACTORY_H_
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "apps/saved_devices_service.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/values_test_util.h" #include "base/test/values_test_util.h"
...@@ -10,19 +9,18 @@ ...@@ -10,19 +9,18 @@
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "device/usb/usb_device.h" #include "device/usb/usb_device.h"
#include "device/usb/usb_device_handle.h" #include "device/usb/usb_device_handle.h"
#include "extensions/browser/api/device_permissions_manager.h"
#include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_prefs.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace apps { namespace extensions {
namespace { namespace {
using device::UsbDevice; using device::UsbDevice;
using device::UsbDeviceHandle; using device::UsbDeviceHandle;
using device::UsbEndpointDirection;
using device::UsbTransferCallback;
using testing::Return; using testing::Return;
class MockUsbDevice : public UsbDevice { class MockUsbDevice : public UsbDevice {
...@@ -39,12 +37,12 @@ class MockUsbDevice : public UsbDevice { ...@@ -39,12 +37,12 @@ class MockUsbDevice : public UsbDevice {
MOCK_METHOD1(GetManufacturer, bool(base::string16*)); MOCK_METHOD1(GetManufacturer, bool(base::string16*));
MOCK_METHOD1(GetProduct, bool(base::string16*)); MOCK_METHOD1(GetProduct, bool(base::string16*));
bool GetSerialNumber(base::string16* serial) OVERRIDE { virtual bool GetSerialNumber(base::string16* serial_number) OVERRIDE {
if (serial_number_.empty()) { if (serial_number_.empty()) {
return false; return false;
} }
*serial = base::UTF8ToUTF16(serial_number_); *serial_number = base::UTF8ToUTF16(serial_number_);
return true; return true;
} }
...@@ -55,9 +53,10 @@ class MockUsbDevice : public UsbDevice { ...@@ -55,9 +53,10 @@ class MockUsbDevice : public UsbDevice {
const std::string serial_number_; const std::string serial_number_;
}; };
}
class SavedDevicesServiceTest : public testing::Test { } // namespace
class DevicePermissionsManagerTest : public testing::Test {
protected: protected:
virtual void SetUp() OVERRIDE { virtual void SetUp() OVERRIDE {
testing::Test::SetUp(); testing::Test::SetUp();
...@@ -73,7 +72,6 @@ class SavedDevicesServiceTest : public testing::Test { ...@@ -73,7 +72,6 @@ class SavedDevicesServiceTest : public testing::Test {
" \"usb\"" " \"usb\""
" ]" " ]"
"}")); "}"));
service_ = SavedDevicesService::Get(env_.profile());
device0 = new MockUsbDevice("ABCDE", 0); device0 = new MockUsbDevice("ABCDE", 0);
device1 = new MockUsbDevice("", 1); device1 = new MockUsbDevice("", 1);
device2 = new MockUsbDevice("12345", 2); device2 = new MockUsbDevice("12345", 2);
...@@ -82,53 +80,49 @@ class SavedDevicesServiceTest : public testing::Test { ...@@ -82,53 +80,49 @@ class SavedDevicesServiceTest : public testing::Test {
extensions::TestExtensionEnvironment env_; extensions::TestExtensionEnvironment env_;
const extensions::Extension* extension_; const extensions::Extension* extension_;
SavedDevicesService* service_;
scoped_refptr<MockUsbDevice> device0; scoped_refptr<MockUsbDevice> device0;
scoped_refptr<MockUsbDevice> device1; scoped_refptr<MockUsbDevice> device1;
scoped_refptr<MockUsbDevice> device2; scoped_refptr<MockUsbDevice> device2;
scoped_refptr<MockUsbDevice> device3; scoped_refptr<MockUsbDevice> device3;
}; };
TEST_F(SavedDevicesServiceTest, RegisterDevices) { TEST_F(DevicePermissionsManagerTest, RegisterDevices) {
SavedDevicesService::SavedDevices* saved_devices = DevicePermissionsManager* manager =
service_->GetOrInsert(extension_->id()); DevicePermissionsManager::Get(env_.profile());
manager->AllowUsbDevice(
base::string16 serial_number(base::ASCIIToUTF16("ABCDE")); extension_->id(), device0, base::ASCIIToUTF16("ABCDE"));
saved_devices->RegisterDevice(device0, &serial_number); manager->AllowUsbDevice(extension_->id(), device1, base::string16());
saved_devices->RegisterDevice(device1, NULL);
scoped_ptr<DevicePermissions> device_permissions =
// This is necessary as writing out registered devices happens in a task on manager->GetForExtension(extension_->id());
// the UI thread. ASSERT_TRUE(device_permissions->CheckUsbDevice(device0));
base::RunLoop run_loop; ASSERT_TRUE(device_permissions->CheckUsbDevice(device1));
run_loop.RunUntilIdle(); ASSERT_FALSE(device_permissions->CheckUsbDevice(device2));
ASSERT_FALSE(device_permissions->CheckUsbDevice(device3));
ASSERT_TRUE(saved_devices->IsRegistered(device0));
ASSERT_TRUE(saved_devices->IsRegistered(device1)); std::vector<base::string16> device_messages =
ASSERT_FALSE(saved_devices->IsRegistered(device2)); manager->GetPermissionMessageStrings(extension_->id());
ASSERT_FALSE(saved_devices->IsRegistered(device3)); ASSERT_EQ(1U, device_messages.size());
ASSERT_NE(device_messages[0].find(base::ASCIIToUTF16("ABCDE")),
std::vector<SavedDeviceEntry> device_entries = base::string16::npos);
service_->GetAllDevices(extension_->id());
ASSERT_EQ(1U, device_entries.size());
ASSERT_EQ(base::ASCIIToUTF16("ABCDE"), device_entries[0].serial_number);
device1->NotifyDisconnect(); device1->NotifyDisconnect();
ASSERT_TRUE(saved_devices->IsRegistered(device0)); device_permissions = manager->GetForExtension(extension_->id());
ASSERT_FALSE(saved_devices->IsRegistered(device1)); ASSERT_TRUE(device_permissions->CheckUsbDevice(device0));
ASSERT_FALSE(saved_devices->IsRegistered(device2)); ASSERT_FALSE(device_permissions->CheckUsbDevice(device1));
ASSERT_FALSE(saved_devices->IsRegistered(device3)); ASSERT_FALSE(device_permissions->CheckUsbDevice(device2));
ASSERT_FALSE(device_permissions->CheckUsbDevice(device3));
service_->Clear(extension_->id()); manager->Clear(extension_->id());
// App is normally restarted, clearing its reference to the SavedDevices. device_permissions = manager->GetForExtension(extension_->id());
saved_devices = service_->GetOrInsert(extension_->id()); ASSERT_FALSE(device_permissions->CheckUsbDevice(device0));
ASSERT_FALSE(saved_devices->IsRegistered(device0)); device_messages = manager->GetPermissionMessageStrings(extension_->id());
device_entries = service_->GetAllDevices(extension_->id()); ASSERT_EQ(0U, device_messages.size());
ASSERT_EQ(0U, device_entries.size());
} }
TEST_F(SavedDevicesServiceTest, LoadPrefs) { TEST_F(DevicePermissionsManagerTest, LoadPrefs) {
scoped_ptr<base::Value> prefs_value = base::test::ParseJson( scoped_ptr<base::Value> prefs_value = base::test::ParseJson(
"[" "["
" {" " {"
...@@ -141,12 +135,14 @@ TEST_F(SavedDevicesServiceTest, LoadPrefs) { ...@@ -141,12 +135,14 @@ TEST_F(SavedDevicesServiceTest, LoadPrefs) {
env_.GetExtensionPrefs()->UpdateExtensionPref( env_.GetExtensionPrefs()->UpdateExtensionPref(
extension_->id(), "devices", prefs_value.release()); extension_->id(), "devices", prefs_value.release());
SavedDevicesService::SavedDevices* saved_devices = DevicePermissionsManager* manager =
service_->GetOrInsert(extension_->id()); DevicePermissionsManager::Get(env_.profile());
ASSERT_TRUE(saved_devices->IsRegistered(device0)); scoped_ptr<DevicePermissions> device_permissions =
ASSERT_FALSE(saved_devices->IsRegistered(device1)); manager->GetForExtension(extension_->id());
ASSERT_FALSE(saved_devices->IsRegistered(device2)); ASSERT_TRUE(device_permissions->CheckUsbDevice(device0));
ASSERT_FALSE(saved_devices->IsRegistered(device3)); ASSERT_FALSE(device_permissions->CheckUsbDevice(device1));
ASSERT_FALSE(device_permissions->CheckUsbDevice(device2));
ASSERT_FALSE(device_permissions->CheckUsbDevice(device3));
} }
} // namespace apps } // namespace extensions
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
{ {
'variables': { 'variables': {
'chrome_unit_tests_sources': [ 'chrome_unit_tests_sources': [
'../apps/saved_devices_service_unittest.cc',
'../apps/saved_files_service_unittest.cc', '../apps/saved_files_service_unittest.cc',
'../components/autofill/content/renderer/test_password_autofill_agent.cc', '../components/autofill/content/renderer/test_password_autofill_agent.cc',
'../components/autofill/content/renderer/test_password_autofill_agent.h', '../components/autofill/content/renderer/test_password_autofill_agent.h',
...@@ -317,6 +316,7 @@ ...@@ -317,6 +316,7 @@
'browser/extensions/api/declarative_content/chrome_content_rules_registry_unittest.cc', 'browser/extensions/api/declarative_content/chrome_content_rules_registry_unittest.cc',
'browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc', 'browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc',
'browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc', 'browser/extensions/api/declarative_webrequest/webrequest_rules_registry_unittest.cc',
'browser/extensions/api/device_permissions_manager_unittest.cc',
'browser/extensions/api/dial/dial_device_data_unittest.cc', 'browser/extensions/api/dial/dial_device_data_unittest.cc',
'browser/extensions/api/dial/dial_registry_unittest.cc', 'browser/extensions/api/dial/dial_registry_unittest.cc',
'browser/extensions/api/dial/dial_service_unittest.cc', 'browser/extensions/api/dial/dial_service_unittest.cc',
......
...@@ -122,6 +122,8 @@ source_set("browser") { ...@@ -122,6 +122,8 @@ source_set("browser") {
"api/declarative_webrequest/webrequest_constants.h", "api/declarative_webrequest/webrequest_constants.h",
"api/declarative_webrequest/webrequest_rules_registry.cc", "api/declarative_webrequest/webrequest_rules_registry.cc",
"api/declarative_webrequest/webrequest_rules_registry.h", "api/declarative_webrequest/webrequest_rules_registry.h",
"api/device_permissions_manager.cc",
"api/device_permissions_manager.h",
"api/dns/dns_api.cc", "api/dns/dns_api.cc",
"api/dns/dns_api.h", "api/dns/dns_api.h",
"api/dns/host_resolver_wrapper.cc", "api/dns/host_resolver_wrapper.cc",
......
...@@ -7,6 +7,7 @@ include_rules = [ ...@@ -7,6 +7,7 @@ include_rules = [
"+components/web_modal", "+components/web_modal",
"+content/public/browser", "+content/public/browser",
"+device/bluetooth", "+device/bluetooth",
"+device/usb",
"+grit/extensions_strings.h", "+grit/extensions_strings.h",
"+net", "+net",
"+skia/ext/image_operations.h", "+skia/ext/image_operations.h",
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_DEVICE_PERMISSION_MANAGER_H_
#define EXTENSIONS_DEVICE_PERMISSION_MANAGER_H_
#include <map>
#include <set>
#include <vector>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h"
#include "base/threading/thread_checker.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "device/usb/usb_device.h"
template <typename T>
struct DefaultSingletonTraits;
namespace base {
class Value;
}
namespace content {
class BrowserContext;
}
namespace device {
class UsbDevice;
}
namespace extensions {
// Stores information about a device saved with access granted.
struct DevicePermissionEntry {
DevicePermissionEntry(uint16_t vendor_id,
uint16_t product_id,
const base::string16& serial_number);
base::Value* ToValue() const;
// The vendor ID of this device.
uint16_t vendor_id;
// The product ID of this device.
uint16_t product_id;
// The serial number (possibly alphanumeric) of this device.
base::string16 serial_number;
};
// Stores a copy of device permissions associated with a particular extension.
class DevicePermissions {
public:
virtual ~DevicePermissions();
bool CheckUsbDevice(scoped_refptr<device::UsbDevice> device) const;
private:
friend class DevicePermissionsManager;
DevicePermissions(content::BrowserContext* context,
const std::string& extension_id);
DevicePermissions(
const std::vector<DevicePermissionEntry>& permission_entries,
const std::set<scoped_refptr<device::UsbDevice>>& ephemeral_devices);
std::vector<DevicePermissionEntry>& permission_entries();
std::set<scoped_refptr<device::UsbDevice>>& ephemeral_devices();
std::vector<DevicePermissionEntry> permission_entries_;
std::set<scoped_refptr<device::UsbDevice>> ephemeral_devices_;
DISALLOW_COPY_AND_ASSIGN(DevicePermissions);
};
// Manages saved device permissions for all extensions.
class DevicePermissionsManager : public KeyedService,
public base::NonThreadSafe,
public content::NotificationObserver,
public device::UsbDevice::Observer {
public:
static DevicePermissionsManager* Get(content::BrowserContext* context);
// Returns a copy of the DevicePermissions object for a given extension that
// can be used by any thread.
scoped_ptr<DevicePermissions> GetForExtension(
const std::string& extension_id);
std::vector<base::string16> GetPermissionMessageStrings(
const std::string& extension_id);
void AllowUsbDevice(const std::string& extension_id,
scoped_refptr<device::UsbDevice> device,
const base::string16& serial_number);
void Clear(const std::string& extension_id);
private:
friend class DevicePermissionsManagerFactory;
DevicePermissionsManager(content::BrowserContext* context);
virtual ~DevicePermissionsManager();
DevicePermissions* Get(const std::string& extension_id) const;
DevicePermissions* GetOrInsert(const std::string& extension_id);
// content::NotificationObserver.
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
// device::UsbDevice::Observer
virtual void OnDisconnect(scoped_refptr<device::UsbDevice> device) OVERRIDE;
content::BrowserContext* context_;
std::map<std::string, DevicePermissions*> extension_id_to_device_permissions_;
content::NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(DevicePermissionsManager);
};
class DevicePermissionsManagerFactory
: public BrowserContextKeyedServiceFactory {
public:
static DevicePermissionsManager* GetForBrowserContext(
content::BrowserContext* context);
static DevicePermissionsManagerFactory* GetInstance();
private:
friend struct DefaultSingletonTraits<DevicePermissionsManagerFactory>;
DevicePermissionsManagerFactory();
virtual ~DevicePermissionsManagerFactory();
// BrowserContextKeyedServiceFactory
virtual KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const OVERRIDE;
DISALLOW_COPY_AND_ASSIGN(DevicePermissionsManagerFactory);
};
} // namespace extensions
#endif // EXTENSIONS_DEVICE_PERMISSION_MANAGER_H_
include_rules = [ include_rules = [
"+device/core", "+device/core",
"+device/usb",
] ]
include_rules = [ include_rules = [
"+device/core", "+device/core",
"+device/usb",
] ]
...@@ -394,6 +394,8 @@ ...@@ -394,6 +394,8 @@
'browser/api/declarative_webrequest/webrequest_constants.h', 'browser/api/declarative_webrequest/webrequest_constants.h',
'browser/api/declarative_webrequest/webrequest_rules_registry.cc', 'browser/api/declarative_webrequest/webrequest_rules_registry.cc',
'browser/api/declarative_webrequest/webrequest_rules_registry.h', 'browser/api/declarative_webrequest/webrequest_rules_registry.h',
'browser/api/device_permissions_manager.cc',
'browser/api/device_permissions_manager.h',
'browser/api/dns/dns_api.cc', 'browser/api/dns/dns_api.cc',
'browser/api/dns/dns_api.h', 'browser/api/dns/dns_api.h',
'browser/api/dns/host_resolver_wrapper.cc', 'browser/api/dns/host_resolver_wrapper.cc',
......
...@@ -323,6 +323,15 @@ ...@@ -323,6 +323,15 @@
<message name="IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX" desc="The prefix for a guest page loaded in a webview tag in the Task Manager"> <message name="IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX" desc="The prefix for a guest page loaded in a webview tag in the Task Manager">
Webview: <ph name="WEBVIEW_TAG_NAME">$1<ex>Google</ex></ph> Webview: <ph name="WEBVIEW_TAG_NAME">$1<ex>Google</ex></ph>
</message> </message>
<message name="IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_SERIAL" desc="Permission string for accessing a USB device with a known vendor name, product name and serial number.">
<ph name="PRODUCT_NAME">$2<ex>Nexus 5</ex></ph> from <ph name="VENDOR_NAME">$1<ex>Google Inc.</ex></ph> (serial number <ph name="SERIAL_NUMBER">$3<ex>ABCDEF123456</ex></ph>)
</message>
<message name="IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_PID_SERIAL" desc="Permission string for accessing a USB device with a known vendor name and serial number and a hexidecimal product ID.">
Product <ph name="PRODUCT_ID">$2<ex>0x1234</ex></ph> from <ph name="VENDOR_NAME">$1<ex>Google Inc.</ex></ph> (serial number <ph name="SERIAL_NUMBER">$3<ex>ABCDEF123456</ex></ph>)
</message>
<message name="IDS_EXTENSION_PROMPT_WARNING_USB_DEVICE_VID_PID_SERIAL" desc="Permission string for accessing a USB device with a known serial number and a hexidecimal vendor and product IDs.">
Product <ph name="PRODUCT_ID">$2<ex>0x5678</ex></ph> from Vendor <ph name="VENDOR_ID">$1<ex>0x1234</ex></ph> (serial number <ph name="SERIAL_NUMBER">$3<ex>ABCDEF123456</ex></ph>)
</message>
<!-- Global error messages for extensions. Please keep alphabetized. --> <!-- Global error messages for extensions. Please keep alphabetized. -->
<message name="IDS_EXTENSION_WARNINGS_NETWORK_DELAY" desc="Warning message indicating that an extension caused excessive network delays for web requests"> <message name="IDS_EXTENSION_WARNINGS_NETWORK_DELAY" desc="Warning message indicating that an extension caused excessive network delays for web requests">
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment