Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: chrome/browser/web_resource/json_asynchronous_unpacker.cc

Issue 10690096: Extracted inner class doing process dispatch. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Adding comment. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2012 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/browser/web_resource/json_asynchronous_unpacker.h"
6
7 #include "base/command_line.h"
8 #include "chrome/browser/web_resource/web_resource_service.h"
9 #include "chrome/common/chrome_switches.h"
10 #include "chrome/common/chrome_utility_messages.h"
11 #include "chrome/common/web_resource/web_resource_unpacker.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/resource_dispatcher_host.h"
14 #include "content/public/browser/utility_process_host.h"
15 #include "content/public/browser/utility_process_host_client.h"
16
17 using content::BrowserThread;
18 using content::UtilityProcessHost;
19 using content::UtilityProcessHostClient;
20
21 // This class coordinates a web resource unpack and parse task which is run in
22 // a separate process. Results are sent back to this class and routed to
23 // the WebResourceService.
24 class JSONAsynchronousUnpackerImpl
25 : public UtilityProcessHostClient,
26 public JSONAsynchronousUnpacker {
27 public:
28 explicit JSONAsynchronousUnpackerImpl(
29 JSONAsynchronousUnpackerDelegate* delegate)
30 : JSONAsynchronousUnpacker(delegate),
31 got_response_(false) {
32 }
33
34 void Start(const std::string& json_data) {
35 AddRef(); // balanced in Cleanup.
36
37 // TODO(willchan): Look for a better signal of whether we're in a unit test
38 // or not. Using |ResourceDispatcherHost::Get()| for this is pretty lame.
39 // If we don't have a ResourceDispatcherHost, assume we're in a test and
40 // run the unpacker directly in-process.
41 bool use_utility_process =
42 content::ResourceDispatcherHost::Get() &&
43 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess);
44 if (use_utility_process) {
45 BrowserThread::ID thread_id;
46 CHECK(BrowserThread::GetCurrentThreadIdentifier(&thread_id));
47 BrowserThread::PostTask(
48 BrowserThread::IO, FROM_HERE,
49 base::Bind(
50 &JSONAsynchronousUnpackerImpl::StartProcessOnIOThread,
51 this, thread_id, json_data));
52 } else {
53 WebResourceUnpacker unpacker(json_data);
54 if (unpacker.Run()) {
55 OnUnpackWebResourceSucceeded(*unpacker.parsed_json());
56 } else {
57 OnUnpackWebResourceFailed(unpacker.error_message());
58 }
59 }
60 }
61
62 private:
63 virtual ~JSONAsynchronousUnpackerImpl() {}
64
65 // UtilityProcessHostClient.
66 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
67 bool handled = true;
68 IPC_BEGIN_MESSAGE_MAP(JSONAsynchronousUnpackerImpl, message)
69 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_UnpackWebResource_Succeeded,
70 OnUnpackWebResourceSucceeded)
71 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_UnpackWebResource_Failed,
72 OnUnpackWebResourceFailed)
73 IPC_MESSAGE_UNHANDLED(handled = false)
74 IPC_END_MESSAGE_MAP()
75 return handled;
76 }
77
78 virtual void OnProcessCrashed(int exit_code) OVERRIDE {
79 if (got_response_)
80 return;
81
82 OnUnpackWebResourceFailed(
83 "Utility process crashed while trying to retrieve web resources.");
84 }
85
86 void OnUnpackWebResourceSucceeded(
87 const DictionaryValue& parsed_json) {
88 if (delegate_)
89 delegate_->OnUnpackFinished(parsed_json);
90 Cleanup();
91 }
92
93 void OnUnpackWebResourceFailed(const std::string& error_message) {
94 if (delegate_)
95 delegate_->OnUnpackError(error_message);
96 Cleanup();
97 }
98
99 // Release reference and set got_response_.
100 void Cleanup() {
101 DCHECK(!got_response_);
102 got_response_ = true;
103 Release();
104 }
105
106 void StartProcessOnIOThread(BrowserThread::ID thread_id,
107 const std::string& json_data) {
108 UtilityProcessHost* host = UtilityProcessHost::Create(this, thread_id);
109 host->EnableZygote();
110 // TODO(mrc): get proper file path when we start using web resources
111 // that need to be unpacked.
112 host->Send(new ChromeUtilityMsg_UnpackWebResource(json_data));
113 }
114
115 // True if we got a response from the utility process and have cleaned up
116 // already.
117 bool got_response_;
118 };
119
120 JSONAsynchronousUnpacker* JSONAsynchronousUnpacker::Create(
121 JSONAsynchronousUnpackerDelegate* delegate) {
122 return new JSONAsynchronousUnpackerImpl(delegate);
123 }
124
OLDNEW
« no previous file with comments | « chrome/browser/web_resource/json_asynchronous_unpacker.h ('k') | chrome/browser/web_resource/notification_promo.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698