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