net_internals_ui.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
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/net/url_fixer_upper.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_basic_info.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h" 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/extension_set.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.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" 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/certificate_handler.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 1558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chromeos::CertificateHandler::CertsByGUID imported_server_and_ca_certs; 1559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chromeos::CertificateHandler certificate_handler; 1560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!certificate_handler.ImportCertificates(certificates, onc_source, NULL, 1561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &imported_server_and_ca_certs)) { 1562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error += "Some certificates couldn't be imported. "; 1563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LOG(ERROR) << error; 1564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!chromeos::onc::ResolveServerCertRefsInNetworks( 1567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch imported_server_and_ca_certs, &network_configs)) { 1568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error += "Some certificate references could not be resolved. "; 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << error; 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::NetworkLibrary* network_library = 15737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch chromeos::NetworkLibrary::Get(); 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_library->LoadOncNetworks(network_configs, onc_source); 1575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that we've added the networks, we need to rescan them so they'll be 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // available from the menu more immediately. 1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_library->RequestNetworkScan(); 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand("receivedONCFileParse", 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value::CreateStringValue(error)); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnStoreDebugLogs(const ListValue* list) { 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(list); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StoreDebugLogs( 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NetInternalsMessageHandler::OnStoreDebugLogsCompleted, 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AsWeakPtr())); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnStoreDebugLogsCompleted( 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& log_path, bool succeeded) { 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string status; 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (succeeded) 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = "Created log file: " + log_path.BaseName().AsUTF8Unsafe(); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = "Failed to create log file"; 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand("receivedStoreDebugLogs", 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value::CreateStringValue(status)); 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnSetNetworkDebugMode(const ListValue* list) { 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string subsystem; 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list->GetSize() != 1 || !list->GetString(0, &subsystem)) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()-> 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDebugMode( 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subsystem, 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted, 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AsWeakPtr(), 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subsystem)); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::OnSetNetworkDebugModeCompleted( 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& subsystem, 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded) { 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string status; 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (succeeded) 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = "Debug mode is changed to " + subsystem; 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status = "Failed to change debug mode to " + subsystem; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand("receivedSetNetworkDebugMode", 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value::CreateStringValue(status)); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnGetHttpPipeliningStatus( 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* list) { 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!list); 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* status_dict = new DictionaryValue(); 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpNetworkSession* http_network_session = 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHttpNetworkSession(GetMainContext()); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_dict->Set("pipelining_enabled", Value::CreateBooleanValue( 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session->params().http_pipelining_enabled)); 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* pipelined_connection_info = NULL; 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (http_network_session) { 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pipelined_connection_info = 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_network_session->http_stream_factory()->PipelineInfoToValue(); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_dict->Set("pipelined_connection_info", pipelined_connection_info); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpServerProperties& http_server_properties = 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *GetMainContext()->http_server_properties(); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(simonjam): This call is slow. 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::PipelineCapabilityMap pipeline_capability_map = 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_server_properties.GetPipelineCapabilityMap(); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue* known_hosts_list = new ListValue(); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::PipelineCapabilityMap::const_iterator it; 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (it = pipeline_capability_map.begin(); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != pipeline_capability_map.end(); ++it) { 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* host_dict = new DictionaryValue(); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_dict->SetString("host", it->first.ToString()); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string capability; 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (it->second) { 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case net::PIPELINE_CAPABLE: 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capability = "capable"; 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case net::PIPELINE_PROBABLY_CAPABLE: 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capability = "probably capable"; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case net::PIPELINE_INCAPABLE: 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capability = "incapable"; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case net::PIPELINE_UNKNOWN: 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capability = "unknown"; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_dict->SetString("capability", capability); 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) known_hosts_list->Append(host_dict); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_dict->Set("pipelined_host_info", known_hosts_list); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand("receivedHttpPipeliningStatus", status_dict); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnSetLogLevel( 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* list) { 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int log_level; 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string log_level_string; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!list->GetString(0, &log_level_string) || 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !base::StringToInt(log_level_string, &log_level)) { 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(log_level, net::NetLog::LOG_ALL); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LE(log_level, net::NetLog::LOG_BASIC); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log()->SetObserverLogLevel( 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, static_cast<net::NetLog::LogLevel>(log_level)); 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that unlike other methods of IOThreadImpl, this function 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can be called from ANY THREAD. 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnAddEntry( 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::NetLog::Entry& entry) { 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&IOThreadImpl::AddEntryToQueue, this, entry.ToValue())); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestSuite() { 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand("receivedStartConnectionTestSuite", NULL); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::OnStartConnectionTestExperiment( 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ConnectionTester::Experiment& experiment) { 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand( 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "receivedStartConnectionTestExperiment", 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExperimentToValue(experiment)); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestExperiment( 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ConnectionTester::Experiment& experiment, 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result) { 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dict = new DictionaryValue(); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->Set("experiment", ExperimentToValue(experiment)); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetInteger("result", result); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand( 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "receivedCompletedConnectionTestExperiment", 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsMessageHandler::IOThreadImpl::OnCompletedConnectionTestSuite() { 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand( 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "receivedCompletedConnectionTestSuite", 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this can be called from ANY THREAD. 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::SendJavascriptCommand( 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& command, 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* arg) { 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { 1746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (handler_.get() && !was_webui_deleted_) { 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We check |handler_| in case it was deleted on the UI thread earlier 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // while we were running on the IO thread. 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_->SendJavascriptCommand(command, arg); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete arg; 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!BrowserThread::PostTask( 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&IOThreadImpl::SendJavascriptCommand, this, command, arg))) { 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Failed posting the task, avoid leaking. 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete arg; 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::AddEntryToQueue(Value* entry) { 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pending_entries_.get()) { 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_entries_.reset(new ListValue()); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostDelayedTask( 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&IOThreadImpl::PostPendingEntries, this), 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kNetLogEventDelayMilliseconds)); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_entries_->Append(entry); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::PostPendingEntries() { 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pending_entries_.get()) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendJavascriptCommand("receivedLogEntries", pending_entries_.release()); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetInternalsMessageHandler::IOThreadImpl::PrePopulateEventList() { 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a set to prevent duplicates. 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<net::URLRequestContext*> contexts; 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ContextGetterList::const_iterator getter = context_getters_.begin(); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getter != context_getters_.end(); ++getter) { 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contexts.insert((*getter)->GetURLRequestContext()); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contexts.insert(io_thread_->globals()->proxy_script_fetcher_context.get()); 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contexts.insert(io_thread_->globals()->system_request_context.get()); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put together the list of all requests. 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const net::URLRequest*> requests; 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<net::URLRequestContext*>::const_iterator context = 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contexts.begin(); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context != contexts.end(); ++context) { 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<const net::URLRequest*>* context_requests = 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*context)->url_requests(); 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<const net::URLRequest*>::const_iterator request_it = 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_requests->begin(); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_it != context_requests->end(); ++request_it) { 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(io_thread_->net_log(), (*request_it)->net_log().net_log()); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.push_back(*request_it); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sort by creation time. 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(requests.begin(), requests.end(), RequestCreatedBefore); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create fake events. 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<const net::URLRequest*>::const_iterator request_it = 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requests.begin(); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_it != requests.end(); ++request_it) { 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLRequest* request = *request_it; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetLog::ParametersCallback callback = 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RequestStateToValue, base::Unretained(request)); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create and add the entry directly, to avoid sending it to any other 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetLog observers. 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetLog::Entry entry(net::NetLog::TYPE_REQUEST_ALIVE, 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->net_log().source(), 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetLog::PHASE_BEGIN, 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->creation_time(), 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &callback, 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->net_log().GetLogLevel()); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have to add |entry| to the queue synchronously, as there may already 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be posted tasks queued up to add other events for |request|, which we 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want |entry| to precede. 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddEntryToQueue(entry.ToValue()); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetInternalsUI 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Value* NetInternalsUI::GetConstants() { 1845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DictionaryValue* constants_dict = net::NetLogLogger::GetConstants(); 1846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(constants_dict); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a dictionary with the version of the client and its command line 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // arguments. 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dict = new DictionaryValue(); 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo version_info; 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!version_info.is_valid()) { 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Unable to create chrome::VersionInfo"; 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have everything we need to send the right values. 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString("name", version_info.Name()); 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString("version", version_info.Version()); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString("cl", version_info.LastChange()); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString("version_mod", 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::VersionInfo::GetVersionStringModifier()); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString("official", 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version_info.IsOfficialBuild() ? "official" : 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "unofficial"); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString("os_type", version_info.OSType()); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString("command_line", 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->GetCommandLineString()); 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) constants_dict->Set("clientInfo", dict); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return constants_dict; 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetInternalsUI::NetInternalsUI(content::WebUI* web_ui) 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : WebUIController(web_ui) { 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->AddMessageHandler(new NetInternalsMessageHandler()); 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the chrome://net-internals/ source. 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Add(profile, CreateNetInternalsHTMLSource()); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1886