summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorrockot@chromium.org <rockot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-25 15:24:39 +0000
committerrockot@chromium.org <rockot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-25 15:24:39 +0000
commitda6eba379039059740220bcbaefe475613326fb9 (patch)
tree7f0893d1834f2b3ed66f01ee5e136a5a77ac2f01 /extensions
parent2e7c235f18a696ff82d619f6102c3686a51c6a64 (diff)
downloadchromium_src-da6eba379039059740220bcbaefe475613326fb9.zip
chromium_src-da6eba379039059740220bcbaefe475613326fb9.tar.gz
chromium_src-da6eba379039059740220bcbaefe475613326fb9.tar.bz2
Move DNS API to //extensions.
This was an easy target to move and it kills one more //chrome dep from //extensions. BUG=355752 TBR=rpaquay@chromium.org FYI for mechanical sockets changes Review URL: https://codereview.chromium.org/209473012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@259199 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'extensions')
-rw-r--r--extensions/browser/DEPS1
-rw-r--r--extensions/browser/api/dns/dns_api.cc104
-rw-r--r--extensions/browser/api/dns/dns_api.h52
-rw-r--r--extensions/browser/api/dns/host_resolver_wrapper.cc26
-rw-r--r--extensions/browser/api/dns/host_resolver_wrapper.h46
-rw-r--r--extensions/browser/api/socket/socket_api.cc2
-rw-r--r--extensions/common/api/api.gyp1
-rw-r--r--extensions/common/api/dns.idl27
-rw-r--r--extensions/extensions.gyp4
9 files changed, 261 insertions, 2 deletions
diff --git a/extensions/browser/DEPS b/extensions/browser/DEPS
index 0060709..3ff0288 100644
--- a/extensions/browser/DEPS
+++ b/extensions/browser/DEPS
@@ -14,7 +14,6 @@ include_rules = [
# TODO(jamescook): Remove these. http://crbug.com/162530
"+chrome/browser/chrome_notification_types.h",
"+chrome/browser/extensions/api/content_settings/content_settings_store.h",
- "+chrome/browser/extensions/api/dns/host_resolver_wrapper.h",
"+chrome/browser/extensions/api/preference/preference_api.h",
"+chrome/browser/extensions/api/runtime/runtime_api.h",
"+chrome/browser/renderer_host/chrome_render_message_filter.h",
diff --git a/extensions/browser/api/dns/dns_api.cc b/extensions/browser/api/dns/dns_api.cc
new file mode 100644
index 0000000..43ffc32
--- /dev/null
+++ b/extensions/browser/api/dns/dns_api.cc
@@ -0,0 +1,104 @@
+// 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 "extensions/browser/api/dns/dns_api.h"
+
+#include "base/bind.h"
+#include "base/values.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/resource_context.h"
+#include "extensions/browser/api/dns/host_resolver_wrapper.h"
+#include "extensions/common/api/dns.h"
+#include "net/base/host_port_pair.h"
+#include "net/base/net_errors.h"
+#include "net/base/net_log.h"
+
+using content::BrowserThread;
+using extensions::core_api::dns::ResolveCallbackResolveInfo;
+
+namespace Resolve = extensions::core_api::dns::Resolve;
+
+namespace extensions {
+
+DnsResolveFunction::DnsResolveFunction()
+ : resource_context_(NULL),
+ response_(false),
+ request_handle_(new net::HostResolver::RequestHandle()),
+ addresses_(new net::AddressList) {}
+
+DnsResolveFunction::~DnsResolveFunction() {}
+
+bool DnsResolveFunction::RunImpl() {
+ scoped_ptr<Resolve::Params> params(Resolve::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ hostname_ = params->hostname;
+ resource_context_ = browser_context()->GetResourceContext();
+
+ bool result = BrowserThread::PostTask(
+ BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&DnsResolveFunction::WorkOnIOThread, this));
+ DCHECK(result);
+ return true;
+}
+
+void DnsResolveFunction::WorkOnIOThread() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ net::HostResolver* host_resolver =
+ HostResolverWrapper::GetInstance()->GetHostResolver(
+ resource_context_->GetHostResolver());
+ DCHECK(host_resolver);
+
+ // Yes, we are passing zero as the port. There are some interesting but not
+ // presently relevant reasons why HostResolver asks for the port of the
+ // hostname you'd like to resolve, even though it doesn't use that value in
+ // determining its answer.
+ net::HostPortPair host_port_pair(hostname_, 0);
+
+ net::HostResolver::RequestInfo request_info(host_port_pair);
+ int resolve_result = host_resolver->Resolve(
+ request_info,
+ net::DEFAULT_PRIORITY,
+ addresses_.get(),
+ base::Bind(&DnsResolveFunction::OnLookupFinished, this),
+ request_handle_.get(),
+ net::BoundNetLog());
+
+ // Balanced in OnLookupFinished.
+ AddRef();
+
+ if (resolve_result != net::ERR_IO_PENDING)
+ OnLookupFinished(resolve_result);
+}
+
+void DnsResolveFunction::RespondOnUIThread() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ SendResponse(response_);
+}
+
+void DnsResolveFunction::OnLookupFinished(int resolve_result) {
+ scoped_ptr<ResolveCallbackResolveInfo> resolve_info(
+ new ResolveCallbackResolveInfo());
+ resolve_info->result_code = resolve_result;
+ if (resolve_result == net::OK) {
+ DCHECK(!addresses_->empty());
+ resolve_info->address.reset(
+ new std::string(addresses_->front().ToStringWithoutPort()));
+ }
+ results_ = Resolve::Results::Create(*resolve_info);
+ response_ = true;
+
+ bool post_task_result = BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&DnsResolveFunction::RespondOnUIThread, this));
+ DCHECK(post_task_result);
+
+ Release(); // Added in WorkOnIOThread().
+}
+
+} // namespace extensions
diff --git a/extensions/browser/api/dns/dns_api.h b/extensions/browser/api/dns/dns_api.h
new file mode 100644
index 0000000..f14769b
--- /dev/null
+++ b/extensions/browser/api/dns/dns_api.h
@@ -0,0 +1,52 @@
+// 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_BROWSER_API_DNS_DNS_API_H_
+#define EXTENSIONS_BROWSER_API_DNS_DNS_API_H_
+
+#include <string>
+
+#include "extensions/browser/extension_function.h"
+#include "net/base/address_list.h"
+#include "net/base/completion_callback.h"
+#include "net/dns/host_resolver.h"
+
+namespace content {
+class ResourceContext;
+}
+
+namespace extensions {
+
+class DnsResolveFunction : public AsyncExtensionFunction {
+ public:
+ DECLARE_EXTENSION_FUNCTION("dns.resolve", DNS_RESOLVE)
+
+ DnsResolveFunction();
+
+ protected:
+ virtual ~DnsResolveFunction();
+
+ // ExtensionFunction:
+ virtual bool RunImpl() OVERRIDE;
+
+ void WorkOnIOThread();
+ void RespondOnUIThread();
+
+ private:
+ void OnLookupFinished(int result);
+
+ std::string hostname_;
+
+ // Not owned.
+ content::ResourceContext* resource_context_;
+
+ bool response_; // The value sent in SendResponse().
+
+ scoped_ptr<net::HostResolver::RequestHandle> request_handle_;
+ scoped_ptr<net::AddressList> addresses_;
+};
+
+} // namespace extensions
+
+#endif // EXTENSIONS_BROWSER_API_DNS_DNS_API_H_
diff --git a/extensions/browser/api/dns/host_resolver_wrapper.cc b/extensions/browser/api/dns/host_resolver_wrapper.cc
new file mode 100644
index 0000000..f97a9c7
--- /dev/null
+++ b/extensions/browser/api/dns/host_resolver_wrapper.cc
@@ -0,0 +1,26 @@
+// 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 "extensions/browser/api/dns/host_resolver_wrapper.h"
+
+namespace extensions {
+
+HostResolverWrapper::HostResolverWrapper() : resolver_(NULL) {}
+
+// static
+HostResolverWrapper* HostResolverWrapper::GetInstance() {
+ return Singleton<extensions::HostResolverWrapper>::get();
+}
+
+net::HostResolver* HostResolverWrapper::GetHostResolver(
+ net::HostResolver* real_resolver) {
+ return resolver_ ? resolver_ : real_resolver;
+}
+
+void HostResolverWrapper::SetHostResolverForTesting(
+ net::HostResolver* mock_resolver) {
+ resolver_ = mock_resolver;
+}
+
+} // namespace extensions
diff --git a/extensions/browser/api/dns/host_resolver_wrapper.h b/extensions/browser/api/dns/host_resolver_wrapper.h
new file mode 100644
index 0000000..4eb4282
--- /dev/null
+++ b/extensions/browser/api/dns/host_resolver_wrapper.h
@@ -0,0 +1,46 @@
+// 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_BROWSER_API_DNS_HOST_RESOLVER_WRAPPER_H_
+#define EXTENSIONS_BROWSER_API_DNS_HOST_RESOLVER_WRAPPER_H_
+
+#include "base/memory/singleton.h"
+#include "net/dns/host_resolver.h"
+
+namespace extensions {
+
+// Used for testing. In production code, this class does nothing interesting.
+// This class is a singleton that holds a pointer to a mock HostResolver, or
+// else to NULL. API classes that need to resolve hostnames ask this class for
+// the correct HostResolver to use, passing in the one that they want to use,
+// thereby avoiding most lifetime issues, and it will reply with either that
+// same one, or else the test version to use instead.
+//
+// This is a pretty complicated way to replace a single pointer with another.
+// TODO(miket): make the previous statement obsolete.
+class HostResolverWrapper {
+ public:
+ static HostResolverWrapper* GetInstance();
+
+ // Given a pointer to a real host resolver, returns the same pointer or else
+ // a substitute MockHostResolver to use instead. If
+ // SetHostResolverForTesting() hasn't been called, then this method returns
+ // the supplied argument as its result.
+ net::HostResolver* GetHostResolver(net::HostResolver* real_resolver);
+
+ // Sets the MockHostResolver to return in GetHostResolver().
+ void SetHostResolverForTesting(net::HostResolver* mock_resolver);
+
+ private:
+ HostResolverWrapper();
+ friend struct DefaultSingletonTraits<HostResolverWrapper>;
+
+ net::HostResolver* resolver_;
+
+ DISALLOW_COPY_AND_ASSIGN(HostResolverWrapper);
+};
+
+} // namespace extensions
+
+#endif // EXTENSIONS_BROWSER_API_DNS_HOST_RESOLVER_WRAPPER_H_
diff --git a/extensions/browser/api/socket/socket_api.cc b/extensions/browser/api/socket/socket_api.cc
index dbe7a87..280e927c 100644
--- a/extensions/browser/api/socket/socket_api.cc
+++ b/extensions/browser/api/socket/socket_api.cc
@@ -8,9 +8,9 @@
#include "base/bind.h"
#include "base/containers/hash_tables.h"
-#include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/resource_context.h"
+#include "extensions/browser/api/dns/host_resolver_wrapper.h"
#include "extensions/browser/api/socket/socket.h"
#include "extensions/browser/api/socket/tcp_socket.h"
#include "extensions/browser/api/socket/udp_socket.h"
diff --git a/extensions/common/api/api.gyp b/extensions/common/api/api.gyp
index 8297269..fb3c2b9 100644
--- a/extensions/common/api/api.gyp
+++ b/extensions/common/api/api.gyp
@@ -22,6 +22,7 @@
],
# TODO: Eliminate these on Android. See crbug.com/305852.
'schema_files': [
+ 'dns.idl',
'socket.idl',
'sockets_tcp.idl',
'sockets_tcp_server.idl',
diff --git a/extensions/common/api/dns.idl b/extensions/common/api/dns.idl
new file mode 100644
index 0000000..0500c0f
--- /dev/null
+++ b/extensions/common/api/dns.idl
@@ -0,0 +1,27 @@
+// 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.
+
+// Use the <code>chrome.dns</code> API for dns resolution.
+namespace dns {
+
+ dictionary ResolveCallbackResolveInfo {
+ // The result code. Zero indicates success.
+ long resultCode;
+
+ // A string representing the IP address literal. Supplied only if resultCode
+ // indicates success. Note that we presently return only IPv4 addresses.
+ DOMString? address;
+ };
+
+ callback ResolveCallback = void (ResolveCallbackResolveInfo resolveInfo);
+
+ interface Functions {
+ // Resolves the given hostname or IP address literal.
+ // |hostname| : The hostname to resolve.
+ // |callback| : Called when the resolution operation completes.
+ static void resolve(DOMString hostname,
+ ResolveCallback callback);
+ };
+
+};
diff --git a/extensions/extensions.gyp b/extensions/extensions.gyp
index 2da4dc4..3319a5c 100644
--- a/extensions/extensions.gyp
+++ b/extensions/extensions.gyp
@@ -200,6 +200,10 @@
'browser/api/api_resource_manager.h',
'browser/api/async_api_function.cc',
'browser/api/async_api_function.h',
+ 'browser/api/dns/dns_api.cc',
+ 'browser/api/dns/dns_api.h',
+ 'browser/api/dns/host_resolver_wrapper.cc',
+ 'browser/api/dns/host_resolver_wrapper.h',
'browser/api/extensions_api_client.cc',
'browser/api/extensions_api_client.h',
'browser/api/socket/socket.cc',