net_internals_ui.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.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"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/worker_pool.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"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_util.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_net_log.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_network_delegate.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/connection_tester.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_basic_info.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension_set.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h"
51558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/common/net/url_fixer_upper.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/net_internals_resources.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_log_logger.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/host_cache.h"
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_stream_factory.h"
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/transport_security_state.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/network_library.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/system/syslogs_provider.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/debug_daemon_client.h"
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chromeos/network/onc/onc_certificate_importer_impl.h"
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_constants.h"
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/onc/onc_utils.h"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/service_providers_win.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::PassPlatformFile;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::PlatformFile;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::PlatformFileError;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay between when an event occurs and when it is passed to the Javascript
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page.  All events that occur during this period are grouped together and
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sent to the page at once, which reduces context switching and CPU usage.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kNetLogEventDelayMilliseconds = 100;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the HostCache for |context|'s primary HostResolver, or NULL if
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// there is none.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HostCache* GetHostResolverCache(net::URLRequestContext* context) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context->host_resolver()->GetHostCache();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string HashesToBase64String(const net::HashValueVector& hashes) {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string str;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i != hashes.size(); ++i) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i != 0)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      str += ",";
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    str += hashes[i].ToString();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return str;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Base64StringToHashes(const std::string& hashes_str,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          net::HashValueVector* hashes) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  hashes->clear();
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string> vector_hash_str;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SplitString(hashes_str, ',', &vector_hash_str);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i != vector_hash_str.size(); ++i) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string hash_str;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RemoveChars(vector_hash_str[i], " \t\r\n", &hash_str);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::HashValue hash;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Skip past unrecognized hash algos
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // But return false on malformatted input
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (hash_str.empty())
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (hash_str.compare(0, 5, "sha1/") != 0 &&
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        hash_str.compare(0, 7, "sha256/") != 0) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!hash.FromString(hash_str))
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    hashes->push_back(hash);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a Value representing the state of a pre-existing URLRequest when
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// net-internals was opened.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* RequestStateToValue(const net::URLRequest* request,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           net::NetLog::LogLevel log_level) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("url", request->original_url().possibly_invalid_spec());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<GURL>& url_chain = request->url_chain();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url_chain.size() > 1) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* list = new ListValue();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<GURL>::const_iterator url = url_chain.begin();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         url != url_chain.end(); ++url) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->AppendString(url->spec());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("url_chain", list);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger("load_flags", request->load_flags());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::LoadStateWithParam load_state = request->GetLoadState();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger("load_state", load_state.state);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!load_state.param.empty())
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("load_state_param", load_state.param);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("method", request->method());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean("has_upload", request->has_upload());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetBoolean("is_pending", request->is_pending());
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Add the status of the request.  The status should always be IO_PENDING, and
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the error should always be OK, unless something is holding onto a request
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // that has finished or a request was leaked.  Neither of these should happen.
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch (request->status().status()) {
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case net::URLRequestStatus::SUCCESS:
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict->SetString("status", "SUCCESS");
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case net::URLRequestStatus::IO_PENDING:
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict->SetString("status", "IO_PENDING");
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case net::URLRequestStatus::CANCELED:
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict->SetString("status", "CANCELED");
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case net::URLRequestStatus::FAILED:
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dict->SetString("status", "FAILED");
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (request->status().error() != net::OK)
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dict->SetInteger("net_error", request->status().error());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |request1| was created before |request2|.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RequestCreatedBefore(const net::URLRequest* request1,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const net::URLRequest* request2) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return request1->creation_time() < request2->creation_time();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the disk cache backend for |context| if there is one, or NULL.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)disk_cache::Backend* GetDiskCacheBackend(net::URLRequestContext* context) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context->http_transaction_factory())
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpCache* http_cache = context->http_transaction_factory()->GetCache();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!http_cache)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return http_cache->GetCurrentBackend();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the http network session for |context| if there is one.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise, returns NULL.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::HttpNetworkSession* GetHttpNetworkSession(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContext* context) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context->http_transaction_factory())
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return context->http_transaction_factory()->GetSession();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* ExperimentToValue(const ConnectionTester::Experiment& experiment) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (experiment.url.is_valid())
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("url", experiment.url.spec());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("proxy_settings_experiment",
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ConnectionTester::ProxySettingsExperimentDescription(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      experiment.proxy_settings_experiment));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetString("host_resolver_experiment",
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ConnectionTester::HostResolverExperimentDescription(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      experiment.host_resolver_experiment));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dict;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebUIDataSource* CreateNetInternalsHTMLSource() {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource* source =
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebUIDataSource::Create(chrome::kChromeUINetInternalsHost);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetDefaultResource(IDR_NET_INTERNALS_INDEX_HTML);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->AddResourcePath("index.js", IDR_NET_INTERNALS_INDEX_JS);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetJsonPath("strings.js");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return source;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Small helper class used to create temporary log file and pass its
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handle and error status to callback.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use case:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DebugLogFileHelper* helper = new DebugLogFileHelper();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::WorkerPool::PostTaskAndReply(FROM_HERE,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     base::Bind(&DebugLogFileHelper::DoWork, base::Unretained(helper), ...),
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     base::Bind(&DebugLogFileHelper::Reply, base::Owned(helper), ...),
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     false);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DebugLogFileHelper {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(PassPlatformFile pass_platform_file,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool created,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              PlatformFileError error,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::FilePath& file_path)>
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DebugLogFileCallback;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DebugLogFileHelper()
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : file_handle_(base::kInvalidPlatformFileValue),
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        created_(false),
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        error_(base::PLATFORM_FILE_OK) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DebugLogFileHelper() {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoWork(const base::FilePath& fileshelf) {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath::CharType kLogFileName[] =
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FILE_PATH_LITERAL("debug-log.tgz");
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_path_ = fileshelf.Append(kLogFileName);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_path_ = logging::GenerateTimestampedName(file_path_,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  base::Time::Now());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int flags =
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::PLATFORM_FILE_CREATE_ALWAYS |
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::PLATFORM_FILE_WRITE;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_handle_ = base::CreatePlatformFile(file_path_, flags,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &created_, &error_);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reply(const DebugLogFileCallback& callback) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!callback.is_null());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(PassPlatformFile(&file_handle_), created_, error_, file_path_);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PlatformFile file_handle_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool created_;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PlatformFileError error_;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path_;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DebugLogFileHelper);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Following functions are used for getting debug logs. Logs are
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fetched from /var/log/* and put on the fileshelf.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called once StoreDebugLogs is complete. Takes two parameters:
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - log_path: where the log file was saved in the case of success;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - succeeded: was the log file saved successfully.
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef base::Callback<void(const base::FilePath& log_path,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool succeded)> StoreDebugLogsCallback;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Closes file handle, so, should be called on the WorkerPool thread.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloseDebugLogFile(PassPlatformFile pass_platform_file) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ClosePlatformFile(pass_platform_file.ReleaseValue());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Closes file handle and deletes debug log file, so, should be called
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the WorkerPool thread.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloseAndDeleteDebugLogFile(PassPlatformFile pass_platform_file,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const base::FilePath& file_path) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseDebugLogFile(pass_platform_file);
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DeleteFile(file_path, false);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called upon completion of |WriteDebugLogToFile|. Closes file
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// descriptor, deletes log file in the case of failure and calls
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |callback|.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WriteDebugLogToFileCompleted(const StoreDebugLogsCallback& callback,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PassPlatformFile pass_platform_file,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const base::FilePath& file_path,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool succeeded) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!succeeded) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool posted = base::WorkerPool::PostTaskAndReply(FROM_HERE,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&CloseAndDeleteDebugLogFile, pass_platform_file, file_path),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(callback, file_path, false), false);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(posted);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool posted = base::WorkerPool::PostTaskAndReply(FROM_HERE,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CloseDebugLogFile, pass_platform_file),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(callback, file_path, true), false);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(posted);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores into |file_path| debug logs in the .tgz format. Calls
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |callback| upon completion.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WriteDebugLogToFile(const StoreDebugLogsCallback& callback,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         PassPlatformFile pass_platform_file,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool created,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         PlatformFileError error,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const base::FilePath& file_path) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!created) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) <<
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Can't create debug log file: " << file_path.AsUTF8Unsafe() << ", " <<
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "error: " << error;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool posted = base::WorkerPool::PostTaskAndReply(FROM_HERE,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&CloseDebugLogFile, pass_platform_file),
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(callback, file_path, false), false);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(posted);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PlatformFile platform_file = pass_platform_file.ReleaseValue();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->GetDebugLogs(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      platform_file,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&WriteDebugLogToFileCompleted,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          callback, PassPlatformFile(&platform_file), file_path));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores debug logs in the .tgz archive on the fileshelf. The file is
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created on the worker pool, then writing to it is triggered from
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the UI thread, and finally it is closed (on success) or deleted (on
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// failure) on the worker pool, prior to calling |callback|.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StoreDebugLogs(const StoreDebugLogsCallback& callback) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath fileshelf = download_util::GetDefaultDownloadDirectory();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DebugLogFileHelper* helper = new DebugLogFileHelper();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool posted = base::WorkerPool::PostTaskAndReply(FROM_HERE,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DebugLogFileHelper::DoWork,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Unretained(helper), fileshelf),
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DebugLogFileHelper::Reply, base::Owned(helper),
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&WriteDebugLogToFile, callback)), false);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(posted);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class receives javascript messages from the renderer.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that the WebUI infrastructure runs on the UI thread, therefore all of
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this class's methods are expected to run on the UI thread.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Since the network code we want to run lives on the IO thread, we proxy
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// almost everything over to NetInternalsMessageHandler::IOThreadImpl, which
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// runs on the IO thread.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(eroman): Can we start on the IO thread to begin with?
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetInternalsMessageHandler
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public WebUIMessageHandler,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<NetInternalsMessageHandler> {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetInternalsMessageHandler();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~NetInternalsMessageHandler();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUIMessageHandler implementation.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessages() OVERRIDE;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls g_browser.receive in the renderer, passing in |command| and |arg|.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |arg|.  If the renderer is displaying a log file, the
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message will be ignored.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendJavascriptCommand(const std::string& command, Value* arg);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript message handlers.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRendererReady(const ListValue* list);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnClearBrowserCache(const ListValue* list);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetPrerenderInfo(const ListValue* list);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetHistoricNetworkStats(const ListValue* list);
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnGetExtensionInfo(const ListValue* list);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRefreshSystemLogs(const ListValue* list);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetSystemLog(const ListValue* list);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnImportONCFile(const ListValue* list);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStoreDebugLogs(const ListValue* list);
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnStoreDebugLogsCompleted(const base::FilePath& log_path,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 bool succeeded);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetNetworkDebugMode(const ListValue* list);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetNetworkDebugModeCompleted(const std::string& subsystem,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool succeeded);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class IOThreadImpl;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Class that is used for getting network related ChromeOS logs.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs are fetched from ChromeOS libcros on user request, and only when we
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't yet have a copy of logs. If a copy is present, we send back data from
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it, else we save request and answer to it when we get logs from libcros.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If needed, we also send request for system logs to libcros.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs refresh has to be done explicitly, by deleting old logs and then
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loading them again.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SystemLogsGetter {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SystemLogsGetter(NetInternalsMessageHandler* handler,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     chromeos::system::SyslogsProvider* syslogs_provider);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~SystemLogsGetter();
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Deletes logs copy we currently have, and resets logs_requested and
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // logs_received flags.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void DeleteSystemLogs();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Starts log fetching. If logs copy is present, requested logs are sent
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // back.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If syslogs load request hasn't been sent to libcros yet, we do that now,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and postpone sending response.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Request data is specified by args:
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   $1 : key of the log we are interested in.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   $2 : string used to identify request.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void RequestSystemLog(const ListValue* args);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Requests logs from libcros, but only if we don't have a copy.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void LoadSystemLogs();
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Processes callback from libcros containing system logs. Postponed
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // request responses are sent.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void OnSystemLogsLoaded(chromeos::system::LogDictionaryType* sys_info,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            std::string* ignored_content);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Struct we save postponed log request in.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct SystemLogRequest {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string log_key;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string cell_id;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Processes request.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void SendLogs(const SystemLogRequest& request);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetInternalsMessageHandler* handler_;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::system::SyslogsProvider* syslogs_provider_;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // List of postponed requests.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::list<SystemLogRequest> requests_;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<chromeos::system::LogDictionaryType> logs_;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool logs_received_;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool logs_requested_;
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CancelableTaskTracker tracker_;
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Libcros request task ID.
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CancelableTaskTracker::TaskId syslogs_task_id_;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the "real" message handler, which lives on the IO thread.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<IOThreadImpl> proxy_;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<prerender::PrerenderManager> prerender_manager_;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Class that handles getting and filtering system logs.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SystemLogsGetter> syslogs_getter_;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetInternalsMessageHandler);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is the "real" message handler. It is allocated and destroyed on
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the UI thread.  With the exception of OnAddEntry, OnWebUIDeleted, and
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SendJavascriptCommand, its methods are all expected to be called from the IO
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread.  OnAddEntry and SendJavascriptCommand can be called from any thread,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and OnWebUIDeleted can only be called from the UI thread.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetInternalsMessageHandler::IOThreadImpl
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NetInternalsMessageHandler::IOThreadImpl,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::DeleteOnUIThread>,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public net::NetLog::ThreadSafeObserver,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ConnectionTester::Delegate {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Type for methods that can be used as MessageHandler callbacks.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void (IOThreadImpl::*MessageHandler)(const ListValue*);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a proxy for |handler| that will live on the IO thread.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |handler| is a weak pointer, since it is possible for the
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUIMessageHandler to be deleted on the UI thread while we were executing
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on the IO thread. |io_thread| is the global IOThread (it is passed in as
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an argument since we need to grab it from the UI thread).
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThreadImpl(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::WeakPtr<NetInternalsMessageHandler>& handler,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IOThread* io_thread,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequestContextGetter* main_context_getter);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on UI thread just after creation, to add a ContextGetter to
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |context_getters_|.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRequestContextGetter(net::URLRequestContextGetter* context_getter);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to enable a callback that will be executed on the IO thread.
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CallbackHelper(MessageHandler method,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             scoped_refptr<IOThreadImpl> io_thread,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const ListValue* list);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called once the WebUI has been deleted (i.e. renderer went away), on the
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IO thread.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Detach();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the WebUI is deleted.  Prevents calling Javascript functions
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // afterwards.  Called on UI thread.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnWebUIDeleted();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //--------------------------------
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript message handlers:
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //--------------------------------
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRendererReady(const ListValue* list);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetProxySettings(const ListValue* list);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnReloadProxySettings(const ListValue* list);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetBadProxies(const ListValue* list);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnClearBadProxies(const ListValue* list);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetHostResolverInfo(const ListValue* list);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnClearHostResolverCache(const ListValue* list);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEnableIPv6(const ListValue* list);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStartConnectionTests(const ListValue* list);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnHSTSQuery(const ListValue* list);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnHSTSAdd(const ListValue* list);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnHSTSDelete(const ListValue* list);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetHttpCacheInfo(const ListValue* list);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetSocketPoolInfo(const ListValue* list);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetSessionNetworkStats(const ListValue* list);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCloseIdleSockets(const ListValue* list);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnFlushSocketPools(const ListValue* list);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetSpdySessionInfo(const ListValue* list);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetSpdyStatus(const ListValue* list);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetSpdyAlternateProtocolMappings(const ListValue* list);
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnGetQuicInfo(const ListValue* list);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetServiceProviders(const ListValue* list);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetHttpPipeliningStatus(const ListValue* list);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetLogLevel(const ListValue* list);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChromeNetLog::ThreadSafeObserver implementation:
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConnectionTester::Delegate implementation:
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStartConnectionTestSuite() OVERRIDE;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStartConnectionTestExperiment(
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ConnectionTester::Experiment& experiment) OVERRIDE;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCompletedConnectionTestExperiment(
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ConnectionTester::Experiment& experiment,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int result) OVERRIDE;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCompletedConnectionTestSuite() OVERRIDE;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper that calls g_browser.receive in the renderer, passing in |command|
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and |arg|.  Takes ownership of |arg|.  If the renderer is displaying a log
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file, the message will be ignored.  Note that this can be called from any
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendJavascriptCommand(const std::string& command, Value* arg);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<IOThreadImpl>;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::list<scoped_refptr<net::URLRequestContextGetter> >
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContextGetterList;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~IOThreadImpl();
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds |entry| to the queue of pending log entries to be sent to the page via
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript.  Must be called on the IO Thread.  Also creates a delayed task
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that will call PostPendingEntries, if there isn't one already.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddEntryToQueue(Value* entry);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends all pending entries to the page via Javascript, and clears the list
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of pending entries.  Sending multiple entries at once results in a
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // significant reduction of CPU usage when a lot of events are happening.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called on the IO Thread.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PostPendingEntries();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds entries with the states of ongoing URL requests.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrePopulateEventList();
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext* GetMainContext() {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return main_context_getter_->GetURLRequestContext();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pointer to the UI-thread message handler. Only access this from
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the UI thread.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<NetInternalsMessageHandler> handler_;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The global IOThread, which contains the global NetLog to observer.
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThread* io_thread_;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The main URLRequestContextGetter for the tab's profile.
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> main_context_getter_;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper that runs the suite of connection tests.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ConnectionTester> connection_tester_;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the Web UI has been deleted.  This is used to prevent calling
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript functions after the Web UI is destroyed.  On refresh, the
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // messages can end up being sent to the refreshed page, causing duplicate
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or partial entries.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only read and written to on the UI thread.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_webui_deleted_;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Log entries that have yet to be passed along to Javascript page.  Non-NULL
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when and only when there is a pending delayed task to call
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PostPendingEntries.  Read and written to exclusively on the IO Thread.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ListValue> pending_entries_;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for getting current status of URLRequests when net-internals is
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened.  |main_context_getter_| is automatically added on construction.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Duplicates are allowed.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContextGetterList context_getters_;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IOThreadImpl);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsMessageHandler
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::NetInternalsMessageHandler() {}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::~NetInternalsMessageHandler() {
667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (proxy_.get()) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proxy_.get()->OnWebUIDeleted();
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Notify the handler on the IO thread that the renderer is gone.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(&IOThreadImpl::Detach, proxy_.get()));
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::RegisterMessages() {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_ = new IOThreadImpl(this->AsWeakPtr(), g_browser_process->io_thread(),
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            profile->GetRequestContext());
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_->AddRequestContextGetter(profile->GetMediaRequestContext());
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy_->AddRequestContextGetter(profile->GetRequestContextForExtensions());
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_.reset(new SystemLogsGetter(this,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::system::SyslogsProvider::GetInstance()));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender::PrerenderManager* prerender_manager =
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender::PrerenderManagerFactory::GetForProfile(profile);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prerender_manager) {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender_manager_ = prerender_manager->AsWeakPtr();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prerender_manager_ = base::WeakPtr<prerender::PrerenderManager>();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "notifyReady",
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnRendererReady,
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getProxySettings",
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetProxySettings, proxy_));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "reloadProxySettings",
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnReloadProxySettings, proxy_));
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getBadProxies",
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetBadProxies, proxy_));
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "clearBadProxies",
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnClearBadProxies, proxy_));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getHostResolverInfo",
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetHostResolverInfo, proxy_));
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "clearHostResolverCache",
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnClearHostResolverCache, proxy_));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "enableIPv6",
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnEnableIPv6, proxy_));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "startConnectionTests",
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnStartConnectionTests, proxy_));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "hstsQuery",
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnHSTSQuery, proxy_));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "hstsAdd",
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnHSTSAdd, proxy_));
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "hstsDelete",
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnHSTSDelete, proxy_));
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getHttpCacheInfo",
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetHttpCacheInfo, proxy_));
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSocketPoolInfo",
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSocketPoolInfo, proxy_));
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSessionNetworkStats",
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSessionNetworkStats, proxy_));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "closeIdleSockets",
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnCloseIdleSockets, proxy_));
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "flushSocketPools",
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnFlushSocketPools, proxy_));
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSpdySessionInfo",
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSpdySessionInfo, proxy_));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSpdyStatus",
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSpdyStatus, proxy_));
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSpdyAlternateProtocolMappings",
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetSpdyAlternateProtocolMappings, proxy_));
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "getQuicInfo",
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &IOThreadImpl::OnGetQuicInfo, proxy_));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getServiceProviders",
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetServiceProviders, proxy_));
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getHttpPipeliningStatus",
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnGetHttpPipeliningStatus, proxy_));
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "setLogLevel",
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::CallbackHelper,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &IOThreadImpl::OnSetLogLevel, proxy_));
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "clearBrowserCache",
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnClearBrowserCache,
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getPrerenderInfo",
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetPrerenderInfo,
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getHistoricNetworkStats",
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetHistoricNetworkStats,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_ui()->RegisterMessageCallback(
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "getExtensionInfo",
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetExtensionInfo,
811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "refreshSystemLogs",
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnRefreshSystemLogs,
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getSystemLog",
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnGetSystemLog,
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "importONCFile",
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnImportONCFile,
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "storeDebugLogs",
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnStoreDebugLogs,
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "setNetworkDebugMode",
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnSetNetworkDebugMode,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SendJavascriptCommand(
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& command,
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Value* arg) {
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> command_value(Value::CreateStringValue(command));
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> value(arg);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value.get()) {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("g_browser.receive",
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     *command_value.get(),
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     *value.get());
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("g_browser.receive",
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     *command_value.get());
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnRendererReady(const ListValue* list) {
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IOThreadImpl::CallbackHelper(&IOThreadImpl::OnRendererReady, proxy_, list);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnClearBrowserCache(const ListValue* list) {
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowsingDataRemover* remover = BrowsingDataRemover::CreateForUnboundedRange(
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromWebUI(web_ui()));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  remover->Remove(BrowsingDataRemover::REMOVE_CACHE,
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  BrowsingDataHelper::UNPROTECTED_WEB);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowsingDataRemover deletes itself.
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnGetPrerenderInfo(const ListValue* list) {
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* value = NULL;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prerender::PrerenderManager* prerender_manager = prerender_manager_.get();
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!prerender_manager) {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = new DictionaryValue();
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value->SetBoolean("enabled", false);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value->SetBoolean("omnibox_enabled", false);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = prerender_manager->GetAsValue();
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedPrerenderInfo", value);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnGetHistoricNetworkStats(
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* historic_network_info =
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChromeNetworkDelegate::HistoricNetworkStatsInfoToValue();
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHistoricNetworkStats", historic_network_info);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
887c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void NetInternalsMessageHandler::OnGetExtensionInfo(const ListValue* list) {
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
889c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ListValue* extension_list = new ListValue();
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions::ExtensionSystem* extension_system =
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile);
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (extension_system) {
894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionService* extension_service = extension_system->extension_service();
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (extension_service) {
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<const ExtensionSet> extensions(
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          extension_service->GenerateInstalledExtensionsSet());
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (ExtensionSet::const_iterator it = extensions->begin();
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)           it != extensions->end(); ++it) {
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        DictionaryValue* extension_info = new DictionaryValue();
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bool enabled = extension_service->IsExtensionEnabled((*it)->id());
9027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        extensions::GetExtensionBasicInfo(it->get(), enabled, extension_info);
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extension_list->Append(extension_info);
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SendJavascriptCommand("receivedExtensionInfo", extension_list);
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsMessageHandler::SystemLogsGetter
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::SystemLogsGetter::SystemLogsGetter(
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetInternalsMessageHandler* handler,
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::system::SyslogsProvider* syslogs_provider)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : handler_(handler),
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syslogs_provider_(syslogs_provider),
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logs_received_(false),
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logs_requested_(false) {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!syslogs_provider_)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "System access library not loaded";
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::SystemLogsGetter::~SystemLogsGetter() {
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteSystemLogs();
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::DeleteSystemLogs() {
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (syslogs_provider_ && logs_requested_ && !logs_received_) {
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tracker_.TryCancel(syslogs_task_id_);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_requested_ = false;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_received_ = false;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_.reset();
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::RequestSystemLog(
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* args) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!logs_requested_) {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!logs_received_);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadSystemLogs();
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemLogRequest log_request;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args->GetString(0, &log_request.log_key);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args->GetString(1, &log_request.cell_id);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (logs_received_) {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendLogs(log_request);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    requests_.push_back(log_request);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::LoadSystemLogs() {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (logs_requested_ || !syslogs_provider_)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_requested_ = true;
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syslogs_task_id_ = syslogs_provider_->RequestSyslogs(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,  // compress logs.
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::system::SyslogsProvider::SYSLOGS_NETWORK,
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &NetInternalsMessageHandler::SystemLogsGetter::OnSystemLogsLoaded,
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Unretained(this)),
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &tracker_);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::OnSystemLogsLoaded(
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::system::LogDictionaryType* sys_info,
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* ignored_content) {
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!ignored_content);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_.reset(sys_info);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logs_received_ = true;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::list<SystemLogRequest>::iterator request_it = requests_.begin();
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       request_it != requests_.end();
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++request_it) {
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendLogs(*request_it);
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requests_.clear();
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::SystemLogsGetter::SendLogs(
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const SystemLogRequest& request) {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* result = new DictionaryValue();
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::system::LogDictionaryType::iterator log_it =
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      logs_->find(request.log_key);
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (log_it != logs_->end()) {
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!log_it->second.empty()) {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result->SetString("log", log_it->second);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result->SetString("log", "<no relevant lines found>");
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetString("log", "<invalid log name>");
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->SetString("cellId", request.cell_id);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  handler_->SendJavascriptCommand("getSystemLogCallback", result);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsMessageHandler::IOThreadImpl
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::IOThreadImpl(
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::WeakPtr<NetInternalsMessageHandler>& handler,
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IOThread* io_thread,
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* main_context_getter)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : handler_(handler),
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_(io_thread),
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      main_context_getter_(main_context_getter),
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_webui_deleted_(false) {
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddRequestContextGetter(main_context_getter);
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::~IOThreadImpl() {
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::AddRequestContextGetter(
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequestContextGetter* context_getter) {
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context_getters_.push_back(context_getter);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::CallbackHelper(
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageHandler method,
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<IOThreadImpl> io_thread,
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to make a copy of the value in order to pass it over to the IO
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread. |list_copy| will be deleted when the task is destroyed. The called
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |method| cannot take ownership of |list_copy|.
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* list_copy = (list && list->GetSize()) ? list->DeepCopy() : NULL;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(method, io_thread, base::Owned(list_copy)));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::Detach() {
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregister with network stack to observe events.
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net_log())
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net_log()->RemoveThreadSafeObserver(this);
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel any in-progress connection tests.
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_tester_.reset();
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnWebUIDeleted() {
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  was_webui_deleted_ = true;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnRendererReady(
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have any pending entries, go ahead and get rid of them, so they won't
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // appear before the REQUEST_ALIVE events we add for currently active
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLRequests.
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PostPendingEntries();
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedConstants", NetInternalsUI::GetConstants());
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add entries for ongoing URL requests.
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrePopulateEventList();
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net_log()) {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register with network stack to observe events.
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_thread_->net_log()->AddThreadSafeObserver(this,
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::NetLog::LOG_ALL_BUT_BYTES);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetProxySettings(
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ProxyService* proxy_service = GetMainContext()->proxy_service();
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (proxy_service->fetched_config().is_valid())
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("original", proxy_service->fetched_config().ToValue());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (proxy_service->config().is_valid())
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("effective", proxy_service->config().ToValue());
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedProxySettings", dict);
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnReloadProxySettings(
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMainContext()->proxy_service()->ForceReloadProxyConfig();
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new values.
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetProxySettings(NULL);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetBadProxies(
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::ProxyRetryInfoMap& bad_proxies_map =
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMainContext()->proxy_service()->proxy_retry_info();
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* dict_list = new ListValue();
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (net::ProxyRetryInfoMap::const_iterator it = bad_proxies_map.begin();
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != bad_proxies_map.end(); ++it) {
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& proxy_uri = it->first;
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::ProxyRetryInfo& retry_info = it->second;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* dict = new DictionaryValue();
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("proxy_uri", proxy_uri);
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("bad_until",
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    net::NetLog::TickCountToString(retry_info.bad_until));
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict_list->Append(dict);
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedBadProxies", dict_list);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnClearBadProxies(
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetMainContext()->proxy_service()->ClearBadProxiesCache();
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new values.
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetBadProxies(NULL);
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetHostResolverInfo(
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestContext* context = GetMainContext();
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostCache* cache = GetHostResolverCache(context);
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cache) {
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendJavascriptCommand("receivedHostResolverInfo", NULL);
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Value* dns_config = context->host_resolver()->GetDnsConfigAsValue();
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dns_config)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->Set("dns_config", dns_config);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger(
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "default_address_family",
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<int>(context->host_resolver()->GetDefaultAddressFamily()));
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* cache_info_dict = new DictionaryValue();
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_info_dict->SetInteger(
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "capacity",
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<int>(cache->max_entries()));
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* entry_list = new ListValue();
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostCache::EntryMap::Iterator it(cache->entries());
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; it.HasNext(); it.Advance()) {
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::HostCache::Key& key = it.key();
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::HostCache::Entry& entry = it.value();
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* entry_dict = new DictionaryValue();
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_dict->SetString("hostname", key.hostname);
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_dict->SetInteger("address_family",
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<int>(key.address_family));
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_dict->SetString("expiration",
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::NetLog::TickCountToString(it.expiration()));
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry.error != net::OK) {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_dict->SetInteger("error", entry.error);
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Append all of the resolved addresses.
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ListValue* address_list = new ListValue();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t i = 0; i < entry.addrlist.size(); ++i) {
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        address_list->AppendString(entry.addrlist[i].ToStringWithoutPort());
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry_dict->Set("addresses", address_list);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_list->Append(entry_dict);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_info_dict->Set("entries", entry_list);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->Set("cache", cache_info_dict);
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHostResolverInfo", dict);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnClearHostResolverCache(
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostCache* cache = GetHostResolverCache(GetMainContext());
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cache)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache->clear();
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new values.
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetHostResolverInfo(NULL);
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnEnableIPv6(
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostResolver* host_resolver = GetMainContext()->host_resolver();
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver->SetDefaultAddressFamily(net::ADDRESS_FAMILY_UNSPECIFIED);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cause the renderer to be notified of the new value.
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetHostResolverInfo(NULL);
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTests(
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |value| should be: [<URL to test>].
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 url_str;
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &url_str));
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to fix-up the user provided URL into something valid.
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For example, turn "www.google.com" into "http://www.google.com".
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(URLFixerUpper::FixupURL(UTF16ToUTF8(url_str), std::string()));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_tester_.reset(new ConnectionTester(
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this,
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_->globals()->proxy_script_fetcher_context.get(),
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net_log()));
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  connection_tester_->RunAllTests(url);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnHSTSQuery(
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |list| should be: [<domain to query>].
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string domain;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &domain));
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* result = new DictionaryValue();
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsStringASCII(domain)) {
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetString("error", "non-ASCII domain name");
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::TransportSecurityState* transport_security_state =
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetMainContext()->transport_security_state();
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!transport_security_state) {
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result->SetString("error", "no TransportSecurityState active");
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::TransportSecurityState::DomainState state;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const bool found = transport_security_state->GetDomainState(
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          domain, true, &state);
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result->SetBoolean("result", found);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (found) {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result->SetInteger("mode", static_cast<int>(state.upgrade_mode));
12667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        result->SetBoolean("sts_subdomains", state.sts_include_subdomains);
12677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        result->SetBoolean("pkp_subdomains", state.pkp_include_subdomains);
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result->SetString("domain", state.domain);
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result->SetDouble("expiry", state.upgrade_expiry.ToDoubleT());
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result->SetDouble("dynamic_spki_hashes_expiry",
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          state.dynamic_spki_hashes_expiry.ToDoubleT());
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        result->SetString("static_spki_hashes",
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          HashesToBase64String(state.static_spki_hashes));
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        result->SetString("dynamic_spki_hashes",
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          HashesToBase64String(state.dynamic_spki_hashes));
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHSTSResult", result);
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnHSTSAdd(
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
12867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // |list| should be: [<domain to query>, <STS include subdomains>, <PKP
12877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // include subdomains>, <key pins>].
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string domain;
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &domain));
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsStringASCII(domain)) {
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Silently fail. The user will get a helpful error if they query for the
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // name.
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool sts_include_subdomains;
12967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK(list->GetBoolean(1, &sts_include_subdomains));
12977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool pkp_include_subdomains;
12987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK(list->GetBoolean(2, &pkp_include_subdomains));
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hashes_str;
13007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CHECK(list->GetString(3, &hashes_str));
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TransportSecurityState* transport_security_state =
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMainContext()->transport_security_state();
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!transport_security_state)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::HashValueVector hashes;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!hashes_str.empty()) {
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!Base64StringToHashes(hashes_str, &hashes))
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  transport_security_state->AddHSTS(domain, expiry, sts_include_subdomains);
13157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  transport_security_state->AddHPKP(domain, expiry, pkp_include_subdomains,
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    hashes);
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnHSTSDelete(
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |list| should be: [<domain to query>].
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string domain;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(list->GetString(0, &domain));
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsStringASCII(domain)) {
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There cannot be a unicode entry in the HSTS set.
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TransportSecurityState* transport_security_state =
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetMainContext()->transport_security_state();
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!transport_security_state)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transport_security_state->DeleteDynamicDataForHost(domain);
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetHttpCacheInfo(
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* info_dict = new DictionaryValue();
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* stats_dict = new DictionaryValue();
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Backend* disk_cache = GetDiskCacheBackend(GetMainContext());
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (disk_cache) {
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Extract the statistics key/value pairs from the backend.
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::pair<std::string, std::string> > stats;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache->GetStats(&stats);
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < stats.size(); ++i) {
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      stats_dict->SetStringWithoutPathExpansion(
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          stats[i].first, stats[i].second);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info_dict->Set("stats", stats_dict);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHttpCacheInfo", info_dict);
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSocketPoolInfo(
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* socket_pool_info = NULL;
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    socket_pool_info = http_network_session->SocketPoolInfoToValue();
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSocketPoolInfo", socket_pool_info);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSessionNetworkStats(
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(main_context_getter_->GetURLRequestContext());
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* network_info = NULL;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session) {
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeNetworkDelegate* net_delegate =
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<ChromeNetworkDelegate*>(
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            http_network_session->network_delegate());
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (net_delegate) {
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_info = net_delegate->SessionNetworkStatsInfoToValue();
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSessionNetworkStats", network_info);
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnFlushSocketPools(
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_network_session->CloseAllConnections();
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnCloseIdleSockets(
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_network_session->CloseIdleConnections();
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSpdySessionInfo(
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* spdy_info = http_network_session ?
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_network_session->SpdySessionPoolInfoToValue() : NULL;
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSpdySessionInfo", spdy_info);
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetSpdyStatus(
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* status_dict = new DictionaryValue();
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_dict->Set("spdy_enabled",
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Value::CreateBooleanValue(
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       net::HttpStreamFactory::spdy_enabled()));
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_dict->Set("use_alternate_protocols",
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Value::CreateBooleanValue(
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       net::HttpStreamFactory::use_alternate_protocols()));
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_dict->Set("force_spdy_over_ssl",
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Value::CreateBooleanValue(
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       net::HttpStreamFactory::force_spdy_over_ssl()));
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_dict->Set("force_spdy_always",
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Value::CreateBooleanValue(
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       net::HttpStreamFactory::force_spdy_always()));
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The next_protos may not be specified for certain configurations of SPDY.
1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string next_protos_string;
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net::HttpStreamFactory::has_next_protos()) {
1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    next_protos_string = JoinString(net::HttpStreamFactory::next_protos(), ',');
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status_dict->SetString("next_protos", next_protos_string);
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSpdyStatus", status_dict);
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnGetSpdyAlternateProtocolMappings(
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* dict_list = new ListValue();
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::HttpServerProperties& http_server_properties =
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *GetMainContext()->http_server_properties();
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::AlternateProtocolMap& map =
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_properties.alternate_protocol_map();
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (net::AlternateProtocolMap::const_iterator it = map.begin();
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != map.end(); ++it) {
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* dict = new DictionaryValue();
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("host_port_pair", it->first.ToString());
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString("alternate_protocol", it->second.ToString());
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict_list->Append(dict);
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSpdyAlternateProtocolMappings", dict_list);
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetQuicInfo(
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ListValue* list) {
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!list);
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::HttpNetworkSession* http_network_session =
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Value* quic_info = http_network_session ?
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      http_network_session->QuicInfoToValue() : NULL;
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendJavascriptCommand("receivedQuicInfo", quic_info);
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetServiceProviders(
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* service_providers = new DictionaryValue();
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WinsockLayeredServiceProviderList layered_providers;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWinsockLayeredServiceProviders(&layered_providers);
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* layered_provider_list = new ListValue();
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < layered_providers.size(); ++i) {
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* service_dict = new DictionaryValue();
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetString("name", layered_providers[i].name);
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("version", layered_providers[i].version);
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("chain_length", layered_providers[i].chain_length);
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("socket_type", layered_providers[i].socket_type);
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetInteger("socket_protocol",
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        layered_providers[i].socket_protocol);
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_dict->SetString("path", layered_providers[i].path);
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layered_provider_list->Append(service_dict);
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_providers->Set("service_providers", layered_provider_list);
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WinsockNamespaceProviderList namespace_providers;
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWinsockNamespaceProviders(&namespace_providers);
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* namespace_list = new ListValue;
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < namespace_providers.size(); ++i) {
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* namespace_dict = new DictionaryValue();
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetString("name", namespace_providers[i].name);
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetBoolean("active", namespace_providers[i].active);
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetInteger("version", namespace_providers[i].version);
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_dict->SetInteger("type", namespace_providers[i].type);
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    namespace_list->Append(namespace_dict);
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_providers->Set("namespace_providers", namespace_list);
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedServiceProviders", service_providers);
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnRefreshSystemLogs(const ListValue* list) {
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(syslogs_getter_.get());
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_->DeleteSystemLogs();
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_->LoadSystemLogs();
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnGetSystemLog(const ListValue* list) {
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(syslogs_getter_.get());
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslogs_getter_->RequestSystemLog(list);
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnImportONCFile(const ListValue* list) {
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string onc_blob;
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string passcode;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (list->GetSize() != 2 ||
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !list->GetString(0, &onc_blob) ||
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !list->GetString(1, &passcode)) {
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::onc::ONCSource onc_source = chromeos::onc::ONC_SOURCE_USER_IMPORT;
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue network_configs;
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue certificates;
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!chromeos::onc::ParseAndValidateOncForImport(
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          onc_blob, onc_source, passcode, &network_configs, &certificates)) {
1554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    error = "Errors occurred during the ONC parsing. ";
1555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LOG(ERROR) << error;
1556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1558558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  chromeos::onc::CertificateImporterImpl cert_importer;
1559558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!cert_importer.ImportCertificates(certificates, onc_source, NULL)) {
1560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    error += "Some certificates couldn't be imported. ";
1561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LOG(ERROR) << error;
1562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::NetworkLibrary* network_library =
15657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      chromeos::NetworkLibrary::Get();
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  network_library->LoadOncNetworks(network_configs, onc_source);
1567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now that we've added the networks, we need to rescan them so they'll be
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // available from the menu more immediately.
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  network_library->RequestNetworkScan();
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedONCFileParse",
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Value::CreateStringValue(error));
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnStoreDebugLogs(const ListValue* list) {
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(list);
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StoreDebugLogs(
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&NetInternalsMessageHandler::OnStoreDebugLogsCompleted,
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 AsWeakPtr()));
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnStoreDebugLogsCompleted(
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& log_path, bool succeeded) {
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string status;
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (succeeded)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Created log file: " + log_path.BaseName().AsUTF8Unsafe();
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Failed to create log file";
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedStoreDebugLogs",
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Value::CreateStringValue(status));
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnSetNetworkDebugMode(const ListValue* list) {
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string subsystem;
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (list->GetSize() != 1 || !list->GetString(0, &subsystem))
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetDebugMode(
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          subsystem,
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted,
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              AsWeakPtr(),
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              subsystem));
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted(
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& subsystem,
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool succeeded) {
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string status;
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (succeeded)
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Debug mode is changed to " + subsystem;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status = "Failed to change debug mode to " + subsystem;
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedSetNetworkDebugMode",
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Value::CreateStringValue(status));
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetHttpPipeliningStatus(
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!list);
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* status_dict = new DictionaryValue();
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpNetworkSession* http_network_session =
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHttpNetworkSession(GetMainContext());
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_dict->Set("pipelining_enabled", Value::CreateBooleanValue(
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_network_session->params().http_pipelining_enabled));
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* pipelined_connection_info = NULL;
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_network_session) {
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pipelined_connection_info =
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        http_network_session->http_stream_factory()->PipelineInfoToValue();
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_dict->Set("pipelined_connection_info", pipelined_connection_info);
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::HttpServerProperties& http_server_properties =
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *GetMainContext()->http_server_properties();
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(simonjam): This call is slow.
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::PipelineCapabilityMap pipeline_capability_map =
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_server_properties.GetPipelineCapabilityMap();
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* known_hosts_list = new ListValue();
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::PipelineCapabilityMap::const_iterator it;
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (it = pipeline_capability_map.begin();
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != pipeline_capability_map.end(); ++it) {
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* host_dict = new DictionaryValue();
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_dict->SetString("host", it->first.ToString());
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string capability;
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (it->second) {
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case net::PIPELINE_CAPABLE:
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        capability = "capable";
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case net::PIPELINE_PROBABLY_CAPABLE:
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        capability = "probably capable";
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case net::PIPELINE_INCAPABLE:
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        capability = "incapable";
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case net::PIPELINE_UNKNOWN:
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        capability = "unknown";
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_dict->SetString("capability", capability);
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    known_hosts_list->Append(host_dict);
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_dict->Set("pipelined_host_info", known_hosts_list);
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedHttpPipeliningStatus", status_dict);
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnSetLogLevel(
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* list) {
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int log_level;
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string log_level_string;
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!list->GetString(0, &log_level_string) ||
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !base::StringToInt(log_level_string, &log_level)) {
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GE(log_level, net::NetLog::LOG_ALL);
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LE(log_level, net::NetLog::LOG_BASIC);
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net_log()->SetObserverLogLevel(
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, static_cast<net::NetLog::LogLevel>(log_level));
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that unlike other methods of IOThreadImpl, this function
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can be called from ANY THREAD.
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnAddEntry(
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::NetLog::Entry& entry) {
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::AddEntryToQueue, this, entry.ToValue()));
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestSuite() {
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand("receivedStartConnectionTestSuite", NULL);
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestExperiment(
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ConnectionTester::Experiment& experiment) {
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand(
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "receivedStartConnectionTestExperiment",
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExperimentToValue(experiment));
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestExperiment(
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ConnectionTester::Experiment& experiment,
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result) {
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* dict = new DictionaryValue();
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->Set("experiment", ExperimentToValue(experiment));
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->SetInteger("result", result);
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand(
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "receivedCompletedConnectionTestExperiment",
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict);
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestSuite() {
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendJavascriptCommand(
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "receivedCompletedConnectionTestSuite",
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this can be called from ANY THREAD.
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::SendJavascriptCommand(
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& command,
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Value* arg) {
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
1738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (handler_.get() && !was_webui_deleted_) {
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We check |handler_| in case it was deleted on the UI thread earlier
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // while we were running on the IO thread.
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handler_->SendJavascriptCommand(command, arg);
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete arg;
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::PostTask(
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&IOThreadImpl::SendJavascriptCommand, this, command, arg))) {
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Failed posting the task, avoid leaking.
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete arg;
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::AddEntryToQueue(Value* entry) {
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pending_entries_.get()) {
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_entries_.reset(new ListValue());
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostDelayedTask(
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::IO, FROM_HERE,
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&IOThreadImpl::PostPendingEntries, this),
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta::FromMilliseconds(kNetLogEventDelayMilliseconds));
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_entries_->Append(entry);
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::PostPendingEntries() {
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_entries_.get())
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendJavascriptCommand("receivedLogEntries", pending_entries_.release());
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::PrePopulateEventList() {
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a set to prevent duplicates.
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<net::URLRequestContext*> contexts;
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContextGetterList::const_iterator getter = context_getters_.begin();
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       getter != context_getters_.end(); ++getter) {
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contexts.insert((*getter)->GetURLRequestContext());
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contexts.insert(io_thread_->globals()->proxy_script_fetcher_context.get());
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contexts.insert(io_thread_->globals()->system_request_context.get());
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put together the list of all requests.
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const net::URLRequest*> requests;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<net::URLRequestContext*>::const_iterator context =
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           contexts.begin();
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       context != contexts.end(); ++context) {
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<const net::URLRequest*>* context_requests =
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*context)->url_requests();
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::set<const net::URLRequest*>::const_iterator request_it =
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             context_requests->begin();
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         request_it != context_requests->end(); ++request_it) {
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK_EQ(io_thread_->net_log(), (*request_it)->net_log().net_log());
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      requests.push_back(*request_it);
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sort by creation time.
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::sort(requests.begin(), requests.end(), RequestCreatedBefore);
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create fake events.
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<const net::URLRequest*>::const_iterator request_it =
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           requests.begin();
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       request_it != requests.end(); ++request_it) {
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLRequest* request = *request_it;
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::NetLog::ParametersCallback callback =
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&RequestStateToValue, base::Unretained(request));
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create and add the entry directly, to avoid sending it to any other
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NetLog observers.
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::NetLog::Entry entry(net::NetLog::TYPE_REQUEST_ALIVE,
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             request->net_log().source(),
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             net::NetLog::PHASE_BEGIN,
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             request->creation_time(),
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &callback,
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             request->net_log().GetLogLevel());
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Have to add |entry| to the queue synchronously, as there may already
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be posted tasks queued up to add other events for |request|, which we
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // want |entry| to precede.
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddEntryToQueue(entry.ToValue());
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsUI
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* NetInternalsUI::GetConstants() {
1837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DictionaryValue* constants_dict = net::NetLogLogger::GetConstants();
1838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(constants_dict);
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a dictionary with the version of the client and its command line
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // arguments.
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* dict = new DictionaryValue();
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::VersionInfo version_info;
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!version_info.is_valid()) {
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DLOG(ERROR) << "Unable to create chrome::VersionInfo";
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We have everything we need to send the right values.
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("name", version_info.Name());
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("version", version_info.Version());
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("cl", version_info.LastChange());
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("version_mod",
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      chrome::VersionInfo::GetVersionStringModifier());
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("official",
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      version_info.IsOfficialBuild() ? "official" :
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       "unofficial");
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("os_type", version_info.OSType());
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString("command_line",
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      CommandLine::ForCurrentProcess()->GetCommandLineString());
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    constants_dict->Set("clientInfo", dict);
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return constants_dict;
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsUI::NetInternalsUI(content::WebUI* web_ui)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WebUIController(web_ui) {
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui->AddMessageHandler(new NetInternalsMessageHandler());
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the chrome://net-internals/ source.
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui);
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource::Add(profile, CreateNetInternalsHTMLSource());
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1878