1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/utility_process_host.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/values.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/utility_messages.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/indexed_db_key.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/serialized_script_value.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "ipc/ipc_switches.h" 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/skia/include/core/SkBitmap.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/ui_base_switches.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenUtilityProcessHost::UtilityProcessHost(Client* client, 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::ID client_thread_id) 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : BrowserChildProcessHost(UTILITY_PROCESS), 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch client_(client), 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick client_thread_id_(client_thread_id), 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick is_batch_mode_(false) { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUtilityProcessHost::~UtilityProcessHost() { 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(!is_batch_mode_); 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UtilityProcessHost::StartExtensionUnpacker(const FilePath& extension) { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Grant the subprocess access to the entire subdir the extension file is 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in, so that it can unpack to that dir. 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!StartProcess(extension.DirName())) 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Send(new UtilityMsg_UnpackExtension(extension)); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UtilityProcessHost::StartWebResourceUnpacker(const std::string& data) { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!StartProcess(FilePath())) 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Send(new UtilityMsg_UnpackWebResource(data)); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UtilityProcessHost::StartUpdateManifestParse(const std::string& xml) { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!StartProcess(FilePath())) 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Send(new UtilityMsg_ParseUpdateManifest(xml)); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UtilityProcessHost::StartImageDecoding( 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<unsigned char>& encoded_data) { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!StartProcess(FilePath())) 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Send(new UtilityMsg_DecodeImage(encoded_data)); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool UtilityProcessHost::StartImageDecodingBase64( 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& base64_encoded_data) { 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!StartProcess(FilePath())) 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Send(new UtilityMsg_DecodeImageBase64(base64_encoded_data)); 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool UtilityProcessHost::StartIDBKeysFromValuesAndKeyPath( 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int id, const std::vector<SerializedScriptValue>& serialized_values, 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16& key_path) { 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!StartProcess(FilePath())) 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return false; 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Send(new UtilityMsg_IDBKeysFromValuesAndKeyPath( 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick id, serialized_values, key_path)); 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool UtilityProcessHost::StartInjectIDBKey( 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const IndexedDBKey& key, const SerializedScriptValue& value, 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const string16& key_path) { 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!StartProcess(FilePath())) 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Send(new UtilityMsg_InjectIDBKey(key, value, key_path)); 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool UtilityProcessHost::StartJSONParsing(const std::string& json) { 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!StartProcess(FilePath())) 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Send(new UtilityMsg_ParseJSON(json)); 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool UtilityProcessHost::StartBatchMode() { 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CHECK(!is_batch_mode_); 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick is_batch_mode_ = StartProcess(FilePath()); 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Send(new UtilityMsg_BatchMode_Started()); 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return is_batch_mode_; 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid UtilityProcessHost::EndBatchMode() { 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CHECK(is_batch_mode_); 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick is_batch_mode_ = false; 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Send(new UtilityMsg_BatchMode_Finished()); 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath UtilityProcessHost::GetUtilityProcessCmd() { 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return GetChildPath(true); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UtilityProcessHost::StartProcess(const FilePath& exposed_dir) { 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (is_batch_mode_) 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Name must be set or metrics_service will crash in any test which 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // launches a UtilityProcessHost. 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_name(L"utility process"); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CreateChannel()) 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath exe_path = GetUtilityProcessCmd(); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (exe_path.empty()) { 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Unable to get utility process binary name."; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CommandLine* cmd_line = new CommandLine(exe_path); 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cmd_line->AppendSwitchASCII(switches::kProcessType, 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick switches::kUtilityProcess); 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id()); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string locale = g_browser_process->GetApplicationLocale(); 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cmd_line->AppendSwitchASCII(switches::kLang, locale); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCrashReporterCommandLine(cmd_line); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser_command_line.HasSwitch(switches::kChromeFrame)) 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cmd_line->AppendSwitch(switches::kChromeFrame); 149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (browser_command_line.HasSwitch(switches::kNoSandbox)) 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cmd_line->AppendSwitch(switches::kNoSandbox); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser_command_line.HasSwitch( 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switches::kEnableExperimentalExtensionApis)) { 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cmd_line->AppendSwitch(switches::kEnableExperimentalExtensionApis); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_POSIX) 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(port): Sandbox this on Linux. Also, zygote this to work with 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Linux updating. 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_cmd_prefix = browser_command_line.HasSwitch( 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switches::kUtilityCmdPrefix); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (has_cmd_prefix) { 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // launch the utility child process with some prefix (usually "xterm -e gdb 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // --args"). 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cmd_line->PrependWrapper(browser_command_line.GetSwitchValueNative( 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switches::kUtilityCmdPrefix)); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cmd_line->AppendSwitchPath(switches::kUtilityProcessAllowedDir, exposed_dir); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Launch( 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch exposed_dir, 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_POSIX) 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false, 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::environment_vector(), 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cmd_line); 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool UtilityProcessHost::OnMessageReceived(const IPC::Message& message) { 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch client_thread_id_, FROM_HERE, 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(client_.get(), &Client::OnMessageReceived, message)); 18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid UtilityProcessHost::OnProcessCrashed(int exit_code) { 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch client_thread_id_, FROM_HERE, 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NewRunnableMethod(client_.get(), &Client::OnProcessCrashed, exit_code)); 19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool UtilityProcessHost::CanShutdown() { 19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool UtilityProcessHost::Client::OnMessageReceived( 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const IPC::Message& message) { 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool handled = true; 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_BEGIN_MESSAGE_MAP(UtilityProcessHost, message) 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_UnpackExtension_Succeeded, 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnUnpackExtensionSucceeded) 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_UnpackExtension_Failed, 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnUnpackExtensionFailed) 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_UnpackWebResource_Succeeded, 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnUnpackWebResourceSucceeded) 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_UnpackWebResource_Failed, 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnUnpackWebResourceFailed) 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_ParseUpdateManifest_Succeeded, 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnParseUpdateManifestSucceeded) 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_ParseUpdateManifest_Failed, 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnParseUpdateManifestFailed) 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_DecodeImage_Succeeded, 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnDecodeImageSucceeded) 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_MESSAGE_HANDLER(UtilityHostMsg_DecodeImage_Failed, 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client::OnDecodeImageFailed) 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IPC_MESSAGE_HANDLER(UtilityHostMsg_IDBKeysFromValuesAndKeyPath_Succeeded, 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Client::OnIDBKeysFromValuesAndKeyPathSucceeded) 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IPC_MESSAGE_HANDLER(UtilityHostMsg_IDBKeysFromValuesAndKeyPath_Failed, 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Client::OnIDBKeysFromValuesAndKeyPathFailed) 225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC_MESSAGE_HANDLER(UtilityHostMsg_InjectIDBKey_Finished, 226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Client::OnInjectIDBKeyFinished) 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(UtilityHostMsg_ParseJSON_Succeeded, 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Client::OnJSONParseSucceeded) 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(UtilityHostMsg_ParseJSON_Failed, 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Client::OnJSONParseFailed) 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IPC_MESSAGE_UNHANDLED(handled = false) 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC_END_MESSAGE_MAP_EX() 23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return handled; 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 235