summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/api/system_network/system_network_api.cc73
-rw-r--r--chrome/browser/extensions/api/system_network/system_network_api.h38
-rw-r--r--chrome/browser/extensions/api/system_network/system_network_apitest.cc67
-rw-r--r--chrome/browser/extensions/extension_function_histogram_value.h1
-rw-r--r--chrome/chrome_browser_extensions.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/extensions/api/_api_features.json5
-rw-r--r--chrome/common/extensions/api/_permission_features.json4
-rw-r--r--chrome/common/extensions/api/api.gyp1
-rw-r--r--chrome/common/extensions/api/system_network.idl30
-rw-r--r--chrome/common/extensions/permissions/chrome_api_permissions.cc1
-rw-r--r--chrome/common/extensions/permissions/permission_set_unittest.cc1
-rw-r--r--chrome/test/data/extensions/api_test/system/network/background.js13
-rw-r--r--chrome/test/data/extensions/api_test/system/network/manifest.json11
-rw-r--r--extensions/common/permissions/api_permission.h1
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