| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/common/child_process_info.h" | |
| 6 | |
| 7 #include <limits> | |
| 8 | |
| 9 #include "base/atomicops.h" | |
| 10 #include "base/i18n/rtl.h" | |
| 11 #include "base/logging.h" | |
| 12 #include "base/process_util.h" | |
| 13 #include "base/rand_util.h" | |
| 14 #include "base/string_util.h" | |
| 15 #include "base/utf_string_conversions.h" | |
| 16 #include "grit/generated_resources.h" | |
| 17 #include "ui/base/l10n/l10n_util.h" | |
| 18 | |
| 19 ChildProcessInfo::ChildProcessInfo(ProcessType type, int id) : | |
| 20 type_(type), | |
| 21 renderer_type_(RENDERER_UNKNOWN) { | |
| 22 if (id == -1) | |
| 23 id_ = GenerateChildProcessUniqueId(); | |
| 24 else | |
| 25 id_ = id; | |
| 26 } | |
| 27 | |
| 28 ChildProcessInfo::ChildProcessInfo(const ChildProcessInfo& original) | |
| 29 : type_(original.type_), | |
| 30 renderer_type_(original.renderer_type_), | |
| 31 name_(original.name_), | |
| 32 version_(original.version_), | |
| 33 id_(original.id_), | |
| 34 process_(original.process_) { | |
| 35 } | |
| 36 | |
| 37 ChildProcessInfo::~ChildProcessInfo() { | |
| 38 } | |
| 39 | |
| 40 ChildProcessInfo& ChildProcessInfo::operator=( | |
| 41 const ChildProcessInfo& original) { | |
| 42 if (&original != this) { | |
| 43 type_ = original.type_; | |
| 44 renderer_type_ = original.renderer_type_; | |
| 45 name_ = original.name_; | |
| 46 version_ = original.version_; | |
| 47 id_ = original.id_; | |
| 48 process_ = original.process_; | |
| 49 } | |
| 50 return *this; | |
| 51 } | |
| 52 | |
| 53 // static | |
| 54 std::string ChildProcessInfo::GetTypeNameInEnglish( | |
| 55 ChildProcessInfo::ProcessType type) { | |
| 56 switch (type) { | |
| 57 case BROWSER_PROCESS: | |
| 58 return "Browser"; | |
| 59 case RENDER_PROCESS: | |
| 60 return "Tab"; | |
| 61 case PLUGIN_PROCESS: | |
| 62 return "Plug-in"; | |
| 63 case WORKER_PROCESS: | |
| 64 return "Web Worker"; | |
| 65 case UTILITY_PROCESS: | |
| 66 return "Utility"; | |
| 67 case PROFILE_IMPORT_PROCESS: | |
| 68 return "Profile Import helper"; | |
| 69 case ZYGOTE_PROCESS: | |
| 70 return "Zygote"; | |
| 71 case SANDBOX_HELPER_PROCESS: | |
| 72 return "Sandbox helper"; | |
| 73 case NACL_LOADER_PROCESS: | |
| 74 return "Native Client module"; | |
| 75 case NACL_BROKER_PROCESS: | |
| 76 return "Native Client broker"; | |
| 77 case GPU_PROCESS: | |
| 78 return "GPU"; | |
| 79 case PPAPI_PLUGIN_PROCESS: | |
| 80 return "Pepper Plugin"; | |
| 81 case UNKNOWN_PROCESS: | |
| 82 default: | |
| 83 DCHECK(false) << "Unknown child process type!"; | |
| 84 return "Unknown"; | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 // static | |
| 89 std::string ChildProcessInfo::GetRendererTypeNameInEnglish( | |
| 90 ChildProcessInfo::RendererProcessType type) { | |
| 91 switch (type) { | |
| 92 case RENDERER_NORMAL: | |
| 93 return "Tab"; | |
| 94 case RENDERER_CHROME: | |
| 95 return "Tab (Chrome)"; | |
| 96 case RENDERER_EXTENSION: | |
| 97 return "Extension"; | |
| 98 case RENDERER_DEVTOOLS: | |
| 99 return "Devtools"; | |
| 100 case RENDERER_INTERSTITIAL: | |
| 101 return "Interstitial"; | |
| 102 case RENDERER_NOTIFICATION: | |
| 103 return "Notification"; | |
| 104 case RENDERER_BACKGROUND_APP: | |
| 105 return "Background App"; | |
| 106 case RENDERER_UNKNOWN: | |
| 107 default: | |
| 108 NOTREACHED() << "Unknown renderer process type!"; | |
| 109 return "Unknown"; | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 // static | |
| 114 std::string ChildProcessInfo::GetFullTypeNameInEnglish( | |
| 115 ChildProcessInfo::ProcessType type, | |
| 116 ChildProcessInfo::RendererProcessType rtype) { | |
| 117 if (type == RENDER_PROCESS) | |
| 118 return GetRendererTypeNameInEnglish(rtype); | |
| 119 return GetTypeNameInEnglish(type); | |
| 120 } | |
| 121 | |
| 122 | |
| 123 string16 ChildProcessInfo::GetLocalizedTitle() const { | |
| 124 string16 title = WideToUTF16Hack(name_); | |
| 125 if (type_ == ChildProcessInfo::PLUGIN_PROCESS && title.empty()) | |
| 126 title = l10n_util::GetStringUTF16(IDS_TASK_MANAGER_UNKNOWN_PLUGIN_NAME); | |
| 127 | |
| 128 // Explicitly mark name as LTR if there is no strong RTL character, | |
| 129 // to avoid the wrong concatenation result similar to "!Yahoo! Mail: the | |
| 130 // best web-based Email: NIGULP", in which "NIGULP" stands for the Hebrew | |
| 131 // or Arabic word for "plugin". | |
| 132 base::i18n::AdjustStringForLocaleDirection(&title); | |
| 133 | |
| 134 switch (type_) { | |
| 135 case ChildProcessInfo::UTILITY_PROCESS: | |
| 136 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_UTILITY_PREFIX); | |
| 137 | |
| 138 case ChildProcessInfo::PROFILE_IMPORT_PROCESS: | |
| 139 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_UTILITY_PREFIX); | |
| 140 | |
| 141 case ChildProcessInfo::GPU_PROCESS: | |
| 142 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_GPU_PREFIX); | |
| 143 | |
| 144 case ChildProcessInfo::NACL_BROKER_PROCESS: | |
| 145 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NACL_BROKER_PREFIX); | |
| 146 | |
| 147 case ChildProcessInfo::PLUGIN_PROCESS: | |
| 148 case ChildProcessInfo::PPAPI_PLUGIN_PROCESS: | |
| 149 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PLUGIN_PREFIX, | |
| 150 title, | |
| 151 WideToUTF16Hack(version_)); | |
| 152 | |
| 153 case ChildProcessInfo::NACL_LOADER_PROCESS: | |
| 154 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_NACL_PREFIX, title); | |
| 155 | |
| 156 case ChildProcessInfo::WORKER_PROCESS: | |
| 157 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_WORKER_PREFIX, title); | |
| 158 | |
| 159 // These types don't need display names or get them from elsewhere. | |
| 160 case BROWSER_PROCESS: | |
| 161 case RENDER_PROCESS: | |
| 162 case ZYGOTE_PROCESS: | |
| 163 case SANDBOX_HELPER_PROCESS: | |
| 164 NOTREACHED(); | |
| 165 break; | |
| 166 | |
| 167 case UNKNOWN_PROCESS: | |
| 168 NOTREACHED() << "Need localized name for child process type."; | |
| 169 } | |
| 170 | |
| 171 return title; | |
| 172 } | |
| 173 | |
| 174 std::string ChildProcessInfo::GenerateRandomChannelID(void* instance) { | |
| 175 // Note: the string must start with the current process id, this is how | |
| 176 // child processes determine the pid of the parent. | |
| 177 // Build the channel ID. This is composed of a unique identifier for the | |
| 178 // parent browser process, an identifier for the child instance, and a random | |
| 179 // component. We use a random component so that a hacked child process can't | |
| 180 // cause denial of service by causing future named pipe creation to fail. | |
| 181 return base::StringPrintf("%d.%p.%d", | |
| 182 base::GetCurrentProcId(), instance, | |
| 183 base::RandInt(0, std::numeric_limits<int>::max())); | |
| 184 } | |
| 185 | |
| 186 // static | |
| 187 int ChildProcessInfo::GenerateChildProcessUniqueId() { | |
| 188 // This function must be threadsafe. | |
| 189 static base::subtle::Atomic32 last_unique_child_id = 0; | |
| 190 return base::subtle::NoBarrier_AtomicIncrement(&last_unique_child_id, 1); | |
| 191 } | |
| OLD | NEW |