Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2159)

Unified Diff: chrome/browser/ui/webui/net_internals_ui.cc

Issue 9166009: Move about:net-internals webui files into a subdirectory + OWNERS (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Update year Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/net_internals_ui.h ('k') | chrome/browser/ui/webui/net_internals_ui_browsertest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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());
-}
« no previous file with comments | « chrome/browser/ui/webui/net_internals_ui.h ('k') | chrome/browser/ui/webui/net_internals_ui_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698