diff options
author | rockot@chromium.org <rockot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-25 15:24:39 +0000 |
---|---|---|
committer | rockot@chromium.org <rockot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-25 15:24:39 +0000 |
commit | da6eba379039059740220bcbaefe475613326fb9 (patch) | |
tree | 7f0893d1834f2b3ed66f01ee5e136a5a77ac2f01 /extensions | |
parent | 2e7c235f18a696ff82d619f6102c3686a51c6a64 (diff) | |
download | chromium_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/DEPS | 1 | ||||
-rw-r--r-- | extensions/browser/api/dns/dns_api.cc | 104 | ||||
-rw-r--r-- | extensions/browser/api/dns/dns_api.h | 52 | ||||
-rw-r--r-- | extensions/browser/api/dns/host_resolver_wrapper.cc | 26 | ||||
-rw-r--r-- | extensions/browser/api/dns/host_resolver_wrapper.h | 46 | ||||
-rw-r--r-- | extensions/browser/api/socket/socket_api.cc | 2 | ||||
-rw-r--r-- | extensions/common/api/api.gyp | 1 | ||||
-rw-r--r-- | extensions/common/api/dns.idl | 27 | ||||
-rw-r--r-- | extensions/extensions.gyp | 4 |
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', |