diff options
15 files changed, 249 insertions, 0 deletions
diff --git a/chrome/browser/extensions/api/system_network/system_network_api.cc b/chrome/browser/extensions/api/system_network/system_network_api.cc new file mode 100644 index 0000000..25621c2 --- /dev/null +++ b/chrome/browser/extensions/api/system_network/system_network_api.cc @@ -0,0 +1,73 @@ +// Copyright 2013 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 "chrome/browser/extensions/api/system_network/system_network_api.h" + +namespace { +const char kNetworkListError[] = "Network lookup failed or unsupported"; +} // namespace + +namespace extensions { +namespace api { + +SystemNetworkGetNetworkInterfacesFunction:: + SystemNetworkGetNetworkInterfacesFunction() {} + +SystemNetworkGetNetworkInterfacesFunction:: + ~SystemNetworkGetNetworkInterfacesFunction() {} + +bool SystemNetworkGetNetworkInterfacesFunction::RunImpl() { + content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, + base::Bind(&SystemNetworkGetNetworkInterfacesFunction:: + GetListOnFileThread, + this)); + return true; +} + +void SystemNetworkGetNetworkInterfacesFunction::GetListOnFileThread() { + net::NetworkInterfaceList interface_list; + if (net::GetNetworkList(&interface_list)) { + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + base::Bind(&SystemNetworkGetNetworkInterfacesFunction:: + SendResponseOnUIThread, + this, interface_list)); + return; + } + + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, + base::Bind(&SystemNetworkGetNetworkInterfacesFunction:: + HandleGetListError, + this)); +} + +void SystemNetworkGetNetworkInterfacesFunction::HandleGetListError() { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + error_ = kNetworkListError; + SendResponse(false); +} + +void SystemNetworkGetNetworkInterfacesFunction::SendResponseOnUIThread( + const net::NetworkInterfaceList& interface_list) { + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); + + std::vector<linked_ptr<api::system_network::NetworkInterface> > + create_arg; + create_arg.reserve(interface_list.size()); + for (net::NetworkInterfaceList::const_iterator i = interface_list.begin(); + i != interface_list.end(); ++i) { + linked_ptr<api::system_network::NetworkInterface> info = + make_linked_ptr(new api::system_network::NetworkInterface); + info->name = i->name; + info->address = net::IPAddressToString(i->address); + info->prefix_length = i->network_prefix; + create_arg.push_back(info); + } + + results_ = api::system_network::GetNetworkInterfaces::Results::Create( + create_arg); + SendResponse(true); +} + +} // namespace api +} // namespace extensions diff --git a/chrome/browser/extensions/api/system_network/system_network_api.h b/chrome/browser/extensions/api/system_network/system_network_api.h new file mode 100644 index 0000000..ed14631 --- /dev/null +++ b/chrome/browser/extensions/api/system_network/system_network_api.h @@ -0,0 +1,38 @@ +// Copyright 2013 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 CHROME_BROWSER_EXTENSIONS_API_SYSTEM_NETWORK_SYSTEM_NETWORK_API_H_ +#define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_NETWORK_SYSTEM_NETWORK_API_H_ + +#include "chrome/common/extensions/api/system_network.h" +#include "extensions/browser/extension_function.h" +#include "net/base/net_util.h" + +namespace extensions { +namespace api { + +class SystemNetworkGetNetworkInterfacesFunction + : public AsyncExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("system.network.getNetworkInterfaces", + SYSTEM_NETWORK_GETNETWORKINTERFACES) + + SystemNetworkGetNetworkInterfacesFunction(); + + protected: + virtual ~SystemNetworkGetNetworkInterfacesFunction(); + + // AsyncApiFunction: + virtual bool RunImpl() OVERRIDE; + + private: + void GetListOnFileThread(); + void HandleGetListError(); + void SendResponseOnUIThread(const net::NetworkInterfaceList& interface_list); +}; + +} // namespace api +} // namespace extensions + +#endif // CHROME_BROWSER_EXTENSIONS_API_SYSTEM_NETWORK_SYSTEM_NETWORK_API_H_ diff --git a/chrome/browser/extensions/api/system_network/system_network_apitest.cc b/chrome/browser/extensions/api/system_network/system_network_apitest.cc new file mode 100644 index 0000000..69c8448 --- /dev/null +++ b/chrome/browser/extensions/api/system_network/system_network_apitest.cc @@ -0,0 +1,67 @@ +// Copyright 2013 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 "base/memory/ref_counted.h" +#include "base/path_service.h" +#include "base/strings/stringprintf.h" +#include "chrome/browser/extensions/api/system_network/system_network_api.h" +#include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/browser/extensions/extension_function_test_utils.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_test_message_listener.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/extensions/application_launch.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" + +using extensions::Extension; +using extensions::api::SystemNetworkGetNetworkInterfacesFunction; +using extensions::api::system_network::NetworkInterface; + +namespace utils = extension_function_test_utils; + +namespace { + +class SystemNetworkApiTest : public ExtensionApiTest { +}; + +} // namespace + +IN_PROC_BROWSER_TEST_F(SystemNetworkApiTest, SystemNetworkExtension) { + ASSERT_TRUE(RunExtensionTest("system/network")) << message_; +} + +IN_PROC_BROWSER_TEST_F(SystemNetworkApiTest, GetNetworkInterfaces) { + scoped_refptr<SystemNetworkGetNetworkInterfacesFunction> socket_function( + new SystemNetworkGetNetworkInterfacesFunction()); + scoped_refptr<Extension> empty_extension(utils::CreateEmptyExtension()); + + socket_function->set_extension(empty_extension.get()); + socket_function->set_has_callback(true); + + scoped_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult( + socket_function.get(), "[]", browser(), utils::NONE)); + ASSERT_EQ(base::Value::TYPE_LIST, result->GetType()); + + // All we can confirm is that we have at least one address, but not what it + // is. + base::ListValue *value = static_cast<base::ListValue*>(result.get()); + ASSERT_TRUE(value->GetSize() > 0); + + for (base::ListValue::const_iterator it = value->begin(); + it != value->end(); ++it) { + base::Value* network_interface_value = *it; + + NetworkInterface network_interface; + ASSERT_TRUE(NetworkInterface::Populate(*network_interface_value, + &network_interface)); + + LOG(INFO) << "Network interface: address=" << network_interface.address + << ", name=" << network_interface.name + << ", prefix length=" << network_interface.prefix_length; + ASSERT_NE(std::string(), network_interface.address); + ASSERT_NE(std::string(), network_interface.name); + ASSERT_LE(0, network_interface.prefix_length); + } +} diff --git a/chrome/browser/extensions/extension_function_histogram_value.h b/chrome/browser/extensions/extension_function_histogram_value.h index e1db466..de232509 100644 --- a/chrome/browser/extensions/extension_function_histogram_value.h +++ b/chrome/browser/extensions/extension_function_histogram_value.h @@ -692,6 +692,7 @@ enum HistogramValue { SCREENLOCKPRIVATE_SETLOCKED, SCREENLOCKPRIVATE_SHOWMESSAGE, FEEDBACKPRIVATE_GETHISTOGRAMS, + SYSTEM_NETWORK_GETNETWORKINTERFACES, ENUM_BOUNDARY // Last entry: Add new entries above. }; diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index 2cecbfe..63c82b2 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi @@ -556,6 +556,8 @@ 'browser/extensions/api/system_memory/memory_info_provider.h', 'browser/extensions/api/system_memory/system_memory_api.cc', 'browser/extensions/api/system_memory/system_memory_api.h', + 'browser/extensions/api/system_network/system_network_api.cc', + 'browser/extensions/api/system_network/system_network_api.h', 'browser/extensions/api/system_private/system_private_api.cc', 'browser/extensions/api/system_private/system_private_api.h', 'browser/extensions/api/system_storage/storage_info_provider.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index b343f3b..54c57b2 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1180,6 +1180,7 @@ 'browser/extensions/api/system_cpu/system_cpu_apitest.cc', 'browser/extensions/api/system_display/system_display_apitest.cc', 'browser/extensions/api/system_memory/system_memory_apitest.cc', + 'browser/extensions/api/system_network/system_network_apitest.cc', 'browser/extensions/api/system_private/system_private_apitest.cc', 'browser/extensions/api/system_storage/storage_api_test_util.cc', 'browser/extensions/api/system_storage/storage_api_test_util.h', diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json index 96f9bdd..07cc3a6 100644 --- a/chrome/common/extensions/api/_api_features.json +++ b/chrome/common/extensions/api/_api_features.json @@ -595,6 +595,11 @@ "dependencies": ["permission:system.memory"], "contexts": ["blessed_extension"] }, + "system.network": { + "dependencies": ["permission:system.network"], + "channel": "dev", + "contexts": ["blessed_extension"] + }, "system.storage": { "dependencies": ["permission:system.storage"], "contexts": ["blessed_extension"] diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json index 482a5cf..bb81299 100644 --- a/chrome/common/extensions/api/_permission_features.json +++ b/chrome/common/extensions/api/_permission_features.json @@ -723,6 +723,10 @@ "channel": "stable", "extension_types": ["extension", "legacy_packaged_app", "platform_app"] }, + "system.network": { + "channel": "dev", + "extension_types": ["platform_app"] + }, "system.storage": { "channel": "stable", "extension_types": ["extension", "legacy_packaged_app", "platform_app"] diff --git a/chrome/common/extensions/api/api.gyp b/chrome/common/extensions/api/api.gyp index 3c7847c..6b85815 100644 --- a/chrome/common/extensions/api/api.gyp +++ b/chrome/common/extensions/api/api.gyp @@ -108,6 +108,7 @@ 'system_display.idl', 'system_indicator.idl', 'system_memory.idl', + 'system_network.idl', 'system_private.json', 'system_storage.idl', 'tab_capture.idl', diff --git a/chrome/common/extensions/api/system_network.idl b/chrome/common/extensions/api/system_network.idl new file mode 100644 index 0000000..bbc28ae --- /dev/null +++ b/chrome/common/extensions/api/system_network.idl @@ -0,0 +1,30 @@ +// Copyright 2013 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. + +// Use the <code>chrome.system.network</code> API. +namespace system.network { + dictionary NetworkInterface { + // The underlying name of the adapter. On *nix, this will typically be + // "eth0", "wlan0", etc. + DOMString name; + + // The available IPv4/6 address. + DOMString address; + + // The prefix length + long prefixLength; + }; + + // Callback from the <code>getNetworkInterfaces</code> method. + // |networkInterfaces| : Array of object containing network interfaces + // information. + callback GetNetworkInterfacesCallback = + void (NetworkInterface[] networkInterfaces); + + interface Functions { + // Retrieves information about local adapters on this system. + // |callback| : Called when local adapter information is available. + static void getNetworkInterfaces(GetNetworkInterfacesCallback callback); + }; +}; diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.cc b/chrome/common/extensions/permissions/chrome_api_permissions.cc index ef79079..3ccb48f 100644 --- a/chrome/common/extensions/permissions/chrome_api_permissions.cc +++ b/chrome/common/extensions/permissions/chrome_api_permissions.cc @@ -346,6 +346,7 @@ std::vector<APIPermissionInfo*> ChromeAPIPermissions::GetAllPermissions() PermissionMessage::kSystemIndicator }, { APIPermission::kSystemCpu, "system.cpu" }, { APIPermission::kSystemMemory, "system.memory" }, + { APIPermission::kSystemNetwork, "system.network" }, { APIPermission::kSystemDisplay, "system.display" }, { APIPermission::kSystemStorage, "system.storage" }, { APIPermission::kPointerLock, "pointerLock" }, diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 9fc6dbf..58354137 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc @@ -676,6 +676,7 @@ TEST(PermissionsTest, PermissionMessages) { skip.insert(APIPermission::kSystemCpu); skip.insert(APIPermission::kSystemDisplay); skip.insert(APIPermission::kSystemMemory); + skip.insert(APIPermission::kSystemNetwork); skip.insert(APIPermission::kSystemStorage); skip.insert(APIPermission::kTts); skip.insert(APIPermission::kUnlimitedStorage); diff --git a/chrome/test/data/extensions/api_test/system/network/background.js b/chrome/test/data/extensions/api_test/system/network/background.js new file mode 100644 index 0000000..a343ba0 --- /dev/null +++ b/chrome/test/data/extensions/api_test/system/network/background.js @@ -0,0 +1,13 @@ +// Copyright 2013 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. + +var testGetNetworkInterfaces = function() { + chrome.system.network.getNetworkInterfaces(function(list) { + chrome.test.assertTrue(!!list, "Interface list is undefined."); + chrome.test.assertTrue(list.length > 0, "Interface list is empty."); + chrome.test.succeed(); + }); +}; + +chrome.test.runTests([testGetNetworkInterfaces]); diff --git a/chrome/test/data/extensions/api_test/system/network/manifest.json b/chrome/test/data/extensions/api_test/system/network/manifest.json new file mode 100644 index 0000000..3ffb980 --- /dev/null +++ b/chrome/test/data/extensions/api_test/system/network/manifest.json @@ -0,0 +1,11 @@ +{ + "name": "chrome.system.network extension", + "version": "0.1", + "description": "end-to-end browser test for chrome.system.network API", + "app": { + "background": { + "scripts": ["background.js"] + } + }, + "permissions": ["system.network"] +} diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h index b846077..601463c4 100644 --- a/extensions/common/permissions/api_permission.h +++ b/extensions/common/permissions/api_permission.h @@ -164,6 +164,7 @@ class APIPermission { kScreenlockPrivate, kSystemCpu, kSystemMemory, + kSystemNetwork, kSystemInfoCpu, kSystemInfoMemory, kEnumBoundary |