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