| Index: chrome/browser/ui/webui/net_internals_ui.cc
|
| ===================================================================
|
| --- chrome/browser/ui/webui/net_internals_ui.cc (revision 117031)
|
| +++ chrome/browser/ui/webui/net_internals_ui.cc (working copy)
|
| @@ -1,1647 +0,0 @@
|
| -// Copyright (c) 2012 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/ui/webui/net_internals_ui.h"
|
| -
|
| -#include <algorithm>
|
| -#include <list>
|
| -#include <string>
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "base/base64.h"
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/command_line.h"
|
| -#include "base/memory/singleton.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/message_loop_helpers.h"
|
| -#include "base/path_service.h"
|
| -#include "base/string_number_conversions.h"
|
| -#include "base/string_piece.h"
|
| -#include "base/string_split.h"
|
| -#include "base/string_util.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/browsing_data_remover.h"
|
| -#include "chrome/browser/io_thread.h"
|
| -#include "chrome/browser/net/chrome_net_log.h"
|
| -#include "chrome/browser/net/connection_tester.h"
|
| -#include "chrome/browser/net/passive_log_collector.h"
|
| -#include "chrome/browser/net/url_fixer_upper.h"
|
| -#include "chrome/browser/prefs/pref_member.h"
|
| -#include "chrome/browser/prerender/prerender_manager.h"
|
| -#include "chrome/browser/prerender/prerender_manager_factory.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
|
| -#include "chrome/browser/ui/webui/chrome_web_ui_data_source.h"
|
| -#include "chrome/common/chrome_notification_types.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/common/chrome_version_info.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/notification_details.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/browser/web_ui_message_handler.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "grit/net_internals_resources.h"
|
| -#include "net/base/escape.h"
|
| -#include "net/base/host_cache.h"
|
| -#include "net/base/host_resolver.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "net/base/net_util.h"
|
| -#include "net/base/sys_addrinfo.h"
|
| -#include "net/base/transport_security_state.h"
|
| -#include "net/base/x509_cert_types.h"
|
| -#include "net/disk_cache/disk_cache.h"
|
| -#include "net/http/http_cache.h"
|
| -#include "net/http/http_network_layer.h"
|
| -#include "net/http/http_network_session.h"
|
| -#include "net/http/http_server_properties.h"
|
| -#include "net/http/http_stream_factory.h"
|
| -#include "net/proxy/proxy_service.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -
|
| -#ifdef OS_CHROMEOS
|
| -#include "chrome/browser/chromeos/cros/cros_library.h"
|
| -#include "chrome/browser/chromeos/cros/network_library.h"
|
| -#include "chrome/browser/chromeos/system/syslogs_provider.h"
|
| -#endif
|
| -#ifdef OS_WIN
|
| -#include "chrome/browser/net/service_providers_win.h"
|
| -#endif
|
| -
|
| -using content::BrowserThread;
|
| -using content::WebContents;
|
| -using content::WebUIMessageHandler;
|
| -
|
| -namespace {
|
| -
|
| -// Delay between when an event occurs and when it is passed to the Javascript
|
| -// page. All events that occur during this period are grouped together and
|
| -// sent to the page at once, which reduces context switching and CPU usage.
|
| -const int kNetLogEventDelayMilliseconds = 100;
|
| -
|
| -// about:net-internals will not even attempt to load a log dump when it
|
| -// encounters a new version. This should be incremented when significant
|
| -// changes are made that will invalidate the old loading code.
|
| -const int kLogFormatVersion = 1;
|
| -
|
| -// Returns the HostCache for |context|'s primary HostResolver, or NULL if
|
| -// there is none.
|
| -net::HostCache* GetHostResolverCache(net::URLRequestContext* context) {
|
| - return context->host_resolver()->GetHostCache();
|
| -}
|
| -
|
| -// Returns the disk cache backend for |context| if there is one, or NULL.
|
| -disk_cache::Backend* GetDiskCacheBackend(net::URLRequestContext* context) {
|
| - if (!context->http_transaction_factory())
|
| - return NULL;
|
| -
|
| - net::HttpCache* http_cache = context->http_transaction_factory()->GetCache();
|
| - if (!http_cache)
|
| - return NULL;
|
| -
|
| - return http_cache->GetCurrentBackend();
|
| -}
|
| -
|
| -// Returns the http network session for |context| if there is one.
|
| -// Otherwise, returns NULL.
|
| -net::HttpNetworkSession* GetHttpNetworkSession(
|
| - net::URLRequestContext* context) {
|
| - if (!context->http_transaction_factory())
|
| - return NULL;
|
| -
|
| - return context->http_transaction_factory()->GetSession();
|
| -}
|
| -
|
| -Value* ExperimentToValue(const ConnectionTester::Experiment& experiment) {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - if (experiment.url.is_valid())
|
| - dict->SetString("url", experiment.url.spec());
|
| -
|
| - dict->SetString("proxy_settings_experiment",
|
| - ConnectionTester::ProxySettingsExperimentDescription(
|
| - experiment.proxy_settings_experiment));
|
| - dict->SetString("host_resolver_experiment",
|
| - ConnectionTester::HostResolverExperimentDescription(
|
| - experiment.host_resolver_experiment));
|
| - return dict;
|
| -}
|
| -
|
| -ChromeWebUIDataSource* CreateNetInternalsHTMLSource() {
|
| - ChromeWebUIDataSource* source =
|
| - new ChromeWebUIDataSource(chrome::kChromeUINetInternalsHost);
|
| -
|
| - source->set_default_resource(IDR_NET_INTERNALS_INDEX_HTML);
|
| - source->add_resource_path("help.html", IDR_NET_INTERNALS_HELP_HTML);
|
| - source->add_resource_path("help.js", IDR_NET_INTERNALS_HELP_JS);
|
| - source->add_resource_path("index.js", IDR_NET_INTERNALS_INDEX_JS);
|
| - source->set_json_path("strings.js");
|
| - return source;
|
| -}
|
| -
|
| -// This class receives javascript messages from the renderer.
|
| -// Note that the WebUI infrastructure runs on the UI thread, therefore all of
|
| -// this class's methods are expected to run on the UI thread.
|
| -//
|
| -// Since the network code we want to run lives on the IO thread, we proxy
|
| -// almost everything over to NetInternalsMessageHandler::IOThreadImpl, which
|
| -// runs on the IO thread.
|
| -//
|
| -// TODO(eroman): Can we start on the IO thread to begin with?
|
| -class NetInternalsMessageHandler
|
| - : public WebUIMessageHandler,
|
| - public base::SupportsWeakPtr<NetInternalsMessageHandler>,
|
| - public content::NotificationObserver {
|
| - public:
|
| - NetInternalsMessageHandler();
|
| - virtual ~NetInternalsMessageHandler();
|
| -
|
| - // WebUIMessageHandler implementation.
|
| - virtual void RegisterMessages() OVERRIDE;
|
| -
|
| - // Calls g_browser.receive in the renderer, passing in |command| and |arg|.
|
| - // Takes ownership of |arg|. If the renderer is displaying a log file, the
|
| - // message will be ignored.
|
| - void SendJavascriptCommand(const std::string& command, Value* arg);
|
| -
|
| - // content::NotificationObserver implementation.
|
| - virtual void Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) OVERRIDE;
|
| -
|
| - // Javascript message handlers.
|
| - void OnRendererReady(const ListValue* list);
|
| - void OnEnableHttpThrottling(const ListValue* list);
|
| - void OnClearBrowserCache(const ListValue* list);
|
| - void OnGetPrerenderInfo(const ListValue* list);
|
| -#ifdef OS_CHROMEOS
|
| - void OnRefreshSystemLogs(const ListValue* list);
|
| - void OnGetSystemLog(const ListValue* list);
|
| - void OnImportONCFile(const ListValue* list);
|
| -#endif
|
| -
|
| - private:
|
| - class IOThreadImpl;
|
| -
|
| -#ifdef OS_CHROMEOS
|
| - // Class that is used for getting network related ChromeOS logs.
|
| - // Logs are fetched from ChromeOS libcros on user request, and only when we
|
| - // don't yet have a copy of logs. If a copy is present, we send back data from
|
| - // it, else we save request and answer to it when we get logs from libcros.
|
| - // If needed, we also send request for system logs to libcros.
|
| - // Logs refresh has to be done explicitly, by deleting old logs and then
|
| - // loading them again.
|
| - class SystemLogsGetter {
|
| - public:
|
| - SystemLogsGetter(NetInternalsMessageHandler* handler,
|
| - chromeos::system::SyslogsProvider* syslogs_provider);
|
| - ~SystemLogsGetter();
|
| -
|
| - // Deletes logs copy we currently have, and resets logs_requested and
|
| - // logs_received flags.
|
| - void DeleteSystemLogs();
|
| - // Starts log fetching. If logs copy is present, requested logs are sent
|
| - // back.
|
| - // If syslogs load request hasn't been sent to libcros yet, we do that now,
|
| - // and postpone sending response.
|
| - // Request data is specified by args:
|
| - // $1 : key of the log we are interested in.
|
| - // $2 : string used to identify request.
|
| - void RequestSystemLog(const ListValue* args);
|
| - // Requests logs from libcros, but only if we don't have a copy.
|
| - void LoadSystemLogs();
|
| - // Processes callback from libcros containing system logs. Postponed
|
| - // request responses are sent.
|
| - void OnSystemLogsLoaded(chromeos::system::LogDictionaryType* sys_info,
|
| - std::string* ignored_content);
|
| -
|
| - private:
|
| - // Struct we save postponed log request in.
|
| - struct SystemLogRequest {
|
| - std::string log_key;
|
| - std::string cell_id;
|
| - };
|
| -
|
| - // Processes request.
|
| - void SendLogs(const SystemLogRequest& request);
|
| -
|
| - NetInternalsMessageHandler* handler_;
|
| - chromeos::system::SyslogsProvider* syslogs_provider_;
|
| - // List of postponed requests.
|
| - std::list<SystemLogRequest> requests_;
|
| - scoped_ptr<chromeos::system::LogDictionaryType> logs_;
|
| - bool logs_received_;
|
| - bool logs_requested_;
|
| - CancelableRequestConsumer consumer_;
|
| - // Libcros request handle.
|
| - CancelableRequestProvider::Handle syslogs_request_id_;
|
| - };
|
| -#endif
|
| -
|
| - // The pref member about whether HTTP throttling is enabled, which needs to
|
| - // be accessed on the UI thread.
|
| - BooleanPrefMember http_throttling_enabled_;
|
| -
|
| - // The pref member that determines whether experimentation on HTTP throttling
|
| - // is allowed (this becomes false once the user explicitly sets the
|
| - // feature to on or off).
|
| - BooleanPrefMember http_throttling_may_experiment_;
|
| -
|
| - // This is the "real" message handler, which lives on the IO thread.
|
| - scoped_refptr<IOThreadImpl> proxy_;
|
| -
|
| - base::WeakPtr<prerender::PrerenderManager> prerender_manager_;
|
| -
|
| -#ifdef OS_CHROMEOS
|
| - // Class that handles getting and filtering system logs.
|
| - scoped_ptr<SystemLogsGetter> syslogs_getter_;
|
| -#endif
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NetInternalsMessageHandler);
|
| -};
|
| -
|
| -// This class is the "real" message handler. It is allocated and destroyed on
|
| -// the UI thread. With the exception of OnAddEntry, OnWebUIDeleted, and
|
| -// SendJavascriptCommand, its methods are all expected to be called from the IO
|
| -// thread. OnAddEntry and SendJavascriptCommand can be called from any thread,
|
| -// and OnWebUIDeleted can only be called from the UI thread.
|
| -class NetInternalsMessageHandler::IOThreadImpl
|
| - : public base::RefCountedThreadSafe<
|
| - NetInternalsMessageHandler::IOThreadImpl,
|
| - BrowserThread::DeleteOnUIThread>,
|
| - public ChromeNetLog::ThreadSafeObserverImpl,
|
| - public ConnectionTester::Delegate {
|
| - public:
|
| - // Type for methods that can be used as MessageHandler callbacks.
|
| - typedef void (IOThreadImpl::*MessageHandler)(const ListValue*);
|
| -
|
| - // Creates a proxy for |handler| that will live on the IO thread.
|
| - // |handler| is a weak pointer, since it is possible for the
|
| - // WebUIMessageHandler to be deleted on the UI thread while we were executing
|
| - // on the IO thread. |io_thread| is the global IOThread (it is passed in as
|
| - // an argument since we need to grab it from the UI thread).
|
| - IOThreadImpl(
|
| - const base::WeakPtr<NetInternalsMessageHandler>& handler,
|
| - IOThread* io_thread,
|
| - net::URLRequestContextGetter* context_getter);
|
| -
|
| - // Helper method to enable a callback that will be executed on the IO thread.
|
| - static void CallbackHelper(MessageHandler method,
|
| - scoped_refptr<IOThreadImpl> io_thread,
|
| - const ListValue* list);
|
| -
|
| - // Called once the WebUI has been deleted (i.e. renderer went away), on the
|
| - // IO thread.
|
| - void Detach();
|
| -
|
| - // Sends all passive log entries in |passive_entries| to the Javascript
|
| - // handler, called on the IO thread.
|
| - void SendPassiveLogEntries(const ChromeNetLog::EntryList& passive_entries);
|
| -
|
| - // Called when the WebUI is deleted. Prevents calling Javascript functions
|
| - // afterwards. Called on UI thread.
|
| - void OnWebUIDeleted();
|
| -
|
| - //--------------------------------
|
| - // Javascript message handlers:
|
| - //--------------------------------
|
| -
|
| - void OnRendererReady(const ListValue* list);
|
| -
|
| - void OnGetProxySettings(const ListValue* list);
|
| - void OnReloadProxySettings(const ListValue* list);
|
| - void OnGetBadProxies(const ListValue* list);
|
| - void OnClearBadProxies(const ListValue* list);
|
| - void OnGetHostResolverInfo(const ListValue* list);
|
| - void OnClearHostResolverCache(const ListValue* list);
|
| - void OnEnableIPv6(const ListValue* list);
|
| - void OnStartConnectionTests(const ListValue* list);
|
| - void OnHSTSQuery(const ListValue* list);
|
| - void OnHSTSAdd(const ListValue* list);
|
| - void OnHSTSDelete(const ListValue* list);
|
| - void OnGetHttpCacheInfo(const ListValue* list);
|
| - void OnGetSocketPoolInfo(const ListValue* list);
|
| - void OnCloseIdleSockets(const ListValue* list);
|
| - void OnFlushSocketPools(const ListValue* list);
|
| - void OnGetSpdySessionInfo(const ListValue* list);
|
| - void OnGetSpdyStatus(const ListValue* list);
|
| - void OnGetSpdyAlternateProtocolMappings(const ListValue* list);
|
| -#ifdef OS_WIN
|
| - void OnGetServiceProviders(const ListValue* list);
|
| -#endif
|
| - void OnGetHttpPipeliningStatus(const ListValue* list);
|
| - void OnSetLogLevel(const ListValue* list);
|
| -
|
| - // ChromeNetLog::ThreadSafeObserver implementation:
|
| - virtual void OnAddEntry(net::NetLog::EventType type,
|
| - const base::TimeTicks& time,
|
| - const net::NetLog::Source& source,
|
| - net::NetLog::EventPhase phase,
|
| - net::NetLog::EventParameters* params);
|
| -
|
| - // ConnectionTester::Delegate implementation:
|
| - virtual void OnStartConnectionTestSuite();
|
| - virtual void OnStartConnectionTestExperiment(
|
| - const ConnectionTester::Experiment& experiment);
|
| - virtual void OnCompletedConnectionTestExperiment(
|
| - const ConnectionTester::Experiment& experiment,
|
| - int result);
|
| - virtual void OnCompletedConnectionTestSuite();
|
| -
|
| - // Helper that calls g_browser.receive in the renderer, passing in |command|
|
| - // and |arg|. Takes ownership of |arg|. If the renderer is displaying a log
|
| - // file, the message will be ignored. Note that this can be called from any
|
| - // thread.
|
| - void SendJavascriptCommand(const std::string& command, Value* arg);
|
| -
|
| - // Helper that runs |method| with |arg|, and deletes |arg| on completion.
|
| - void DispatchToMessageHandler(ListValue* arg, MessageHandler method);
|
| -
|
| - private:
|
| - friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
|
| - friend class base::DeleteHelper<IOThreadImpl>;
|
| -
|
| - ~IOThreadImpl();
|
| -
|
| - // Adds |entry| to the queue of pending log entries to be sent to the page via
|
| - // Javascript. Must be called on the IO Thread. Also creates a delayed task
|
| - // that will call PostPendingEntries, if there isn't one already.
|
| - void AddEntryToQueue(Value* entry);
|
| -
|
| - // Sends all pending entries to the page via Javascript, and clears the list
|
| - // of pending entries. Sending multiple entries at once results in a
|
| - // significant reduction of CPU usage when a lot of events are happening.
|
| - // Must be called on the IO Thread.
|
| - void PostPendingEntries();
|
| -
|
| - // Pointer to the UI-thread message handler. Only access this from
|
| - // the UI thread.
|
| - base::WeakPtr<NetInternalsMessageHandler> handler_;
|
| -
|
| - // The global IOThread, which contains the global NetLog to observer.
|
| - IOThread* io_thread_;
|
| -
|
| - scoped_refptr<net::URLRequestContextGetter> context_getter_;
|
| -
|
| - // Helper that runs the suite of connection tests.
|
| - scoped_ptr<ConnectionTester> connection_tester_;
|
| -
|
| - // True if the Web UI has been deleted. This is used to prevent calling
|
| - // Javascript functions after the Web UI is destroyed. On refresh, the
|
| - // messages can end up being sent to the refreshed page, causing duplicate
|
| - // or partial entries.
|
| - //
|
| - // This is only read and written to on the UI thread.
|
| - bool was_webui_deleted_;
|
| -
|
| - // True if we have attached an observer to the NetLog already.
|
| - bool is_observing_log_;
|
| -
|
| - // Log entries that have yet to be passed along to Javascript page. Non-NULL
|
| - // when and only when there is a pending delayed task to call
|
| - // PostPendingEntries. Read and written to exclusively on the IO Thread.
|
| - scoped_ptr<ListValue> pending_entries_;
|
| -};
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -//
|
| -// NetInternalsMessageHandler
|
| -//
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -NetInternalsMessageHandler::NetInternalsMessageHandler() {}
|
| -
|
| -NetInternalsMessageHandler::~NetInternalsMessageHandler() {
|
| - if (proxy_) {
|
| - proxy_.get()->OnWebUIDeleted();
|
| - // Notify the handler on the IO thread that the renderer is gone.
|
| - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&IOThreadImpl::Detach, proxy_.get()));
|
| - }
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::RegisterMessages() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - Profile* profile = Profile::FromWebUI(web_ui());
|
| - PrefService* pref_service = profile->GetPrefs();
|
| - http_throttling_enabled_.Init(
|
| - prefs::kHttpThrottlingEnabled, pref_service, this);
|
| - http_throttling_may_experiment_.Init(
|
| - prefs::kHttpThrottlingMayExperiment, pref_service, NULL);
|
| -
|
| - proxy_ = new IOThreadImpl(this->AsWeakPtr(), g_browser_process->io_thread(),
|
| - profile->GetRequestContext());
|
| -#ifdef OS_CHROMEOS
|
| - syslogs_getter_.reset(new SystemLogsGetter(this,
|
| - chromeos::system::SyslogsProvider::GetInstance()));
|
| -#endif
|
| -
|
| - prerender::PrerenderManager* prerender_manager =
|
| - prerender::PrerenderManagerFactory::GetForProfile(profile);
|
| - if (prerender_manager) {
|
| - prerender_manager_ = prerender_manager->AsWeakPtr();
|
| - } else {
|
| - prerender_manager_ = base::WeakPtr<prerender::PrerenderManager>();
|
| - }
|
| -
|
| - web_ui()->RegisterMessageCallback(
|
| - "notifyReady",
|
| - base::Bind(&NetInternalsMessageHandler::OnRendererReady,
|
| - base::Unretained(this)));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getProxySettings",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetProxySettings, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "reloadProxySettings",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnReloadProxySettings, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getBadProxies",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetBadProxies, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "clearBadProxies",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnClearBadProxies, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getHostResolverInfo",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetHostResolverInfo, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "clearHostResolverCache",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnClearHostResolverCache, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "enableIPv6",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnEnableIPv6, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "startConnectionTests",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnStartConnectionTests, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "hstsQuery",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnHSTSQuery, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "hstsAdd",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnHSTSAdd, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "hstsDelete",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnHSTSDelete, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getHttpCacheInfo",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetHttpCacheInfo, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getSocketPoolInfo",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetSocketPoolInfo, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "closeIdleSockets",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnCloseIdleSockets, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "flushSocketPools",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnFlushSocketPools, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getSpdySessionInfo",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetSpdySessionInfo, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getSpdyStatus",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetSpdyStatus, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getSpdyAlternateProtocolMappings",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetSpdyAlternateProtocolMappings, proxy_));
|
| -#ifdef OS_WIN
|
| - web_ui()->RegisterMessageCallback(
|
| - "getServiceProviders",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetServiceProviders, proxy_));
|
| -#endif
|
| -
|
| - web_ui()->RegisterMessageCallback(
|
| - "getHttpPipeliningStatus",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnGetHttpPipeliningStatus, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "setLogLevel",
|
| - base::Bind(&IOThreadImpl::CallbackHelper,
|
| - &IOThreadImpl::OnSetLogLevel, proxy_));
|
| - web_ui()->RegisterMessageCallback(
|
| - "enableHttpThrottling",
|
| - base::Bind(&NetInternalsMessageHandler::OnEnableHttpThrottling,
|
| - base::Unretained(this)));
|
| - web_ui()->RegisterMessageCallback(
|
| - "clearBrowserCache",
|
| - base::Bind(&NetInternalsMessageHandler::OnClearBrowserCache,
|
| - base::Unretained(this)));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getPrerenderInfo",
|
| - base::Bind(&NetInternalsMessageHandler::OnGetPrerenderInfo,
|
| - base::Unretained(this)));
|
| -#ifdef OS_CHROMEOS
|
| - web_ui()->RegisterMessageCallback(
|
| - "refreshSystemLogs",
|
| - base::Bind(&NetInternalsMessageHandler::OnRefreshSystemLogs,
|
| - base::Unretained(this)));
|
| - web_ui()->RegisterMessageCallback(
|
| - "getSystemLog",
|
| - base::Bind(&NetInternalsMessageHandler::OnGetSystemLog,
|
| - base::Unretained(this)));
|
| - web_ui()->RegisterMessageCallback(
|
| - "importONCFile",
|
| - base::Bind(&NetInternalsMessageHandler::OnImportONCFile,
|
| - base::Unretained(this)));
|
| -#endif
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::SendJavascriptCommand(
|
| - const std::string& command,
|
| - Value* arg) {
|
| - scoped_ptr<Value> command_value(Value::CreateStringValue(command));
|
| - scoped_ptr<Value> value(arg);
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - if (value.get()) {
|
| - web_ui()->CallJavascriptFunction("g_browser.receive",
|
| - *command_value.get(),
|
| - *value.get());
|
| - } else {
|
| - web_ui()->CallJavascriptFunction("g_browser.receive",
|
| - *command_value.get());
|
| - }
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::Observe(
|
| - int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK_EQ(type, chrome::NOTIFICATION_PREF_CHANGED);
|
| -
|
| - std::string* pref_name = content::Details<std::string>(details).ptr();
|
| - if (*pref_name == prefs::kHttpThrottlingEnabled) {
|
| - SendJavascriptCommand(
|
| - "receivedHttpThrottlingEnabledPrefChanged",
|
| - Value::CreateBooleanValue(*http_throttling_enabled_));
|
| - }
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::OnRendererReady(const ListValue* list) {
|
| - IOThreadImpl::CallbackHelper(&IOThreadImpl::OnRendererReady, proxy_, list);
|
| -
|
| - SendJavascriptCommand(
|
| - "receivedHttpThrottlingEnabledPrefChanged",
|
| - Value::CreateBooleanValue(*http_throttling_enabled_));
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::OnEnableHttpThrottling(const ListValue* list) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - bool enable = false;
|
| - if (!list->GetBoolean(0, &enable)) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - http_throttling_enabled_.SetValue(enable);
|
| -
|
| - // We never receive OnEnableHttpThrottling unless the user has modified
|
| - // the value of the checkbox on the about:net-internals page. Once the
|
| - // user does that, we no longer change its value automatically (e.g.
|
| - // by changing the default or running an experiment).
|
| - if (http_throttling_may_experiment_.GetValue()) {
|
| - http_throttling_may_experiment_.SetValue(false);
|
| - }
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::OnClearBrowserCache(const ListValue* list) {
|
| - BrowsingDataRemover* remover =
|
| - new BrowsingDataRemover(Profile::FromWebUI(web_ui()),
|
| - BrowsingDataRemover::EVERYTHING,
|
| - base::Time());
|
| - remover->Remove(BrowsingDataRemover::REMOVE_CACHE);
|
| - // BrowsingDataRemover deletes itself.
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::OnGetPrerenderInfo(const ListValue* list) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - DictionaryValue* value = NULL;
|
| - prerender::PrerenderManager* prerender_manager = prerender_manager_.get();
|
| - if (!prerender_manager) {
|
| - value = new DictionaryValue();
|
| - value->SetBoolean("enabled", false);
|
| - value->SetBoolean("omnibox_enabled", false);
|
| - } else {
|
| - value = prerender_manager->GetAsValue();
|
| - }
|
| - SendJavascriptCommand("receivedPrerenderInfo", value);
|
| -}
|
| -
|
| -
|
| -#ifdef OS_CHROMEOS
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -//
|
| -// NetInternalsMessageHandler::SystemLogsGetter
|
| -//
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -NetInternalsMessageHandler::SystemLogsGetter::SystemLogsGetter(
|
| - NetInternalsMessageHandler* handler,
|
| - chromeos::system::SyslogsProvider* syslogs_provider)
|
| - : handler_(handler),
|
| - syslogs_provider_(syslogs_provider),
|
| - logs_(NULL),
|
| - logs_received_(false),
|
| - logs_requested_(false) {
|
| - if (!syslogs_provider_)
|
| - LOG(ERROR) << "System access library not loaded";
|
| -}
|
| -
|
| -NetInternalsMessageHandler::SystemLogsGetter::~SystemLogsGetter() {
|
| - DeleteSystemLogs();
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::SystemLogsGetter::DeleteSystemLogs() {
|
| - if (syslogs_provider_ && logs_requested_ && !logs_received_) {
|
| - syslogs_provider_->CancelRequest(syslogs_request_id_);
|
| - }
|
| - logs_requested_ = false;
|
| - logs_received_ = false;
|
| - logs_.reset();
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::SystemLogsGetter::RequestSystemLog(
|
| - const ListValue* args) {
|
| - if (!logs_requested_) {
|
| - DCHECK(!logs_received_);
|
| - LoadSystemLogs();
|
| - }
|
| - SystemLogRequest log_request;
|
| - args->GetString(0, &log_request.log_key);
|
| - args->GetString(1, &log_request.cell_id);
|
| -
|
| - if (logs_received_) {
|
| - SendLogs(log_request);
|
| - } else {
|
| - requests_.push_back(log_request);
|
| - }
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::SystemLogsGetter::LoadSystemLogs() {
|
| - if (logs_requested_ || !syslogs_provider_)
|
| - return;
|
| - logs_requested_ = true;
|
| - syslogs_request_id_ = syslogs_provider_->RequestSyslogs(
|
| - false, // compress logs.
|
| - chromeos::system::SyslogsProvider::SYSLOGS_NETWORK,
|
| - &consumer_,
|
| - base::Bind(
|
| - &NetInternalsMessageHandler::SystemLogsGetter::OnSystemLogsLoaded,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::SystemLogsGetter::OnSystemLogsLoaded(
|
| - chromeos::system::LogDictionaryType* sys_info,
|
| - std::string* ignored_content) {
|
| - DCHECK(!ignored_content);
|
| - logs_.reset(sys_info);
|
| - logs_received_ = true;
|
| - for (std::list<SystemLogRequest>::iterator request_it = requests_.begin();
|
| - request_it != requests_.end();
|
| - ++request_it) {
|
| - SendLogs(*request_it);
|
| - }
|
| - requests_.clear();
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::SystemLogsGetter::SendLogs(
|
| - const SystemLogRequest& request) {
|
| - DictionaryValue* result = new DictionaryValue();
|
| - chromeos::system::LogDictionaryType::iterator log_it =
|
| - logs_->find(request.log_key);
|
| - if (log_it != logs_->end()) {
|
| - if (!log_it->second.empty()) {
|
| - result->SetString("log", log_it->second);
|
| - } else {
|
| - result->SetString("log", "<no relevant lines found>");
|
| - }
|
| - } else {
|
| - result->SetString("log", "<invalid log name>");
|
| - }
|
| - result->SetString("cellId", request.cell_id);
|
| -
|
| - handler_->SendJavascriptCommand("getSystemLogCallback", result);
|
| -}
|
| -#endif
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -//
|
| -// NetInternalsMessageHandler::IOThreadImpl
|
| -//
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -NetInternalsMessageHandler::IOThreadImpl::IOThreadImpl(
|
| - const base::WeakPtr<NetInternalsMessageHandler>& handler,
|
| - IOThread* io_thread,
|
| - net::URLRequestContextGetter* context_getter)
|
| - : ThreadSafeObserverImpl(net::NetLog::LOG_ALL_BUT_BYTES),
|
| - handler_(handler),
|
| - io_thread_(io_thread),
|
| - context_getter_(context_getter),
|
| - was_webui_deleted_(false),
|
| - is_observing_log_(false) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -}
|
| -
|
| -NetInternalsMessageHandler::IOThreadImpl::~IOThreadImpl() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::CallbackHelper(
|
| - MessageHandler method,
|
| - scoped_refptr<IOThreadImpl> io_thread,
|
| - const ListValue* list) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - // We need to make a copy of the value in order to pass it over to the IO
|
| - // thread. We will delete this in IOThreadImpl::DispatchMessageHandler().
|
| - ListValue* list_copy =
|
| - static_cast<ListValue*>(list ? list->DeepCopy() : NULL);
|
| -
|
| - if (!BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(method, io_thread, list_copy))) {
|
| - // Failed posting the task, avoid leaking |list_copy|.
|
| - delete list_copy;
|
| - }
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::Detach() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - // Unregister with network stack to observe events.
|
| - if (is_observing_log_) {
|
| - is_observing_log_ = false;
|
| - RemoveAsObserver();
|
| - }
|
| -
|
| - // Cancel any in-progress connection tests.
|
| - connection_tester_.reset();
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::SendPassiveLogEntries(
|
| - const ChromeNetLog::EntryList& passive_entries) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - ListValue* dict_list = new ListValue();
|
| - for (size_t i = 0; i < passive_entries.size(); ++i) {
|
| - const ChromeNetLog::Entry& e = passive_entries[i];
|
| - dict_list->Append(net::NetLog::EntryToDictionaryValue(e.type,
|
| - e.time,
|
| - e.source,
|
| - e.phase,
|
| - e.params,
|
| - false));
|
| - }
|
| -
|
| - SendJavascriptCommand("receivedPassiveLogEntries", dict_list);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnWebUIDeleted() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - was_webui_deleted_ = true;
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnRendererReady(
|
| - const ListValue* list) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - DCHECK(!is_observing_log_) << "notifyReady called twice";
|
| -
|
| - SendJavascriptCommand("receivedConstants",
|
| - NetInternalsUI::GetConstants());
|
| -
|
| - // Register with network stack to observe events.
|
| - is_observing_log_ = true;
|
| - ChromeNetLog::EntryList entries;
|
| - AddAsObserverAndGetAllPassivelyCapturedEvents(io_thread_->net_log(),
|
| - &entries);
|
| - SendPassiveLogEntries(entries);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetProxySettings(
|
| - const ListValue* list) {
|
| - net::URLRequestContext* context = context_getter_->GetURLRequestContext();
|
| - net::ProxyService* proxy_service = context->proxy_service();
|
| -
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - if (proxy_service->fetched_config().is_valid())
|
| - dict->Set("original", proxy_service->fetched_config().ToValue());
|
| - if (proxy_service->config().is_valid())
|
| - dict->Set("effective", proxy_service->config().ToValue());
|
| -
|
| - SendJavascriptCommand("receivedProxySettings", dict);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnReloadProxySettings(
|
| - const ListValue* list) {
|
| - net::URLRequestContext* context = context_getter_->GetURLRequestContext();
|
| - context->proxy_service()->ForceReloadProxyConfig();
|
| -
|
| - // Cause the renderer to be notified of the new values.
|
| - OnGetProxySettings(NULL);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetBadProxies(
|
| - const ListValue* list) {
|
| - net::URLRequestContext* context = context_getter_->GetURLRequestContext();
|
| -
|
| - const net::ProxyRetryInfoMap& bad_proxies_map =
|
| - context->proxy_service()->proxy_retry_info();
|
| -
|
| - ListValue* dict_list = new ListValue();
|
| -
|
| - for (net::ProxyRetryInfoMap::const_iterator it = bad_proxies_map.begin();
|
| - it != bad_proxies_map.end(); ++it) {
|
| - const std::string& proxy_uri = it->first;
|
| - const net::ProxyRetryInfo& retry_info = it->second;
|
| -
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - dict->SetString("proxy_uri", proxy_uri);
|
| - dict->SetString("bad_until",
|
| - net::NetLog::TickCountToString(retry_info.bad_until));
|
| -
|
| - dict_list->Append(dict);
|
| - }
|
| -
|
| - SendJavascriptCommand("receivedBadProxies", dict_list);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnClearBadProxies(
|
| - const ListValue* list) {
|
| - net::URLRequestContext* context = context_getter_->GetURLRequestContext();
|
| - context->proxy_service()->ClearBadProxiesCache();
|
| -
|
| - // Cause the renderer to be notified of the new values.
|
| - OnGetBadProxies(NULL);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetHostResolverInfo(
|
| - const ListValue* list) {
|
| - net::URLRequestContext* context = context_getter_->GetURLRequestContext();
|
| - net::HostCache* cache = GetHostResolverCache(context);
|
| -
|
| - if (!cache) {
|
| - SendJavascriptCommand("receivedHostResolverInfo", NULL);
|
| - return;
|
| - }
|
| -
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - dict->SetInteger(
|
| - "default_address_family",
|
| - static_cast<int>(context->host_resolver()->GetDefaultAddressFamily()));
|
| -
|
| - DictionaryValue* cache_info_dict = new DictionaryValue();
|
| -
|
| - cache_info_dict->SetInteger(
|
| - "capacity",
|
| - static_cast<int>(cache->max_entries()));
|
| - cache_info_dict->SetInteger(
|
| - "ttl_success_ms",
|
| - static_cast<int>(cache->success_entry_ttl().InMilliseconds()));
|
| - cache_info_dict->SetInteger(
|
| - "ttl_failure_ms",
|
| - static_cast<int>(cache->failure_entry_ttl().InMilliseconds()));
|
| -
|
| - ListValue* entry_list = new ListValue();
|
| -
|
| - for (net::HostCache::EntryMap::const_iterator it =
|
| - cache->entries().begin();
|
| - it != cache->entries().end();
|
| - ++it) {
|
| - const net::HostCache::Key& key = it->first;
|
| - const net::HostCache::Entry* entry = it->second.get();
|
| -
|
| - DictionaryValue* entry_dict = new DictionaryValue();
|
| -
|
| - entry_dict->SetString("hostname", key.hostname);
|
| - entry_dict->SetInteger("address_family",
|
| - static_cast<int>(key.address_family));
|
| - entry_dict->SetString("expiration",
|
| - net::NetLog::TickCountToString(entry->expiration));
|
| -
|
| - if (entry->error != net::OK) {
|
| - entry_dict->SetInteger("error", entry->error);
|
| - } else {
|
| - // Append all of the resolved addresses.
|
| - ListValue* address_list = new ListValue();
|
| - const struct addrinfo* current_address = entry->addrlist.head();
|
| - while (current_address) {
|
| - address_list->Append(Value::CreateStringValue(
|
| - net::NetAddressToStringWithPort(current_address)));
|
| - current_address = current_address->ai_next;
|
| - }
|
| - entry_dict->Set("addresses", address_list);
|
| - }
|
| -
|
| - entry_list->Append(entry_dict);
|
| - }
|
| -
|
| - cache_info_dict->Set("entries", entry_list);
|
| - dict->Set("cache", cache_info_dict);
|
| -
|
| - SendJavascriptCommand("receivedHostResolverInfo", dict);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnClearHostResolverCache(
|
| - const ListValue* list) {
|
| - net::HostCache* cache =
|
| - GetHostResolverCache(context_getter_->GetURLRequestContext());
|
| -
|
| - if (cache)
|
| - cache->clear();
|
| -
|
| - // Cause the renderer to be notified of the new values.
|
| - OnGetHostResolverInfo(NULL);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnEnableIPv6(
|
| - const ListValue* list) {
|
| - net::URLRequestContext* context = context_getter_->GetURLRequestContext();
|
| - net::HostResolver* host_resolver = context->host_resolver();
|
| -
|
| - host_resolver->SetDefaultAddressFamily(net::ADDRESS_FAMILY_UNSPECIFIED);
|
| -
|
| - // Cause the renderer to be notified of the new value.
|
| - OnGetHostResolverInfo(NULL);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTests(
|
| - const ListValue* list) {
|
| - // |value| should be: [<URL to test>].
|
| - string16 url_str;
|
| - CHECK(list->GetString(0, &url_str));
|
| -
|
| - // Try to fix-up the user provided URL into something valid.
|
| - // For example, turn "www.google.com" into "http://www.google.com".
|
| - GURL url(URLFixerUpper::FixupURL(UTF16ToUTF8(url_str), std::string()));
|
| -
|
| - connection_tester_.reset(new ConnectionTester(
|
| - this, io_thread_->globals()->proxy_script_fetcher_context.get()));
|
| - connection_tester_->RunAllTests(url);
|
| -}
|
| -
|
| -void SPKIHashesToString(const net::FingerprintVector& hashes,
|
| - std::string* string) {
|
| - for (net::FingerprintVector::const_iterator
|
| - i = hashes.begin(); i != hashes.end(); ++i) {
|
| - base::StringPiece hash_str(reinterpret_cast<const char*>(i->data),
|
| - arraysize(i->data));
|
| - std::string encoded;
|
| - base::Base64Encode(hash_str, &encoded);
|
| -
|
| - if (i != hashes.begin())
|
| - *string += ",";
|
| - *string += "sha1/" + encoded;
|
| - }
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnHSTSQuery(
|
| - const ListValue* list) {
|
| - // |list| should be: [<domain to query>].
|
| - std::string domain;
|
| - CHECK(list->GetString(0, &domain));
|
| - DictionaryValue* result = new(DictionaryValue);
|
| -
|
| - if (!IsStringASCII(domain)) {
|
| - result->SetString("error", "non-ASCII domain name");
|
| - } else {
|
| - net::TransportSecurityState* transport_security_state =
|
| - context_getter_->GetURLRequestContext()->transport_security_state();
|
| - if (!transport_security_state) {
|
| - result->SetString("error", "no TransportSecurityState active");
|
| - } else {
|
| - net::TransportSecurityState::DomainState state;
|
| - const bool found = transport_security_state->HasMetadata(
|
| - &state, domain, true);
|
| -
|
| - result->SetBoolean("result", found);
|
| - if (found) {
|
| - result->SetInteger("mode", static_cast<int>(state.mode));
|
| - result->SetBoolean("subdomains", state.include_subdomains);
|
| - result->SetBoolean("preloaded", state.preloaded);
|
| - result->SetString("domain", state.domain);
|
| - result->SetDouble("expiry", state.expiry.ToDoubleT());
|
| - result->SetDouble("dynamic_spki_hashes_expiry",
|
| - state.dynamic_spki_hashes_expiry.ToDoubleT());
|
| -
|
| - std::string hashes;
|
| - SPKIHashesToString(state.preloaded_spki_hashes, &hashes);
|
| - result->SetString("preloaded_spki_hashes", hashes);
|
| -
|
| - hashes.clear();
|
| - SPKIHashesToString(state.dynamic_spki_hashes, &hashes);
|
| - result->SetString("dynamic_spki_hashes", hashes);
|
| - }
|
| - }
|
| - }
|
| -
|
| - SendJavascriptCommand("receivedHSTSResult", result);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnHSTSAdd(
|
| - const ListValue* list) {
|
| - // |list| should be: [<domain to query>, <include subdomains>, <cert pins>].
|
| - std::string domain;
|
| - CHECK(list->GetString(0, &domain));
|
| - if (!IsStringASCII(domain)) {
|
| - // Silently fail. The user will get a helpful error if they query for the
|
| - // name.
|
| - return;
|
| - }
|
| - bool include_subdomains;
|
| - CHECK(list->GetBoolean(1, &include_subdomains));
|
| - std::string hashes_str;
|
| - CHECK(list->GetString(2, &hashes_str));
|
| -
|
| - net::TransportSecurityState* transport_security_state =
|
| - context_getter_->GetURLRequestContext()->transport_security_state();
|
| - if (!transport_security_state)
|
| - return;
|
| -
|
| - net::TransportSecurityState::DomainState state;
|
| - state.expiry = state.created + base::TimeDelta::FromDays(1000);
|
| - state.include_subdomains = include_subdomains;
|
| - if (!hashes_str.empty()) {
|
| - std::vector<std::string> type_and_b64s;
|
| - base::SplitString(hashes_str, ',', &type_and_b64s);
|
| - for (std::vector<std::string>::const_iterator
|
| - i = type_and_b64s.begin(); i != type_and_b64s.end(); i++) {
|
| - std::string type_and_b64;
|
| - RemoveChars(*i, " \t\r\n", &type_and_b64);
|
| - net::SHA1Fingerprint hash;
|
| - if (!net::TransportSecurityState::ParsePin(type_and_b64, &hash))
|
| - continue;
|
| -
|
| - state.dynamic_spki_hashes.push_back(hash);
|
| - }
|
| - }
|
| -
|
| - transport_security_state->EnableHost(domain, state);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnHSTSDelete(
|
| - const ListValue* list) {
|
| - // |list| should be: [<domain to query>].
|
| - std::string domain;
|
| - CHECK(list->GetString(0, &domain));
|
| - if (!IsStringASCII(domain)) {
|
| - // There cannot be a unicode entry in the HSTS set.
|
| - return;
|
| - }
|
| - net::TransportSecurityState* transport_security_state =
|
| - context_getter_->GetURLRequestContext()->transport_security_state();
|
| - if (!transport_security_state)
|
| - return;
|
| -
|
| - transport_security_state->DeleteHost(domain);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetHttpCacheInfo(
|
| - const ListValue* list) {
|
| - DictionaryValue* info_dict = new DictionaryValue();
|
| - DictionaryValue* stats_dict = new DictionaryValue();
|
| -
|
| - disk_cache::Backend* disk_cache = GetDiskCacheBackend(
|
| - context_getter_->GetURLRequestContext());
|
| -
|
| - if (disk_cache) {
|
| - // Extract the statistics key/value pairs from the backend.
|
| - std::vector<std::pair<std::string, std::string> > stats;
|
| - disk_cache->GetStats(&stats);
|
| - for (size_t i = 0; i < stats.size(); ++i) {
|
| - stats_dict->Set(stats[i].first,
|
| - Value::CreateStringValue(stats[i].second));
|
| - }
|
| - }
|
| -
|
| - info_dict->Set("stats", stats_dict);
|
| -
|
| - SendJavascriptCommand("receivedHttpCacheInfo", info_dict);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetSocketPoolInfo(
|
| - const ListValue* list) {
|
| - net::HttpNetworkSession* http_network_session =
|
| - GetHttpNetworkSession(context_getter_->GetURLRequestContext());
|
| -
|
| - Value* socket_pool_info = NULL;
|
| - if (http_network_session)
|
| - socket_pool_info = http_network_session->SocketPoolInfoToValue();
|
| -
|
| - SendJavascriptCommand("receivedSocketPoolInfo", socket_pool_info);
|
| -}
|
| -
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnFlushSocketPools(
|
| - const ListValue* list) {
|
| - net::HttpNetworkSession* http_network_session =
|
| - GetHttpNetworkSession(context_getter_->GetURLRequestContext());
|
| -
|
| - if (http_network_session)
|
| - http_network_session->CloseAllConnections();
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnCloseIdleSockets(
|
| - const ListValue* list) {
|
| - net::HttpNetworkSession* http_network_session =
|
| - GetHttpNetworkSession(context_getter_->GetURLRequestContext());
|
| -
|
| - if (http_network_session)
|
| - http_network_session->CloseIdleConnections();
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetSpdySessionInfo(
|
| - const ListValue* list) {
|
| - net::HttpNetworkSession* http_network_session =
|
| - GetHttpNetworkSession(context_getter_->GetURLRequestContext());
|
| -
|
| - Value* spdy_info = NULL;
|
| - if (http_network_session) {
|
| - spdy_info = http_network_session->SpdySessionPoolInfoToValue();
|
| - }
|
| -
|
| - SendJavascriptCommand("receivedSpdySessionInfo", spdy_info);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetSpdyStatus(
|
| - const ListValue* list) {
|
| - DictionaryValue* status_dict = new DictionaryValue();
|
| -
|
| - status_dict->Set("spdy_enabled",
|
| - Value::CreateBooleanValue(
|
| - net::HttpStreamFactory::spdy_enabled()));
|
| - status_dict->Set("use_alternate_protocols",
|
| - Value::CreateBooleanValue(
|
| - net::HttpStreamFactory::use_alternate_protocols()));
|
| - status_dict->Set("force_spdy_over_ssl",
|
| - Value::CreateBooleanValue(
|
| - net::HttpStreamFactory::force_spdy_over_ssl()));
|
| - status_dict->Set("force_spdy_always",
|
| - Value::CreateBooleanValue(
|
| - net::HttpStreamFactory::force_spdy_always()));
|
| -
|
| - // The next_protos may not be specified for certain configurations of SPDY.
|
| - Value* next_protos_value;
|
| - if (net::HttpStreamFactory::has_next_protos()) {
|
| - next_protos_value = Value::CreateStringValue(
|
| - JoinString(net::HttpStreamFactory::next_protos(), ','));
|
| - } else {
|
| - next_protos_value = Value::CreateStringValue("");
|
| - }
|
| - status_dict->Set("next_protos", next_protos_value);
|
| -
|
| - SendJavascriptCommand("receivedSpdyStatus", status_dict);
|
| -}
|
| -
|
| -void
|
| -NetInternalsMessageHandler::IOThreadImpl::OnGetSpdyAlternateProtocolMappings(
|
| - const ListValue* list) {
|
| - ListValue* dict_list = new ListValue();
|
| -
|
| - const net::HttpServerProperties& http_server_properties =
|
| - *context_getter_->GetURLRequestContext()->http_server_properties();
|
| -
|
| - const net::AlternateProtocolMap& map =
|
| - http_server_properties.alternate_protocol_map();
|
| -
|
| - for (net::AlternateProtocolMap::const_iterator it = map.begin();
|
| - it != map.end(); ++it) {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| - dict->SetString("host_port_pair", it->first.ToString());
|
| - dict->SetString("alternate_protocol", it->second.ToString());
|
| - dict_list->Append(dict);
|
| - }
|
| -
|
| - SendJavascriptCommand("receivedSpdyAlternateProtocolMappings", dict_list);
|
| -}
|
| -
|
| -#ifdef OS_WIN
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetServiceProviders(
|
| - const ListValue* list) {
|
| -
|
| - DictionaryValue* service_providers = new DictionaryValue();
|
| -
|
| - WinsockLayeredServiceProviderList layered_providers;
|
| - GetWinsockLayeredServiceProviders(&layered_providers);
|
| - ListValue* layered_provider_list = new ListValue();
|
| - for (size_t i = 0; i < layered_providers.size(); ++i) {
|
| - DictionaryValue* service_dict = new DictionaryValue();
|
| - service_dict->SetString("name", layered_providers[i].name);
|
| - service_dict->SetInteger("version", layered_providers[i].version);
|
| - service_dict->SetInteger("chain_length", layered_providers[i].chain_length);
|
| - service_dict->SetInteger("socket_type", layered_providers[i].socket_type);
|
| - service_dict->SetInteger("socket_protocol",
|
| - layered_providers[i].socket_protocol);
|
| - service_dict->SetString("path", layered_providers[i].path);
|
| -
|
| - layered_provider_list->Append(service_dict);
|
| - }
|
| - service_providers->Set("service_providers", layered_provider_list);
|
| -
|
| - WinsockNamespaceProviderList namespace_providers;
|
| - GetWinsockNamespaceProviders(&namespace_providers);
|
| - ListValue* namespace_list = new ListValue;
|
| - for (size_t i = 0; i < namespace_providers.size(); ++i) {
|
| - DictionaryValue* namespace_dict = new DictionaryValue();
|
| - namespace_dict->SetString("name", namespace_providers[i].name);
|
| - namespace_dict->SetBoolean("active", namespace_providers[i].active);
|
| - namespace_dict->SetInteger("version", namespace_providers[i].version);
|
| - namespace_dict->SetInteger("type", namespace_providers[i].type);
|
| -
|
| - namespace_list->Append(namespace_dict);
|
| - }
|
| - service_providers->Set("namespace_providers", namespace_list);
|
| -
|
| - SendJavascriptCommand("receivedServiceProviders", service_providers);
|
| -}
|
| -#endif
|
| -
|
| -#ifdef OS_CHROMEOS
|
| -void NetInternalsMessageHandler::OnRefreshSystemLogs(const ListValue* list) {
|
| - DCHECK(syslogs_getter_.get());
|
| - syslogs_getter_->DeleteSystemLogs();
|
| - syslogs_getter_->LoadSystemLogs();
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::OnGetSystemLog(const ListValue* list) {
|
| - DCHECK(syslogs_getter_.get());
|
| - syslogs_getter_->RequestSystemLog(list);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::OnImportONCFile(const ListValue* list) {
|
| - std::string onc_blob;
|
| - std::string passcode;
|
| - if (list->GetSize() != 2 ||
|
| - !list->GetString(0, &onc_blob) ||
|
| - !list->GetString(1, &passcode)) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - std::string error;
|
| - chromeos::CrosLibrary::Get()->GetNetworkLibrary()->
|
| - LoadOncNetworks(onc_blob, passcode,
|
| - chromeos::NetworkUIData::ONC_SOURCE_USER_IMPORT, &error);
|
| - SendJavascriptCommand("receivedONCFileParse",
|
| - Value::CreateStringValue(error));
|
| -}
|
| -#endif
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnGetHttpPipeliningStatus(
|
| - const ListValue* list) {
|
| - DictionaryValue* status_dict = new DictionaryValue();
|
| -
|
| - status_dict->Set("pipelining_enabled",
|
| - Value::CreateBooleanValue(
|
| - net::HttpStreamFactory::http_pipelining_enabled()));
|
| -
|
| - net::HttpNetworkSession* http_network_session =
|
| - GetHttpNetworkSession(context_getter_->GetURLRequestContext());
|
| - Value* pipelined_conneciton_info =
|
| - http_network_session->http_stream_factory()->PipelineInfoToValue();
|
| - status_dict->Set("pipelined_connection_info", pipelined_conneciton_info);
|
| -
|
| - const net::HttpServerProperties& http_server_properties =
|
| - *context_getter_->GetURLRequestContext()->http_server_properties();
|
| -
|
| - // TODO(simonjam): This call is slow.
|
| - const net::PipelineCapabilityMap pipeline_capability_map =
|
| - http_server_properties.GetPipelineCapabilityMap();
|
| -
|
| - ListValue* known_hosts_list = new ListValue();
|
| - net::PipelineCapabilityMap::const_iterator it;
|
| - for (it = pipeline_capability_map.begin();
|
| - it != pipeline_capability_map.end(); ++it) {
|
| - DictionaryValue* host_dict = new DictionaryValue();
|
| - host_dict->SetString("host", it->first.ToString());
|
| - std::string capability;
|
| - switch (it->second) {
|
| - case net::PIPELINE_CAPABLE:
|
| - capability = "capable";
|
| - break;
|
| -
|
| - case net::PIPELINE_PROBABLY_CAPABLE:
|
| - capability = "probably capable";
|
| - break;
|
| -
|
| - case net::PIPELINE_INCAPABLE:
|
| - capability = "incapable";
|
| - break;
|
| -
|
| - case net::PIPELINE_UNKNOWN:
|
| - default:
|
| - capability = "unknown";
|
| - break;
|
| - }
|
| - host_dict->SetString("capability", capability);
|
| - known_hosts_list->Append(host_dict);
|
| - }
|
| - status_dict->Set("pipelined_host_info", known_hosts_list);
|
| -
|
| - SendJavascriptCommand("receivedHttpPipeliningStatus", status_dict);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnSetLogLevel(
|
| - const ListValue* list) {
|
| - int log_level;
|
| - std::string log_level_string;
|
| - if (!list->GetString(0, &log_level_string) ||
|
| - !base::StringToInt(log_level_string, &log_level)) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - DCHECK_GE(log_level, net::NetLog::LOG_ALL);
|
| - DCHECK_LE(log_level, net::NetLog::LOG_BASIC);
|
| - SetLogLevel(static_cast<net::NetLog::LogLevel>(log_level));
|
| -}
|
| -
|
| -// Note that unlike other methods of IOThreadImpl, this function
|
| -// can be called from ANY THREAD.
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnAddEntry(
|
| - net::NetLog::EventType type,
|
| - const base::TimeTicks& time,
|
| - const net::NetLog::Source& source,
|
| - net::NetLog::EventPhase phase,
|
| - net::NetLog::EventParameters* params) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&IOThreadImpl::AddEntryToQueue, this,
|
| - net::NetLog::EntryToDictionaryValue(type, time, source, phase,
|
| - params, false)));
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::AddEntryToQueue(Value* entry) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - if (!pending_entries_.get()) {
|
| - pending_entries_.reset(new ListValue());
|
| - BrowserThread::PostDelayedTask(
|
| - BrowserThread::IO, FROM_HERE,
|
| - base::Bind(&IOThreadImpl::PostPendingEntries, this),
|
| - kNetLogEventDelayMilliseconds);
|
| - }
|
| - pending_entries_->Append(entry);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::PostPendingEntries() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - SendJavascriptCommand("receivedLogEntries", pending_entries_.release());
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestSuite() {
|
| - SendJavascriptCommand("receivedStartConnectionTestSuite", NULL);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestExperiment(
|
| - const ConnectionTester::Experiment& experiment) {
|
| - SendJavascriptCommand(
|
| - "receivedStartConnectionTestExperiment",
|
| - ExperimentToValue(experiment));
|
| -}
|
| -
|
| -void
|
| -NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestExperiment(
|
| - const ConnectionTester::Experiment& experiment,
|
| - int result) {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - dict->Set("experiment", ExperimentToValue(experiment));
|
| - dict->SetInteger("result", result);
|
| -
|
| - SendJavascriptCommand(
|
| - "receivedCompletedConnectionTestExperiment",
|
| - dict);
|
| -}
|
| -
|
| -void
|
| -NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestSuite() {
|
| - SendJavascriptCommand(
|
| - "receivedCompletedConnectionTestSuite",
|
| - NULL);
|
| -}
|
| -
|
| -void NetInternalsMessageHandler::IOThreadImpl::DispatchToMessageHandler(
|
| - ListValue* arg, MessageHandler method) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - (this->*method)(arg);
|
| - delete arg;
|
| -}
|
| -
|
| -// Note that this can be called from ANY THREAD.
|
| -void NetInternalsMessageHandler::IOThreadImpl::SendJavascriptCommand(
|
| - const std::string& command,
|
| - Value* arg) {
|
| - if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
| - if (handler_ && !was_webui_deleted_) {
|
| - // We check |handler_| in case it was deleted on the UI thread earlier
|
| - // while we were running on the IO thread.
|
| - handler_->SendJavascriptCommand(command, arg);
|
| - } else {
|
| - delete arg;
|
| - }
|
| - return;
|
| - }
|
| -
|
| - if (!BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&IOThreadImpl::SendJavascriptCommand, this, command, arg))) {
|
| - // Failed posting the task, avoid leaking.
|
| - delete arg;
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -//
|
| -// NetInternalsUI
|
| -//
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -// static
|
| -Value* NetInternalsUI::GetConstants() {
|
| - DictionaryValue* constants_dict = new DictionaryValue();
|
| -
|
| - // Version of the file format.
|
| - constants_dict->SetInteger("logFormatVersion", kLogFormatVersion);
|
| -
|
| - // Add a dictionary with information on the relationship between event type
|
| - // enums and their symbolic names.
|
| - {
|
| - std::vector<net::NetLog::EventType> event_types =
|
| - net::NetLog::GetAllEventTypes();
|
| -
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - for (size_t i = 0; i < event_types.size(); ++i) {
|
| - const char* name = net::NetLog::EventTypeToString(event_types[i]);
|
| - dict->SetInteger(name, static_cast<int>(event_types[i]));
|
| - }
|
| - constants_dict->Set("logEventTypes", dict);
|
| - }
|
| -
|
| - // Add a dictionary with the version of the client and its command line
|
| - // arguments.
|
| - {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - chrome::VersionInfo version_info;
|
| -
|
| - if (!version_info.is_valid()) {
|
| - DLOG(ERROR) << "Unable to create chrome::VersionInfo";
|
| - } else {
|
| - // We have everything we need to send the right values.
|
| - dict->SetString("name", version_info.Name());
|
| - dict->SetString("version", version_info.Version());
|
| - dict->SetString("cl", version_info.LastChange());
|
| - dict->SetString("version_mod",
|
| - chrome::VersionInfo::GetVersionStringModifier());
|
| - dict->SetString("official",
|
| - version_info.IsOfficialBuild() ? "official" :
|
| - "unofficial");
|
| - dict->SetString("os_type", version_info.OSType());
|
| - dict->SetString("command_line",
|
| - CommandLine::ForCurrentProcess()->GetCommandLineString());
|
| - }
|
| -
|
| - constants_dict->Set("clientInfo", dict);
|
| - }
|
| -
|
| - // Add a dictionary with information about the relationship between load flag
|
| - // enums and their symbolic names.
|
| - {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| -#define LOAD_FLAG(label, value) \
|
| - dict->SetInteger(# label, static_cast<int>(value));
|
| -#include "net/base/load_flags_list.h"
|
| -#undef LOAD_FLAG
|
| -
|
| - constants_dict->Set("loadFlag", dict);
|
| - }
|
| -
|
| - // Add information on the relationship between net error codes and their
|
| - // symbolic names.
|
| - {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| -#define NET_ERROR(label, value) \
|
| - dict->SetInteger(# label, static_cast<int>(value));
|
| -#include "net/base/net_error_list.h"
|
| -#undef NET_ERROR
|
| -
|
| - constants_dict->Set("netError", dict);
|
| - }
|
| -
|
| - // Information about the relationship between event phase enums and their
|
| - // symbolic names.
|
| - {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - dict->SetInteger("PHASE_BEGIN", net::NetLog::PHASE_BEGIN);
|
| - dict->SetInteger("PHASE_END", net::NetLog::PHASE_END);
|
| - dict->SetInteger("PHASE_NONE", net::NetLog::PHASE_NONE);
|
| -
|
| - constants_dict->Set("logEventPhase", dict);
|
| - }
|
| -
|
| - // Information about the relationship between source type enums and
|
| - // their symbolic names.
|
| - {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| -#define SOURCE_TYPE(label, value) dict->SetInteger(# label, value);
|
| -#include "net/base/net_log_source_type_list.h"
|
| -#undef SOURCE_TYPE
|
| -
|
| - constants_dict->Set("logSourceType", dict);
|
| - }
|
| -
|
| - // Information about the relationship between LogLevel enums and their
|
| - // symbolic names.
|
| - {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - dict->SetInteger("LOG_ALL", net::NetLog::LOG_ALL);
|
| - dict->SetInteger("LOG_ALL_BUT_BYTES", net::NetLog::LOG_ALL_BUT_BYTES);
|
| - dict->SetInteger("LOG_BASIC", net::NetLog::LOG_BASIC);
|
| -
|
| - constants_dict->Set("logLevelType", dict);
|
| - }
|
| -
|
| - // Information about the relationship between address family enums and
|
| - // their symbolic names.
|
| - {
|
| - DictionaryValue* dict = new DictionaryValue();
|
| -
|
| - dict->SetInteger("ADDRESS_FAMILY_UNSPECIFIED",
|
| - net::ADDRESS_FAMILY_UNSPECIFIED);
|
| - dict->SetInteger("ADDRESS_FAMILY_IPV4",
|
| - net::ADDRESS_FAMILY_IPV4);
|
| - dict->SetInteger("ADDRESS_FAMILY_IPV6",
|
| - net::ADDRESS_FAMILY_IPV6);
|
| -
|
| - constants_dict->Set("addressFamily", dict);
|
| - }
|
| -
|
| - // Information about how the "time ticks" values we have given it relate to
|
| - // actual system times. (We used time ticks throughout since they are stable
|
| - // across system clock changes).
|
| - {
|
| - int64 cur_time_ms = (base::Time::Now() - base::Time()).InMilliseconds();
|
| -
|
| - int64 cur_time_ticks_ms =
|
| - (base::TimeTicks::Now() - base::TimeTicks()).InMilliseconds();
|
| -
|
| - // If we add this number to a time tick value, it gives the timestamp.
|
| - int64 tick_to_time_ms = cur_time_ms - cur_time_ticks_ms;
|
| -
|
| - // Chrome on all platforms stores times using the Windows epoch
|
| - // (Jan 1 1601), but the javascript wants a unix epoch.
|
| - // TODO(eroman): Getting the timestamp relative to the unix epoch should
|
| - // be part of the time library.
|
| - const int64 kUnixEpochMs = 11644473600000LL;
|
| - int64 tick_to_unix_time_ms = tick_to_time_ms - kUnixEpochMs;
|
| -
|
| - // Pass it as a string, since it may be too large to fit in an integer.
|
| - constants_dict->SetString("timeTickOffset",
|
| - base::Int64ToString(tick_to_unix_time_ms));
|
| - }
|
| - return constants_dict;
|
| -}
|
| -
|
| -NetInternalsUI::NetInternalsUI(WebContents* contents) : WebUI(contents) {
|
| - AddMessageHandler(new NetInternalsMessageHandler());
|
| -
|
| - // Set up the chrome://net-internals/ source.
|
| - Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext());
|
| - profile->GetChromeURLDataManager()->AddDataSource(
|
| - CreateNetInternalsHTMLSource());
|
| -}
|
|
|