15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/net_internals/net_internals_ui.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h"
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_net_log.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_network_delegate.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/connection_tester.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "components/onc/onc_constants.h"
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/url_fixer/url_fixer.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/net_internals_resources.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_log_logger.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/host_cache.h"
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_stream_factory.h"
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_manager/filesystem_api_util.h"
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/chromeos/net/onc_utils.h"
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/profiles/profile_helper.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/system/syslogs_provider.h"
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/system_logs/debug_log_writer.h"
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/net/nss_context.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/debug_daemon_client.h"
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chromeos/network/onc/onc_certificate_importer_impl.h"
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/service_providers_win.h"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_service.h"
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/webui/extensions/extension_basic_info.h"
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h"
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension_set.h"
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using base::StringValue;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay between when an event occurs and when it is passed to the Javascript
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page.  All events that occur during this period are grouped together and
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sent to the page at once, which reduces context switching and CPU usage.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kNetLogEventDelayMilliseconds = 100;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the HostCache for |context|'s primary HostResolver, or NULL if
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// there is none.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HostCache* GetHostResolverCache(net::URLRequestContext* context) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context->host_resolver()->GetHostCache();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string HashesToBase64String(const net::HashValueVector& hashes) {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string str;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i != hashes.size(); ++i) {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i != 0)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      str += ",";
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    str += hashes[i].ToString();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return str;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Base64StringToHashes(const std::string& hashes_str,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          net::HashValueVector* hashes) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  hashes->clear();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> vector_hash_str;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SplitString(hashes_str, ',', &vector_hash_str);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i != vector_hash_str.size(); ++i) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string hash_str;
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::RemoveChars(vector_hash_str[i], " \t\r\n", &hash_str);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::HashValue hash;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Skip past unrecognized hash algos
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // But return false on malformatted input
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (hash_str.empty())
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (hash_str.compare(0, 5, "sha1/") != 0 &&
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        hash_str.compare(0, 7, "sha256/") != 0) {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!hash.FromString(hash_str))
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    hashes->push_back(hash);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a Value representing the state of a pre-existing URLRequest when
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// net-internals was opened.
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::Value* GetRequestStateAsValue(const net::URLRequest* request,
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    net::NetLog::LogLevel log_level) {
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return request->GetStateAsValue();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |request1| was created before |request2|.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RequestCreatedBefore(const net::URLRequest* request1,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const net::URLRequest* request2) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return request1->creation_time() < request2->creation_time();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the disk cache backend for |context| if there is one, or NULL.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)disk_cache::Backend* GetDiskCacheBackend(net::URLRequestContext* context) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context->http_transaction_factory())
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpCache* http_cache = context->http_transaction_factory()->GetCache();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!http_cache)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return http_cache->GetCurrentBackend();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the http network session for |context| if there is one.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise, returns NULL.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HttpNetworkSession* GetHttpNetworkSession(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContext* context) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context->http_transaction_factory())
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context->http_transaction_factory()->GetSession();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::Value* ExperimentToValue(const ConnectionTester::Experiment& experiment) {
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (experiment.url.is_valid())
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("url", experiment.url.spec());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("proxy_settings_experiment",
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ConnectionTester::ProxySettingsExperimentDescription(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      experiment.proxy_settings_experiment));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("host_resolver_experiment",
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ConnectionTester::HostResolverExperimentDescription(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      experiment.host_resolver_experiment));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebUIDataSource* CreateNetInternalsHTMLSource() {
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource* source =
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebUIDataSource::Create(chrome::kChromeUINetInternalsHost);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  source->SetUseJsonJSFormatV2();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetDefaultResource(IDR_NET_INTERNALS_INDEX_HTML);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->AddResourcePath("index.js", IDR_NET_INTERNALS_INDEX_JS);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetJsonPath("strings.js");
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return source;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class receives javascript messages from the renderer.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that the WebUI infrastructure runs on the UI thread, therefore all of
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this class's methods are expected to run on the UI thread.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Since the network code we want to run lives on the IO thread, we proxy
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// almost everything over to NetInternalsMessageHandler::IOThreadImpl, which
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// runs on the IO thread.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(eroman): Can we start on the IO thread to begin with?
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetInternalsMessageHandler
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public WebUIMessageHandler,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<NetInternalsMessageHandler> {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetInternalsMessageHandler();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NetInternalsMessageHandler();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUIMessageHandler implementation.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessages() OVERRIDE;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls g_browser.receive in the renderer, passing in |command| and |arg|.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |arg|.  If the renderer is displaying a log file, the
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message will be ignored.
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SendJavascriptCommand(const std::string& command, base::Value* arg);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript message handlers.
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnRendererReady(const base::ListValue* list);
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnClearBrowserCache(const base::ListValue* list);
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetPrerenderInfo(const base::ListValue* list);
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetHistoricNetworkStats(const base::ListValue* list);
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetExtensionInfo(const base::ListValue* list);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnRefreshSystemLogs(const base::ListValue* list);
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetSystemLog(const base::ListValue* list);
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnImportONCFile(const base::ListValue* list);
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnStoreDebugLogs(const base::ListValue* list);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnStoreDebugLogsCompleted(const base::FilePath& log_path,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 bool succeeded);
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnSetNetworkDebugMode(const base::ListValue* list);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetNetworkDebugModeCompleted(const std::string& subsystem,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool succeeded);
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Callback to |GetNSSCertDatabaseForProfile| used to retrieve the database
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // to which user's ONC defined certificates should be imported.
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // It parses and imports |onc_blob|.
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ImportONCFileToNSSDB(const std::string& onc_blob,
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            const std::string& passcode,
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            net::NSSCertDatabase* nssdb);
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called back by the CertificateImporter when a certificate import finished.
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |previous_error| contains earlier errors during this import.
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnCertificatesImported(
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::string& previous_error,
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool success,
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const net::CertificateList& onc_trusted_certificates);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class IOThreadImpl;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Class that is used for getting network related ChromeOS logs.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs are fetched from ChromeOS libcros on user request, and only when we
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't yet have a copy of logs. If a copy is present, we send back data from
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it, else we save request and answer to it when we get logs from libcros.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If needed, we also send request for system logs to libcros.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs refresh has to be done explicitly, by deleting old logs and then
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loading them again.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SystemLogsGetter {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemLogsGetter(NetInternalsMessageHandler* handler,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     chromeos::system::SyslogsProvider* syslogs_provider);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~SystemLogsGetter();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Deletes logs copy we currently have, and resets logs_requested and
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // logs_received flags.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void DeleteSystemLogs();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Starts log fetching. If logs copy is present, requested logs are sent
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // back.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If syslogs load request hasn't been sent to libcros yet, we do that now,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and postpone sending response.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Request data is specified by args:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   $1 : key of the log we are interested in.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   $2 : string used to identify request.
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void RequestSystemLog(const base::ListValue* args);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Requests logs from libcros, but only if we don't have a copy.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void LoadSystemLogs();
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Processes callback from libcros containing system logs. Postponed
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // request responses are sent.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void OnSystemLogsLoaded(chromeos::system::LogDictionaryType* sys_info,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            std::string* ignored_content);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Struct we save postponed log request in.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct SystemLogRequest {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string log_key;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string cell_id;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Processes request.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void SendLogs(const SystemLogRequest& request);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetInternalsMessageHandler* handler_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::system::SyslogsProvider* syslogs_provider_;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // List of postponed requests.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::list<SystemLogRequest> requests_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<chromeos::system::LogDictionaryType> logs_;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool logs_received_;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool logs_requested_;
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::CancelableTaskTracker tracker_;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Libcros request task ID.
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::CancelableTaskTracker::TaskId syslogs_task_id_;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the "real" message handler, which lives on the IO thread.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<IOThreadImpl> proxy_;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<prerender::PrerenderManager> prerender_manager_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Class that handles getting and filtering system logs.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SystemLogsGetter> syslogs_getter_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetInternalsMessageHandler);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is the "real" message handler. It is allocated and destroyed on
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the UI thread.  With the exception of OnAddEntry, OnWebUIDeleted, and
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SendJavascriptCommand, its methods are all expected to be called from the IO
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread.  OnAddEntry and SendJavascriptCommand can be called from any thread,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and OnWebUIDeleted can only be called from the UI thread.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetInternalsMessageHandler::IOThreadImpl
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NetInternalsMessageHandler::IOThreadImpl,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::DeleteOnUIThread>,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public net::NetLog::ThreadSafeObserver,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ConnectionTester::Delegate {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Type for methods that can be used as MessageHandler callbacks.
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef void (IOThreadImpl::*MessageHandler)(const base::ListValue*);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a proxy for |handler| that will live on the IO thread.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |handler| is a weak pointer, since it is possible for the
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUIMessageHandler to be deleted on the UI thread while we were executing
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on the IO thread. |io_thread| is the global IOThread (it is passed in as
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an argument since we need to grab it from the UI thread).
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThreadImpl(
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::WeakPtr<NetInternalsMessageHandler>& handler,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IOThread* io_thread,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequestContextGetter* main_context_getter);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on UI thread just after creation, to add a ContextGetter to
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |context_getters_|.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRequestContextGetter(net::URLRequestContextGetter* context_getter);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to enable a callback that will be executed on the IO thread.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CallbackHelper(MessageHandler method,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             scoped_refptr<IOThreadImpl> io_thread,
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const base::ListValue* list);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called once the WebUI has been deleted (i.e. renderer went away), on the
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IO thread.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Detach();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the WebUI is deleted.  Prevents calling Javascript functions
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // afterwards.  Called on UI thread.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnWebUIDeleted();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //--------------------------------
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript message handlers:
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //--------------------------------
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnRendererReady(const base::ListValue* list);
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetProxySettings(const base::ListValue* list);
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnReloadProxySettings(const base::ListValue* list);
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetBadProxies(const base::ListValue* list);
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnClearBadProxies(const base::ListValue* list);
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetHostResolverInfo(const base::ListValue* list);
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnClearHostResolverCache(const base::ListValue* list);
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnEnableIPv6(const base::ListValue* list);
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnStartConnectionTests(const base::ListValue* list);
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnHSTSQuery(const base::ListValue* list);
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnHSTSAdd(const base::ListValue* list);
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnHSTSDelete(const base::ListValue* list);
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetHttpCacheInfo(const base::ListValue* list);
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetSocketPoolInfo(const base::ListValue* list);
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetSessionNetworkStats(const base::ListValue* list);
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnCloseIdleSockets(const base::ListValue* list);
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnFlushSocketPools(const base::ListValue* list);
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetSpdySessionInfo(const base::ListValue* list);
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetSpdyStatus(const base::ListValue* list);
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetSpdyAlternateProtocolMappings(const base::ListValue* list);
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetQuicInfo(const base::ListValue* list);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetServiceProviders(const base::ListValue* list);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnSetLogLevel(const base::ListValue* list);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChromeNetLog::ThreadSafeObserver implementation:
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConnectionTester::Delegate implementation:
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStartConnectionTestSuite() OVERRIDE;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStartConnectionTestExperiment(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ConnectionTester::Experiment& experiment) OVERRIDE;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCompletedConnectionTestExperiment(
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ConnectionTester::Experiment& experiment,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int result) OVERRIDE;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCompletedConnectionTestSuite() OVERRIDE;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper that calls g_browser.receive in the renderer, passing in |command|
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and |arg|.  Takes ownership of |arg|.  If the renderer is displaying a log
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file, the message will be ignored.  Note that this can be called from any
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SendJavascriptCommand(const std::string& command, base::Value* arg);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<IOThreadImpl>;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::list<scoped_refptr<net::URLRequestContextGetter> >
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContextGetterList;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~IOThreadImpl();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds |entry| to the queue of pending log entries to be sent to the page via
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript.  Must be called on the IO Thread.  Also creates a delayed task
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that will call PostPendingEntries, if there isn't one already.
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AddEntryToQueue(base::Value* entry);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends all pending entries to the page via Javascript, and clears the list
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of pending entries.  Sending multiple entries at once results in a
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // significant reduction of CPU usage when a lot of events are happening.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called on the IO Thread.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PostPendingEntries();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds entries with the states of ongoing URL requests.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrePopulateEventList();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext* GetMainContext() {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return main_context_getter_->GetURLRequestContext();
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pointer to the UI-thread message handler. Only access this from
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the UI thread.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<NetInternalsMessageHandler> handler_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The global IOThread, which contains the global NetLog to observer.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThread* io_thread_;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The main URLRequestContextGetter for the tab's profile.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> main_context_getter_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper that runs the suite of connection tests.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ConnectionTester> connection_tester_;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the Web UI has been deleted.  This is used to prevent calling
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript functions after the Web UI is destroyed.  On refresh, the
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages can end up being sent to the refreshed page, causing duplicate
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or partial entries.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only read and written to on the UI thread.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_webui_deleted_;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Log entries that have yet to be passed along to Javascript page.  Non-NULL
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when and only when there is a pending delayed task to call
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PostPendingEntries.  Read and written to exclusively on the IO Thread.
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::ListValue> pending_entries_;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for getting current status of URLRequests when net-internals is
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened.  |main_context_getter_| is automatically added on construction.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Duplicates are allowed.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContextGetterList context_getters_;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IOThreadImpl);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsMessageHandler
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::NetInternalsMessageHandler() {}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::~NetInternalsMessageHandler() {
501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (proxy_.get()) {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_.get()->OnWebUIDeleted();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify the handler on the IO thread that the renderer is gone.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(&IOThreadImpl::Detach, proxy_.get()));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::RegisterMessages() {
510e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_ = new IOThreadImpl(this->AsWeakPtr(), g_browser_process->io_thread(),
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            profile->GetRequestContext());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_->AddRequestContextGetter(profile->GetMediaRequestContext());
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_->AddRequestContextGetter(profile->GetRequestContextForExtensions());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_.reset(new SystemLogsGetter(this,
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::system::SyslogsProvider::GetInstance()));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender::PrerenderManager* prerender_manager =
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender::PrerenderManagerFactory::GetForProfile(profile);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prerender_manager) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender_manager_ = prerender_manager->AsWeakPtr();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender_manager_ = base::WeakPtr<prerender::PrerenderManager>();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "notifyReady",
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnRendererReady,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getProxySettings",
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetProxySettings, proxy_));
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "reloadProxySettings",
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnReloadProxySettings, proxy_));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getBadProxies",
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetBadProxies, proxy_));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "clearBadProxies",
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnClearBadProxies, proxy_));
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getHostResolverInfo",
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetHostResolverInfo, proxy_));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "clearHostResolverCache",
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnClearHostResolverCache, proxy_));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "enableIPv6",
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnEnableIPv6, proxy_));
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "startConnectionTests",
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnStartConnectionTests, proxy_));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "hstsQuery",
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnHSTSQuery, proxy_));
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "hstsAdd",
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnHSTSAdd, proxy_));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "hstsDelete",
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnHSTSDelete, proxy_));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getHttpCacheInfo",
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetHttpCacheInfo, proxy_));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSocketPoolInfo",
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSocketPoolInfo, proxy_));
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSessionNetworkStats",
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSessionNetworkStats, proxy_));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "closeIdleSockets",
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnCloseIdleSockets, proxy_));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "flushSocketPools",
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnFlushSocketPools, proxy_));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSpdySessionInfo",
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSpdySessionInfo, proxy_));
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSpdyStatus",
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSpdyStatus, proxy_));
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSpdyAlternateProtocolMappings",
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSpdyAlternateProtocolMappings, proxy_));
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "getQuicInfo",
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &IOThreadImpl::OnGetQuicInfo, proxy_));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getServiceProviders",
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetServiceProviders, proxy_));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "setLogLevel",
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnSetLogLevel, proxy_));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "clearBrowserCache",
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnClearBrowserCache,
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getPrerenderInfo",
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetPrerenderInfo,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getHistoricNetworkStats",
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetHistoricNetworkStats,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "getExtensionInfo",
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetExtensionInfo,
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "refreshSystemLogs",
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnRefreshSystemLogs,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSystemLog",
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetSystemLog,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "importONCFile",
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnImportONCFile,
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "storeDebugLogs",
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnStoreDebugLogs,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "setNetworkDebugMode",
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnSetNetworkDebugMode,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SendJavascriptCommand(
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& command,
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Value* arg) {
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> command_value(new base::StringValue(command));
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::Value> value(arg);
671e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value.get()) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("g_browser.receive",
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     *command_value.get(),
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     *value.get());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("g_browser.receive",
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     *command_value.get());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnRendererReady(const base::ListValue* list) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThreadImpl::CallbackHelper(&IOThreadImpl::OnRendererReady, proxy_, list);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnClearBrowserCache(
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowsingDataRemover* remover = BrowsingDataRemover::CreateForUnboundedRange(
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromWebUI(web_ui()));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  BrowsingDataHelper::UNPROTECTED_WEB);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowsingDataRemover deletes itself.
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnGetPrerenderInfo(
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
697e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* value = NULL;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender::PrerenderManager* prerender_manager = prerender_manager_.get();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prerender_manager) {
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    value = new base::DictionaryValue();
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value->SetBoolean("enabled", false);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value->SetBoolean("omnibox_enabled", false);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = prerender_manager->GetAsValue();
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedPrerenderInfo", value);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnGetHistoricNetworkStats(
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
713e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Value* historic_network_info =
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChromeNetworkDelegate::HistoricNetworkStatsInfoToValue();
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHistoricNetworkStats", historic_network_info);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnGetExtensionInfo(
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
721e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* extension_list = new base::ListValue();
723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_EXTENSIONS)
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions::ExtensionSystem* extension_system =
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile);
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (extension_system) {
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionService* extension_service = extension_system->extension_service();
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (extension_service) {
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<const extensions::ExtensionSet> extensions(
73123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          extensions::ExtensionRegistry::Get(profile)
73223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)              ->GenerateInstalledExtensionsSet());
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      for (extensions::ExtensionSet::const_iterator it = extensions->begin();
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           it != extensions->end(); ++it) {
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::DictionaryValue* extension_info = new base::DictionaryValue();
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bool enabled = extension_service->IsExtensionEnabled((*it)->id());
7377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extensions::GetExtensionBasicInfo(it->get(), enabled, extension_info);
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extension_list->Append(extension_info);
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendJavascriptCommand("receivedExtensionInfo", extension_list);
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsMessageHandler::SystemLogsGetter
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::SystemLogsGetter::SystemLogsGetter(
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetInternalsMessageHandler* handler,
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::system::SyslogsProvider* syslogs_provider)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : handler_(handler),
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syslogs_provider_(syslogs_provider),
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logs_received_(false),
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logs_requested_(false) {
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!syslogs_provider_)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "System access library not loaded";
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::SystemLogsGetter::~SystemLogsGetter() {
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteSystemLogs();
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::DeleteSystemLogs() {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (syslogs_provider_ && logs_requested_ && !logs_received_) {
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tracker_.TryCancel(syslogs_task_id_);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_requested_ = false;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_received_ = false;
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_.reset();
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::RequestSystemLog(
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logs_requested_) {
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!logs_received_);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadSystemLogs();
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemLogRequest log_request;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args->GetString(0, &log_request.log_key);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args->GetString(1, &log_request.cell_id);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (logs_received_) {
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendLogs(log_request);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    requests_.push_back(log_request);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::LoadSystemLogs() {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (logs_requested_ || !syslogs_provider_)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_requested_ = true;
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syslogs_task_id_ = syslogs_provider_->RequestSyslogs(
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,  // compress logs.
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::system::SyslogsProvider::SYSLOGS_NETWORK,
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &NetInternalsMessageHandler::SystemLogsGetter::OnSystemLogsLoaded,
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Unretained(this)),
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &tracker_);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::OnSystemLogsLoaded(
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::system::LogDictionaryType* sys_info,
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* ignored_content) {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!ignored_content);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_.reset(sys_info);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_received_ = true;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::list<SystemLogRequest>::iterator request_it = requests_.begin();
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       request_it != requests_.end();
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++request_it) {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendLogs(*request_it);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests_.clear();
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::SendLogs(
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SystemLogRequest& request) {
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* result = new base::DictionaryValue();
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::system::LogDictionaryType::iterator log_it =
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logs_->find(request.log_key);
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (log_it != logs_->end()) {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!log_it->second.empty()) {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result->SetString("log", log_it->second);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result->SetString("log", "<no relevant lines found>");
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetString("log", "<invalid log name>");
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->SetString("cellId", request.cell_id);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_->SendJavascriptCommand("getSystemLogCallback", result);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsMessageHandler::IOThreadImpl
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::IOThreadImpl(
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::WeakPtr<NetInternalsMessageHandler>& handler,
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IOThread* io_thread,
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* main_context_getter)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : handler_(handler),
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_(io_thread),
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      main_context_getter_(main_context_getter),
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_webui_deleted_(false) {
855e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddRequestContextGetter(main_context_getter);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::~IOThreadImpl() {
860e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::AddRequestContextGetter(
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* context_getter) {
865e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_getters_.push_back(context_getter);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::CallbackHelper(
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageHandler method,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<IOThreadImpl> io_thread,
8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
873e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to make a copy of the value in order to pass it over to the IO
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread. |list_copy| will be deleted when the task is destroyed. The called
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |method| cannot take ownership of |list_copy|.
8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* list_copy =
8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (list && list->GetSize()) ? list->DeepCopy() : NULL;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(method, io_thread, base::Owned(list_copy)));
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::Detach() {
887e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregister with network stack to observe events.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net_log())
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net_log()->RemoveThreadSafeObserver(this);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel any in-progress connection tests.
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_tester_.reset();
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnWebUIDeleted() {
897e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_webui_deleted_ = true;
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnRendererReady(
9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
903e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have any pending entries, go ahead and get rid of them, so they won't
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // appear before the REQUEST_ALIVE events we add for currently active
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLRequests.
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PostPendingEntries();
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedConstants", NetInternalsUI::GetConstants());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add entries for ongoing URL requests.
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrePopulateEventList();
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net_log()) {
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register with network stack to observe events.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_->net_log()->AddThreadSafeObserver(this,
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::NetLog::LOG_ALL_BUT_BYTES);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetProxySettings(
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ProxyService* proxy_service = GetMainContext()->proxy_service();
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (proxy_service->fetched_config().is_valid())
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("original", proxy_service->fetched_config().ToValue());
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (proxy_service->config().is_valid())
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("effective", proxy_service->config().ToValue());
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedProxySettings", dict);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnReloadProxySettings(
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMainContext()->proxy_service()->ForceReloadProxyConfig();
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new values.
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetProxySettings(NULL);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetBadProxies(
9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::ProxyRetryInfoMap& bad_proxies_map =
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMainContext()->proxy_service()->proxy_retry_info();
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* dict_list = new base::ListValue();
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (net::ProxyRetryInfoMap::const_iterator it = bad_proxies_map.begin();
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != bad_proxies_map.end(); ++it) {
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& proxy_uri = it->first;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::ProxyRetryInfo& retry_info = it->second;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* dict = new base::DictionaryValue();
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("proxy_uri", proxy_uri);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("bad_until",
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    net::NetLog::TickCountToString(retry_info.bad_until));
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict_list->Append(dict);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedBadProxies", dict_list);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnClearBadProxies(
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMainContext()->proxy_service()->ClearBadProxiesCache();
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new values.
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetBadProxies(NULL);
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetHostResolverInfo(
9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext* context = GetMainContext();
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostCache* cache = GetHostResolverCache(context);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cache) {
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendJavascriptCommand("receivedHostResolverInfo", NULL);
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Value* dns_config = context->host_resolver()->GetDnsConfigAsValue();
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dns_config)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("dns_config", dns_config);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger(
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "default_address_family",
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<int>(context->host_resolver()->GetDefaultAddressFamily()));
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* cache_info_dict = new base::DictionaryValue();
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_info_dict->SetInteger(
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "capacity",
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<int>(cache->max_entries()));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* entry_list = new base::ListValue();
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostCache::EntryMap::Iterator it(cache->entries());
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; it.HasNext(); it.Advance()) {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::HostCache::Key& key = it.key();
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::HostCache::Entry& entry = it.value();
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* entry_dict = new base::DictionaryValue();
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_dict->SetString("hostname", key.hostname);
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_dict->SetInteger("address_family",
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<int>(key.address_family));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_dict->SetString("expiration",
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::NetLog::TickCountToString(it.expiration()));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry.error != net::OK) {
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_dict->SetInteger("error", entry.error);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Append all of the resolved addresses.
10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ListValue* address_list = new base::ListValue();
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t i = 0; i < entry.addrlist.size(); ++i) {
1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        address_list->AppendString(entry.addrlist[i].ToStringWithoutPort());
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_dict->Set("addresses", address_list);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_list->Append(entry_dict);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_info_dict->Set("entries", entry_list);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->Set("cache", cache_info_dict);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHostResolverInfo", dict);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnClearHostResolverCache(
10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostCache* cache = GetHostResolverCache(GetMainContext());
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cache)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache->clear();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new values.
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetHostResolverInfo(NULL);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnEnableIPv6(
10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostResolver* host_resolver = GetMainContext()->host_resolver();
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver->SetDefaultAddressFamily(net::ADDRESS_FAMILY_UNSPECIFIED);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new value.
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetHostResolverInfo(NULL);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTests(
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |value| should be: [<URL to test>].
1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 url_str;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &url_str));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to fix-up the user provided URL into something valid.
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For example, turn "www.google.com" into "http://www.google.com".
1072f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GURL url(url_fixer::FixupURL(base::UTF16ToUTF8(url_str), std::string()));
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_tester_.reset(new ConnectionTester(
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_->globals()->proxy_script_fetcher_context.get(),
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log()));
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_tester_->RunAllTests(url);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnHSTSQuery(
10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |list| should be: [<domain to query>].
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string domain;
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &domain));
10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* result = new base::DictionaryValue();
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!base::IsStringASCII(domain)) {
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetString("error", "non-ASCII domain name");
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::TransportSecurityState* transport_security_state =
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetMainContext()->transport_security_state();
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!transport_security_state) {
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result->SetString("error", "no TransportSecurityState active");
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      net::TransportSecurityState::DomainState static_state;
1097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const bool found_static = transport_security_state->GetStaticDomainState(
10981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          domain, &static_state);
1099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (found_static) {
1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetBoolean("has_static_sts",
1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           found_static && static_state.ShouldUpgradeToSSL());
1102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetInteger("static_upgrade_mode",
1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           static_cast<int>(static_state.sts.upgrade_mode));
1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetBoolean("static_sts_include_subdomains",
1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           static_state.sts.include_subdomains);
1106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("static_sts_observed",
1107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          static_state.sts.last_observed.ToDoubleT());
1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("static_sts_expiry",
1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          static_state.sts.expiry.ToDoubleT());
1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetBoolean("has_static_pkp",
1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           found_static && static_state.HasPublicKeyPins());
1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetBoolean("static_pkp_include_subdomains",
1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           static_state.pkp.include_subdomains);
1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("static_pkp_observed",
1115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          static_state.pkp.last_observed.ToDoubleT());
1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("static_pkp_expiry",
1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          static_state.pkp.expiry.ToDoubleT());
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        result->SetString("static_spki_hashes",
1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          HashesToBase64String(static_state.pkp.spki_hashes));
1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      net::TransportSecurityState::DomainState dynamic_state;
1123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const bool found_dynamic =
1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          transport_security_state->GetDynamicDomainState(domain,
1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                          &dynamic_state);
1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (found_dynamic) {
1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetInteger("dynamic_upgrade_mode",
1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           static_cast<int>(dynamic_state.sts.upgrade_mode));
1129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetBoolean("dynamic_sts_include_subdomains",
1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           dynamic_state.sts.include_subdomains);
1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetBoolean("dynamic_pkp_include_subdomains",
1132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           dynamic_state.pkp.include_subdomains);
1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("dynamic_sts_observed",
1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          dynamic_state.sts.last_observed.ToDoubleT());
1135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("dynamic_pkp_observed",
1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          dynamic_state.pkp.last_observed.ToDoubleT());
1137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("dynamic_sts_expiry",
1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          dynamic_state.sts.expiry.ToDoubleT());
1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetDouble("dynamic_pkp_expiry",
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          dynamic_state.pkp.expiry.ToDoubleT());
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        result->SetString("dynamic_spki_hashes",
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          HashesToBase64String(dynamic_state.pkp.spki_hashes));
1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      result->SetBoolean("result", found_static || found_dynamic);
1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (found_static) {
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetString("domain", static_state.domain);
1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      } else if (found_dynamic) {
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetString("domain", dynamic_state.domain);
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      } else {
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result->SetString("domain", domain);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHSTSResult", result);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnHSTSAdd(
11605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
11617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |list| should be: [<domain to query>, <STS include subdomains>, <PKP
11627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // include subdomains>, <key pins>].
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string domain;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &domain));
1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!base::IsStringASCII(domain)) {
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Silently fail. The user will get a helpful error if they query for the
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // name.
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool sts_include_subdomains;
11717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK(list->GetBoolean(1, &sts_include_subdomains));
11727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool pkp_include_subdomains;
11737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK(list->GetBoolean(2, &pkp_include_subdomains));
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hashes_str;
11757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK(list->GetString(3, &hashes_str));
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TransportSecurityState* transport_security_state =
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMainContext()->transport_security_state();
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!transport_security_state)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::HashValueVector hashes;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!hashes_str.empty()) {
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!Base64StringToHashes(hashes_str, &hashes))
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  transport_security_state->AddHSTS(domain, expiry, sts_include_subdomains);
11907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  transport_security_state->AddHPKP(domain, expiry, pkp_include_subdomains,
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    hashes);
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnHSTSDelete(
11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |list| should be: [<domain to query>].
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string domain;
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &domain));
1199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!base::IsStringASCII(domain)) {
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There cannot be a unicode entry in the HSTS set.
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TransportSecurityState* transport_security_state =
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMainContext()->transport_security_state();
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!transport_security_state)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transport_security_state->DeleteDynamicDataForHost(domain);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetHttpCacheInfo(
12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* info_dict = new base::DictionaryValue();
12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* stats_dict = new base::DictionaryValue();
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Backend* disk_cache = GetDiskCacheBackend(GetMainContext());
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (disk_cache) {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Extract the statistics key/value pairs from the backend.
12211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::StringPairs stats;
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache->GetStats(&stats);
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < stats.size(); ++i) {
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      stats_dict->SetStringWithoutPathExpansion(
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          stats[i].first, stats[i].second);
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info_dict->Set("stats", stats_dict);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHttpCacheInfo", info_dict);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSocketPoolInfo(
12355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Value* socket_pool_info = NULL;
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_pool_info = http_network_session->SocketPoolInfoToValue();
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSocketPoolInfo", socket_pool_info);
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSessionNetworkStats(
12485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(main_context_getter_->GetURLRequestContext());
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Value* network_info = NULL;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session) {
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeNetworkDelegate* net_delegate =
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<ChromeNetworkDelegate*>(
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            http_network_session->network_delegate());
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (net_delegate) {
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_info = net_delegate->SessionNetworkStatsInfoToValue();
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSessionNetworkStats", network_info);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnFlushSocketPools(
12665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_network_session->CloseAllConnections();
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnCloseIdleSockets(
12765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_network_session->CloseIdleConnections();
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSpdySessionInfo(
12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Value* spdy_info = http_network_session ?
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_network_session->SpdySessionPoolInfoToValue() : NULL;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSpdySessionInfo", spdy_info);
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSpdyStatus(
12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* status_dict = new base::DictionaryValue();
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  status_dict->SetBoolean("spdy_enabled",
1305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          net::HttpStreamFactory::spdy_enabled());
1306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  status_dict->SetBoolean(
1307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "use_alternate_protocols",
1308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      http_network_session->params().use_alternate_protocols);
1309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  status_dict->SetBoolean("force_spdy_over_ssl",
1310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          http_network_session->params().force_spdy_over_ssl);
1311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  status_dict->SetBoolean("force_spdy_always",
1312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          http_network_session->params().force_spdy_always);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<std::string> next_protos;
1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  http_network_session->GetNextProtos(&next_protos);
1316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string next_protos_string = JoinString(next_protos, ',');
1317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status_dict->SetString("next_protos", next_protos_string);
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSpdyStatus", status_dict);
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnGetSpdyAlternateProtocolMappings(
13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* dict_list = new base::ListValue();
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::HttpServerProperties& http_server_properties =
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *GetMainContext()->http_server_properties();
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::AlternateProtocolMap& map =
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_properties.alternate_protocol_map();
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (net::AlternateProtocolMap::const_iterator it = map.begin();
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != map.end(); ++it) {
13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* dict = new base::DictionaryValue();
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("host_port_pair", it->first.ToString());
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("alternate_protocol", it->second.ToString());
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict_list->Append(dict);
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSpdyAlternateProtocolMappings", dict_list);
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetQuicInfo(
13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!list);
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::HttpNetworkSession* http_network_session =
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Value* quic_info = http_network_session ?
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      http_network_session->QuicInfoToValue() : NULL;
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendJavascriptCommand("receivedQuicInfo", quic_info);
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetServiceProviders(
13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* service_providers = new base::DictionaryValue();
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WinsockLayeredServiceProviderList layered_providers;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWinsockLayeredServiceProviders(&layered_providers);
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* layered_provider_list = new base::ListValue();
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < layered_providers.size(); ++i) {
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* service_dict = new base::DictionaryValue();
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetString("name", layered_providers[i].name);
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("version", layered_providers[i].version);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("chain_length", layered_providers[i].chain_length);
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("socket_type", layered_providers[i].socket_type);
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("socket_protocol",
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        layered_providers[i].socket_protocol);
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetString("path", layered_providers[i].path);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layered_provider_list->Append(service_dict);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_providers->Set("service_providers", layered_provider_list);
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WinsockNamespaceProviderList namespace_providers;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWinsockNamespaceProviders(&namespace_providers);
13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue* namespace_list = new base::ListValue;
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < namespace_providers.size(); ++i) {
13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* namespace_dict = new base::DictionaryValue();
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetString("name", namespace_providers[i].name);
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetBoolean("active", namespace_providers[i].active);
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetInteger("version", namespace_providers[i].version);
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetInteger("type", namespace_providers[i].type);
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_list->Append(namespace_dict);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_providers->Set("namespace_providers", namespace_list);
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedServiceProviders", service_providers);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnRefreshSystemLogs(
14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(syslogs_getter_.get());
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_->DeleteSystemLogs();
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_->LoadSystemLogs();
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnGetSystemLog(
14085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(syslogs_getter_.get());
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_->RequestSystemLog(list);
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::ImportONCFileToNSSDB(
14145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& onc_blob,
14155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& passcode,
14165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    net::NSSCertDatabase* nssdb) {
14175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::User* user = chromeos::ProfileHelper::Get()->GetUserByProfile(
14185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile::FromWebUI(web_ui()));
14195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!user) {
14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string error = "User not found.";
14221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SendJavascriptCommand("receivedONCFileParse", new base::StringValue(error));
14231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
14241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string error;
14271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  onc::ONCSource onc_source = onc::ONC_SOURCE_USER_IMPORT;
14281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ListValue network_configs;
14291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue global_network_config;
14301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ListValue certificates;
14311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!chromeos::onc::ParseAndValidateOncForImport(onc_blob,
14321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   onc_source,
14331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   passcode,
14341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   &network_configs,
14351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   &global_network_config,
14361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   &certificates)) {
14371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error = "Errors occurred during the ONC parsing. ";
14383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string network_error;
14411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::onc::ImportNetworksForUser(user, network_configs, &network_error);
14421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!network_error.empty())
14431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error += network_error;
14441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::onc::CertificateImporterImpl cert_importer(
14461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), nssdb);
14471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cert_importer.ImportCertificates(
14481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      certificates,
14491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      onc_source,
14501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&NetInternalsMessageHandler::OnCertificatesImported,
14511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 AsWeakPtr(),
14521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 error));
14531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid NetInternalsMessageHandler::OnCertificatesImported(
14561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& previous_error,
14571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool success,
14581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const net::CertificateList& /* unused onc_trusted_certificates */) {
14591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string error = previous_error;
14601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!success)
14611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error += "Some certificates couldn't be imported. ";
14621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendJavascriptCommand("receivedONCFileParse", new base::StringValue(error));
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnImportONCFile(
14675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
14685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string onc_blob;
14695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string passcode;
14705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (list->GetSize() != 2 ||
14715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !list->GetString(0, &onc_blob) ||
14725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !list->GetString(1, &passcode)) {
14735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED();
14745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
14755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetNSSCertDatabaseForProfile(
14775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile::FromWebUI(web_ui()),
14785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::ImportONCFileToNSSDB, AsWeakPtr(),
14795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 onc_blob, passcode));
14805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
14815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnStoreDebugLogs(const base::ListValue* list) {
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(list);
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendJavascriptCommand("receivedStoreDebugLogs",
14865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        new base::StringValue("Creating log file..."));
14875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
1488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const DownloadPrefs* const prefs = DownloadPrefs::FromBrowserContext(profile);
1489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath path = prefs->DownloadPath();
1490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (file_manager::util::IsUnderNonNativeLocalPath(profile, path))
1491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    path = prefs->GetDefaultDownloadDirectoryForProfile();
14925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  chromeos::DebugLogWriter::StoreLogs(
14935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      path,
14945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      true,  // should_compress
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnStoreDebugLogsCompleted,
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 AsWeakPtr()));
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnStoreDebugLogsCompleted(
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& log_path, bool succeeded) {
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string status;
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (succeeded)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Created log file: " + log_path.BaseName().AsUTF8Unsafe();
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Failed to create log file";
15065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendJavascriptCommand("receivedStoreDebugLogs",
15075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        new base::StringValue(status));
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::OnSetNetworkDebugMode(
15115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string subsystem;
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (list->GetSize() != 1 || !list->GetString(0, &subsystem))
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetDebugMode(
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          subsystem,
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted,
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              AsWeakPtr(),
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              subsystem));
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted(
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& subsystem,
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool succeeded) {
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string status;
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (succeeded)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Debug mode is changed to " + subsystem;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Failed to change debug mode to " + subsystem;
15325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SendJavascriptCommand("receivedSetNetworkDebugMode",
15335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        new base::StringValue(status));
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnSetLogLevel(
15385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list) {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int log_level;
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string log_level_string;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!list->GetString(0, &log_level_string) ||
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !base::StringToInt(log_level_string, &log_level)) {
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GE(log_level, net::NetLog::LOG_ALL);
1548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_LT(log_level, net::NetLog::LOG_NONE);
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net_log()->SetObserverLogLevel(
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, static_cast<net::NetLog::LogLevel>(log_level));
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that unlike other methods of IOThreadImpl, this function
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can be called from ANY THREAD.
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnAddEntry(
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::NetLog::Entry& entry) {
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::AddEntryToQueue, this, entry.ToValue()));
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestSuite() {
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedStartConnectionTestSuite", NULL);
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestExperiment(
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ConnectionTester::Experiment& experiment) {
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand(
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "receivedStartConnectionTestExperiment",
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExperimentToValue(experiment));
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestExperiment(
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ConnectionTester::Experiment& experiment,
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result) {
15775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue();
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->Set("experiment", ExperimentToValue(experiment));
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger("result", result);
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand(
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "receivedCompletedConnectionTestExperiment",
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict);
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestSuite() {
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand(
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "receivedCompletedConnectionTestSuite",
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this can be called from ANY THREAD.
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::SendJavascriptCommand(
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& command,
15975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Value* arg) {
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
1599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (handler_.get() && !was_webui_deleted_) {
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We check |handler_| in case it was deleted on the UI thread earlier
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // while we were running on the IO thread.
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handler_->SendJavascriptCommand(command, arg);
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete arg;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::PostTask(
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::SendJavascriptCommand, this, command, arg))) {
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Failed posting the task, avoid leaking.
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete arg;
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::AddEntryToQueue(
16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Value* entry) {
1619e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pending_entries_.get()) {
16215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pending_entries_.reset(new base::ListValue());
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostDelayedTask(
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&IOThreadImpl::PostPendingEntries, this),
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(kNetLogEventDelayMilliseconds));
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_entries_->Append(entry);
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::PostPendingEntries() {
1631e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_entries_.get())
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendJavascriptCommand("receivedLogEntries", pending_entries_.release());
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::PrePopulateEventList() {
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a set to prevent duplicates.
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<net::URLRequestContext*> contexts;
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContextGetterList::const_iterator getter = context_getters_.begin();
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       getter != context_getters_.end(); ++getter) {
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contexts.insert((*getter)->GetURLRequestContext());
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contexts.insert(io_thread_->globals()->proxy_script_fetcher_context.get());
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contexts.insert(io_thread_->globals()->system_request_context.get());
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put together the list of all requests.
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const net::URLRequest*> requests;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<net::URLRequestContext*>::const_iterator context =
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           contexts.begin();
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       context != contexts.end(); ++context) {
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<const net::URLRequest*>* context_requests =
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*context)->url_requests();
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::set<const net::URLRequest*>::const_iterator request_it =
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             context_requests->begin();
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         request_it != context_requests->end(); ++request_it) {
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK_EQ(io_thread_->net_log(), (*request_it)->net_log().net_log());
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      requests.push_back(*request_it);
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sort by creation time.
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::sort(requests.begin(), requests.end(), RequestCreatedBefore);
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create fake events.
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<const net::URLRequest*>::const_iterator request_it =
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           requests.begin();
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       request_it != requests.end(); ++request_it) {
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLRequest* request = *request_it;
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::NetLog::ParametersCallback callback =
1670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::Bind(&GetRequestStateAsValue, base::Unretained(request));
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create and add the entry directly, to avoid sending it to any other
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NetLog observers.
1674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    net::NetLog::EntryData entry_data(net::NetLog::TYPE_REQUEST_ALIVE,
1675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      request->net_log().source(),
1676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      net::NetLog::PHASE_BEGIN,
1677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      request->creation_time(),
1678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      &callback);
1679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    net::NetLog::Entry entry(&entry_data, request->net_log().GetLogLevel());
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Have to add |entry| to the queue synchronously, as there may already
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be posted tasks queued up to add other events for |request|, which we
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // want |entry| to precede.
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddEntryToQueue(entry.ToValue());
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsUI
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
16985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::Value* NetInternalsUI::GetConstants() {
16995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* constants_dict = net::NetLogLogger::GetConstants();
1700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(constants_dict);
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a dictionary with the version of the client and its command line
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // arguments.
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
17055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* dict = new base::DictionaryValue();
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::VersionInfo version_info;
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!version_info.is_valid()) {
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DLOG(ERROR) << "Unable to create chrome::VersionInfo";
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We have everything we need to send the right values.
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("name", version_info.Name());
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("version", version_info.Version());
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("cl", version_info.LastChange());
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("version_mod",
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      chrome::VersionInfo::GetVersionStringModifier());
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("official",
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      version_info.IsOfficialBuild() ? "official" :
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       "unofficial");
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("os_type", version_info.OSType());
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("command_line",
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      CommandLine::ForCurrentProcess()->GetCommandLineString());
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    constants_dict->Set("clientInfo", dict);
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return constants_dict;
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsUI::NetInternalsUI(content::WebUI* web_ui)
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WebUIController(web_ui) {
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui->AddMessageHandler(new NetInternalsMessageHandler());
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the chrome://net-internals/ source.
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui);
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource::Add(profile, CreateNetInternalsHTMLSource());
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1740