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

Side by Side Diff: components/nacl/renderer/nexe_load_manager.cc

Issue 270453004: Pepper: Clean up ProgressEvent logic. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: probable crash fix Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/nacl/renderer/nexe_load_manager.h" 5 #include "components/nacl/renderer/nexe_load_manager.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/strings/string_tokenizer.h" 10 #include "base/strings/string_tokenizer.h"
11 #include "base/strings/string_util.h" 11 #include "base/strings/string_util.h"
12 #include "components/nacl/common/nacl_host_messages.h" 12 #include "components/nacl/common/nacl_host_messages.h"
13 #include "components/nacl/common/nacl_types.h" 13 #include "components/nacl/common/nacl_types.h"
14 #include "components/nacl/renderer/histogram.h" 14 #include "components/nacl/renderer/histogram.h"
15 #include "components/nacl/renderer/manifest_service_channel.h" 15 #include "components/nacl/renderer/manifest_service_channel.h"
16 #include "components/nacl/renderer/pnacl_translation_resource_host.h" 16 #include "components/nacl/renderer/pnacl_translation_resource_host.h"
17 #include "components/nacl/renderer/progress_event.h"
17 #include "components/nacl/renderer/sandbox_arch.h" 18 #include "components/nacl/renderer/sandbox_arch.h"
18 #include "components/nacl/renderer/trusted_plugin_channel.h" 19 #include "components/nacl/renderer/trusted_plugin_channel.h"
19 #include "content/public/common/content_client.h" 20 #include "content/public/common/content_client.h"
20 #include "content/public/common/content_switches.h" 21 #include "content/public/common/content_switches.h"
21 #include "content/public/common/sandbox_init.h" 22 #include "content/public/common/sandbox_init.h"
22 #include "content/public/renderer/pepper_plugin_instance.h" 23 #include "content/public/renderer/pepper_plugin_instance.h"
23 #include "content/public/renderer/render_thread.h" 24 #include "content/public/renderer/render_thread.h"
24 #include "content/public/renderer/render_view.h" 25 #include "content/public/renderer/render_view.h"
25 #include "content/public/renderer/renderer_ppapi_host.h" 26 #include "content/public/renderer/renderer_ppapi_host.h"
26 #include "ppapi/c/pp_bool.h" 27 #include "ppapi/c/pp_bool.h"
27 #include "ppapi/c/private/pp_file_handle.h" 28 #include "ppapi/c/private/pp_file_handle.h"
28 #include "ppapi/native_client/src/trusted/plugin/nacl_entry_points.h" 29 #include "ppapi/native_client/src/trusted/plugin/nacl_entry_points.h"
29 #include "ppapi/shared_impl/ppapi_globals.h" 30 #include "ppapi/shared_impl/ppapi_globals.h"
30 #include "ppapi/shared_impl/ppapi_permissions.h" 31 #include "ppapi/shared_impl/ppapi_permissions.h"
31 #include "ppapi/shared_impl/ppapi_preferences.h" 32 #include "ppapi/shared_impl/ppapi_preferences.h"
32 #include "ppapi/shared_impl/scoped_pp_var.h" 33 #include "ppapi/shared_impl/scoped_pp_var.h"
33 #include "ppapi/shared_impl/var.h" 34 #include "ppapi/shared_impl/var.h"
34 #include "ppapi/shared_impl/var_tracker.h" 35 #include "ppapi/shared_impl/var_tracker.h"
35 #include "ppapi/thunk/enter.h" 36 #include "ppapi/thunk/enter.h"
36 #include "third_party/WebKit/public/web/WebDOMResourceProgressEvent.h"
37 #include "third_party/WebKit/public/web/WebDocument.h" 37 #include "third_party/WebKit/public/web/WebDocument.h"
38 #include "third_party/WebKit/public/web/WebElement.h" 38 #include "third_party/WebKit/public/web/WebElement.h"
39 #include "third_party/WebKit/public/web/WebLocalFrame.h"
40 #include "third_party/WebKit/public/web/WebPluginContainer.h" 39 #include "third_party/WebKit/public/web/WebPluginContainer.h"
41 #include "third_party/WebKit/public/web/WebView.h" 40 #include "third_party/WebKit/public/web/WebView.h"
42 #include "v8/include/v8.h" 41 #include "v8/include/v8.h"
43 42
44 namespace { 43 namespace {
45 44
46 const char* const kTypeAttribute = "type"; 45 const char* const kTypeAttribute = "type";
47 // The "src" attribute of the <embed> tag. The value is expected to be either 46 // The "src" attribute of the <embed> tag. The value is expected to be either
48 // a URL or URI pointing to the manifest file (which is expected to contain 47 // a URL or URI pointing to the manifest file (which is expected to contain
49 // JSON matching ISAs with .nexe URLs). 48 // JSON matching ISAs with .nexe URLs).
50 const char* const kSrcManifestAttribute = "src"; 49 const char* const kSrcManifestAttribute = "src";
51 // The "nacl" attribute of the <embed> tag. We use the value of this attribute 50 // The "nacl" attribute of the <embed> tag. We use the value of this attribute
52 // to find the manifest file when NaCl is registered as a plug-in for another 51 // to find the manifest file when NaCl is registered as a plug-in for another
53 // MIME type because the "src" attribute is used to supply us with the resource 52 // MIME type because the "src" attribute is used to supply us with the resource
54 // of that MIME type that we're supposed to display. 53 // of that MIME type that we're supposed to display.
55 const char* const kNaClManifestAttribute = "nacl"; 54 const char* const kNaClManifestAttribute = "nacl";
56 // Define an argument name to enable 'dev' interfaces. To make sure it doesn't 55 // Define an argument name to enable 'dev' interfaces. To make sure it doesn't
57 // collide with any user-defined HTML attribute, make the first character '@'. 56 // collide with any user-defined HTML attribute, make the first character '@'.
58 const char* const kDevAttribute = "@dev"; 57 const char* const kDevAttribute = "@dev";
59 58
60 const char* const kNaClMIMEType = "application/x-nacl"; 59 const char* const kNaClMIMEType = "application/x-nacl";
61 const char* const kPNaClMIMEType = "application/x-pnacl"; 60 const char* const kPNaClMIMEType = "application/x-pnacl";
62 61
63 blink::WebString EventTypeToString(PP_NaClEventType event_type) {
64 switch (event_type) {
65 case PP_NACL_EVENT_LOADSTART:
66 return blink::WebString::fromUTF8("loadstart");
67 case PP_NACL_EVENT_PROGRESS:
68 return blink::WebString::fromUTF8("progress");
69 case PP_NACL_EVENT_ERROR:
70 return blink::WebString::fromUTF8("error");
71 case PP_NACL_EVENT_ABORT:
72 return blink::WebString::fromUTF8("abort");
73 case PP_NACL_EVENT_LOAD:
74 return blink::WebString::fromUTF8("load");
75 case PP_NACL_EVENT_LOADEND:
76 return blink::WebString::fromUTF8("loadend");
77 case PP_NACL_EVENT_CRASH:
78 return blink::WebString::fromUTF8("crash");
79 }
80 NOTIMPLEMENTED();
81 return blink::WebString();
82 }
83
84 static int GetRoutingID(PP_Instance instance) { 62 static int GetRoutingID(PP_Instance instance) {
85 // Check that we are on the main renderer thread. 63 // Check that we are on the main renderer thread.
86 DCHECK(content::RenderThread::Get()); 64 DCHECK(content::RenderThread::Get());
87 content::RendererPpapiHost *host = 65 content::RendererPpapiHost *host =
88 content::RendererPpapiHost::GetForPPInstance(instance); 66 content::RendererPpapiHost::GetForPPInstance(instance);
89 if (!host) 67 if (!host)
90 return 0; 68 return 0;
91 return host->GetRoutingIDForWidget(instance); 69 return host->GetRoutingIDForWidget(instance);
92 } 70 }
93 71
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 // TODO(dmichael): Can we avoid stashing away so much state? 139 // TODO(dmichael): Can we avoid stashing away so much state?
162 nexe_size_ = nexe_bytes_read; 140 nexe_size_ = nexe_bytes_read;
163 HistogramSizeKB("NaCl.Perf.Size.Nexe", 141 HistogramSizeKB("NaCl.Perf.Size.Nexe",
164 static_cast<int32_t>(nexe_size_ / 1024)); 142 static_cast<int32_t>(nexe_size_ / 1024));
165 HistogramStartupTimeMedium( 143 HistogramStartupTimeMedium(
166 "NaCl.Perf.StartupTime.NexeDownload", 144 "NaCl.Perf.StartupTime.NexeDownload",
167 base::TimeDelta::FromMilliseconds(time_since_open), 145 base::TimeDelta::FromMilliseconds(time_since_open),
168 nexe_size_); 146 nexe_size_);
169 147
170 // Inform JavaScript that we successfully downloaded the nacl module. 148 // Inform JavaScript that we successfully downloaded the nacl module.
171 ProgressEvent progress_event(pp_instance_, PP_NACL_EVENT_PROGRESS, url, 149 ProgressEvent progress_event(PP_NACL_EVENT_PROGRESS, url, true, nexe_size_,
172 true, nexe_size_, nexe_size_); 150 nexe_size_);
173 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 151 DispatchProgressEvent(pp_instance_, progress_event);
174 FROM_HERE,
175 base::Bind(&NexeLoadManager::DispatchEvent,
176 weak_factory_.GetWeakPtr(),
177 progress_event));
178
179 load_start_ = base::Time::Now(); 152 load_start_ = base::Time::Now();
180 } 153 }
181 } 154 }
182 155
183 void NexeLoadManager::ReportLoadSuccess(const std::string& url, 156 void NexeLoadManager::ReportLoadSuccess(const std::string& url,
184 uint64_t loaded_bytes, 157 uint64_t loaded_bytes,
185 uint64_t total_bytes) { 158 uint64_t total_bytes) {
186 ready_time_ = base::Time::Now(); 159 ready_time_ = base::Time::Now();
187 if (!IsPNaCl()) { 160 if (!IsPNaCl()) {
188 base::TimeDelta load_module_time = ready_time_ - load_start_; 161 base::TimeDelta load_module_time = ready_time_ - load_start_;
189 HistogramStartupTimeSmall( 162 HistogramStartupTimeSmall(
190 "NaCl.Perf.StartupTime.LoadModule", load_module_time, nexe_size_); 163 "NaCl.Perf.StartupTime.LoadModule", load_module_time, nexe_size_);
191 HistogramStartupTimeMedium( 164 HistogramStartupTimeMedium(
192 "NaCl.Perf.StartupTime.Total", ready_time_ - init_time_, nexe_size_); 165 "NaCl.Perf.StartupTime.Total", ready_time_ - init_time_, nexe_size_);
193 } 166 }
194 167
195 // Check that we are on the main renderer thread. 168 // Check that we are on the main renderer thread.
196 DCHECK(content::RenderThread::Get()); 169 DCHECK(content::RenderThread::Get());
197 set_nacl_ready_state(PP_NACL_READY_STATE_DONE); 170 set_nacl_ready_state(PP_NACL_READY_STATE_DONE);
198 171
199 // Inform JavaScript that loading was successful and is complete. 172 // Inform JavaScript that loading was successful and is complete.
200 ProgressEvent load_event(pp_instance_, PP_NACL_EVENT_LOAD, url, true, 173 ProgressEvent load_event(PP_NACL_EVENT_LOAD, url, true, loaded_bytes,
201 loaded_bytes, total_bytes); 174 total_bytes);
202 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 175 DispatchProgressEvent(pp_instance_, load_event);
203 FROM_HERE,
204 base::Bind(&NexeLoadManager::DispatchEvent,
205 weak_factory_.GetWeakPtr(),
206 load_event));
207 176
208 ProgressEvent loadend_event(pp_instance_, PP_NACL_EVENT_LOADEND, url, true, 177 ProgressEvent loadend_event(PP_NACL_EVENT_LOADEND, url, true, loaded_bytes,
209 loaded_bytes, total_bytes); 178 total_bytes);
210 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 179 DispatchProgressEvent(pp_instance_, loadend_event);
211 FROM_HERE,
212 base::Bind(&NexeLoadManager::DispatchEvent,
213 weak_factory_.GetWeakPtr(),
214 loadend_event));
215 180
216 // UMA 181 // UMA
217 HistogramEnumerateLoadStatus(PP_NACL_ERROR_LOAD_SUCCESS, is_installed_); 182 HistogramEnumerateLoadStatus(PP_NACL_ERROR_LOAD_SUCCESS, is_installed_);
218 } 183 }
219 184
220 void NexeLoadManager::ReportLoadError(PP_NaClError error, 185 void NexeLoadManager::ReportLoadError(PP_NaClError error,
221 const std::string& error_message) { 186 const std::string& error_message) {
222 ReportLoadError(error, error_message, error_message); 187 ReportLoadError(error, error_message, error_message);
223 } 188 }
224 189
(...skipping 13 matching lines...) Expand all
238 set_nacl_ready_state(PP_NACL_READY_STATE_DONE); 203 set_nacl_ready_state(PP_NACL_READY_STATE_DONE);
239 nexe_error_reported_ = true; 204 nexe_error_reported_ = true;
240 205
241 // We must set all properties before calling DispatchEvent so that when an 206 // We must set all properties before calling DispatchEvent so that when an
242 // event handler runs, the properties reflect the current load state. 207 // event handler runs, the properties reflect the current load state.
243 std::string error_string = std::string("NaCl module load failed: ") + 208 std::string error_string = std::string("NaCl module load failed: ") +
244 std::string(error_message); 209 std::string(error_message);
245 SetLastError(error_string); 210 SetLastError(error_string);
246 211
247 // Inform JavaScript that loading encountered an error and is complete. 212 // Inform JavaScript that loading encountered an error and is complete.
248 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 213 DispatchProgressEvent(pp_instance_, ProgressEvent(PP_NACL_EVENT_ERROR));
249 FROM_HERE, 214 DispatchProgressEvent(pp_instance_, ProgressEvent(PP_NACL_EVENT_LOADEND));
250 base::Bind(&NexeLoadManager::DispatchEvent,
251 weak_factory_.GetWeakPtr(),
252 ProgressEvent(PP_NACL_EVENT_ERROR)));
253
254 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
255 FROM_HERE,
256 base::Bind(&NexeLoadManager::DispatchEvent,
257 weak_factory_.GetWeakPtr(),
258 ProgressEvent(PP_NACL_EVENT_LOADEND)));
259 215
260 HistogramEnumerateLoadStatus(error, is_installed_); 216 HistogramEnumerateLoadStatus(error, is_installed_);
261 LogToConsole(console_message); 217 LogToConsole(console_message);
262 } 218 }
263 219
264 void NexeLoadManager::ReportLoadAbort() { 220 void NexeLoadManager::ReportLoadAbort() {
265 // Check that we are on the main renderer thread. 221 // Check that we are on the main renderer thread.
266 DCHECK(content::RenderThread::Get()); 222 DCHECK(content::RenderThread::Get());
267 223
268 // Set the readyState attribute to indicate we need to start over. 224 // Set the readyState attribute to indicate we need to start over.
269 set_nacl_ready_state(PP_NACL_READY_STATE_DONE); 225 set_nacl_ready_state(PP_NACL_READY_STATE_DONE);
270 nexe_error_reported_ = true; 226 nexe_error_reported_ = true;
271 227
272 // Report an error in lastError and on the JavaScript console. 228 // Report an error in lastError and on the JavaScript console.
273 std::string error_string("NaCl module load failed: user aborted"); 229 std::string error_string("NaCl module load failed: user aborted");
274 SetLastError(error_string); 230 SetLastError(error_string);
275 231
276 // Inform JavaScript that loading was aborted and is complete. 232 // Inform JavaScript that loading was aborted and is complete.
277 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 233 DispatchProgressEvent(pp_instance_, ProgressEvent(PP_NACL_EVENT_ABORT));
278 FROM_HERE, 234 DispatchProgressEvent(pp_instance_, ProgressEvent(PP_NACL_EVENT_LOADEND));
279 base::Bind(&NexeLoadManager::DispatchEvent,
280 weak_factory_.GetWeakPtr(),
281 ProgressEvent(PP_NACL_EVENT_ABORT)));
282
283 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
284 FROM_HERE,
285 base::Bind(&NexeLoadManager::DispatchEvent,
286 weak_factory_.GetWeakPtr(),
287 ProgressEvent(PP_NACL_EVENT_LOADEND)));
288 235
289 HistogramEnumerateLoadStatus(PP_NACL_ERROR_LOAD_ABORTED, is_installed_); 236 HistogramEnumerateLoadStatus(PP_NACL_ERROR_LOAD_ABORTED, is_installed_);
290 LogToConsole(error_string); 237 LogToConsole(error_string);
291 } 238 }
292 239
293 void NexeLoadManager::NexeDidCrash(const char* crash_log) { 240 void NexeLoadManager::NexeDidCrash(const char* crash_log) {
294 VLOG(1) << "Plugin::NexeDidCrash: crash event!"; 241 VLOG(1) << "Plugin::NexeDidCrash: crash event!";
295 // The NaCl module voluntarily exited. However, this is still a 242 // The NaCl module voluntarily exited. However, this is still a
296 // crash from the point of view of Pepper, since PPAPI plugins are 243 // crash from the point of view of Pepper, since PPAPI plugins are
297 // event handlers and should never exit. 244 // event handlers and should never exit.
(...skipping 16 matching lines...) Expand all
314 } 261 }
315 // In all cases, try to grab the crash log. The first error 262 // In all cases, try to grab the crash log. The first error
316 // reported may have come from the start_module RPC reply indicating 263 // reported may have come from the start_module RPC reply indicating
317 // a validation error or something similar, which wouldn't grab the 264 // a validation error or something similar, which wouldn't grab the
318 // crash log. In the event that this is called twice, the second 265 // crash log. In the event that this is called twice, the second
319 // invocation will just be a no-op, since the entire crash log will 266 // invocation will just be a no-op, since the entire crash log will
320 // have been received and we'll just get an EOF indication. 267 // have been received and we'll just get an EOF indication.
321 CopyCrashLogToJsConsole(crash_log); 268 CopyCrashLogToJsConsole(crash_log);
322 } 269 }
323 270
324 void NexeLoadManager::DispatchEvent(const ProgressEvent &event) {
325 blink::WebPluginContainer* container = plugin_instance_->GetContainer();
326 // It's possible that container() is NULL if the plugin has been removed from
327 // the DOM (but the PluginInstance is not destroyed yet).
328 if (!container)
329 return;
330 blink::WebLocalFrame* frame = container->element().document().frame();
331 if (!frame)
332 return;
333 v8::HandleScope handle_scope(plugin_instance_->GetIsolate());
334 v8::Local<v8::Context> context(
335 plugin_instance_->GetIsolate()->GetCurrentContext());
336 if (context.IsEmpty()) {
337 // If there's no JavaScript on the stack, we have to make a new Context.
338 context = v8::Context::New(plugin_instance_->GetIsolate());
339 }
340 v8::Context::Scope context_scope(context);
341
342 if (!event.resource_url.empty()) {
343 blink::WebString url_string = blink::WebString::fromUTF8(
344 event.resource_url.data(), event.resource_url.size());
345 blink::WebDOMResourceProgressEvent blink_event(
346 EventTypeToString(event.event_type),
347 event.length_is_computable,
348 event.loaded_bytes,
349 event.total_bytes,
350 url_string);
351 container->element().dispatchEvent(blink_event);
352 } else {
353 blink::WebDOMProgressEvent blink_event(EventTypeToString(event.event_type),
354 event.length_is_computable,
355 event.loaded_bytes,
356 event.total_bytes);
357 container->element().dispatchEvent(blink_event);
358 }
359 }
360
361 void NexeLoadManager::set_trusted_plugin_channel( 271 void NexeLoadManager::set_trusted_plugin_channel(
362 scoped_ptr<TrustedPluginChannel> channel) { 272 scoped_ptr<TrustedPluginChannel> channel) {
363 trusted_plugin_channel_ = channel.Pass(); 273 trusted_plugin_channel_ = channel.Pass();
364 } 274 }
365 275
366 void NexeLoadManager::set_manifest_service_channel( 276 void NexeLoadManager::set_manifest_service_channel(
367 scoped_ptr<ManifestServiceChannel> channel) { 277 scoped_ptr<ManifestServiceChannel> channel) {
368 manifest_service_channel_ = channel.Pass(); 278 manifest_service_channel_ = channel.Pass();
369 } 279 }
370 280
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 bool* is_data_uri) { 341 bool* is_data_uri) {
432 if (plugin_base_url_.is_valid()) { 342 if (plugin_base_url_.is_valid()) {
433 const GURL& resolved_url = plugin_base_url_.Resolve(url); 343 const GURL& resolved_url = plugin_base_url_.Resolve(url);
434 if (resolved_url.is_valid()) { 344 if (resolved_url.is_valid()) {
435 manifest_base_url_ = resolved_url; 345 manifest_base_url_ = resolved_url;
436 is_installed_ = manifest_base_url_.SchemeIs("chrome-extension"); 346 is_installed_ = manifest_base_url_.SchemeIs("chrome-extension");
437 *is_data_uri = manifest_base_url_.SchemeIs("data"); 347 *is_data_uri = manifest_base_url_.SchemeIs("data");
438 HistogramEnumerateManifestIsDataURI(*is_data_uri); 348 HistogramEnumerateManifestIsDataURI(*is_data_uri);
439 349
440 set_nacl_ready_state(PP_NACL_READY_STATE_OPENED); 350 set_nacl_ready_state(PP_NACL_READY_STATE_OPENED);
441 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 351 DispatchProgressEvent(pp_instance_,
442 FROM_HERE, 352 ProgressEvent(PP_NACL_EVENT_LOADSTART));
443 base::Bind(&NexeLoadManager::DispatchEvent,
444 weak_factory_.GetWeakPtr(),
445 ProgressEvent(PP_NACL_EVENT_LOADSTART)));
446 return true; 353 return true;
447 } 354 }
448 } 355 }
449 ReportLoadError(PP_NACL_ERROR_MANIFEST_RESOLVE_URL, 356 ReportLoadError(PP_NACL_ERROR_MANIFEST_RESOLVE_URL,
450 std::string("could not resolve URL \"") + url + 357 std::string("could not resolve URL \"") + url +
451 "\" relative to \"" + 358 "\" relative to \"" +
452 plugin_base_url_.possibly_invalid_spec() + "\"."); 359 plugin_base_url_.possibly_invalid_spec() + "\".");
453 return false; 360 return false;
454 } 361 }
455 362
456 void NexeLoadManager::ProcessNaClManifest(const std::string& program_url) { 363 void NexeLoadManager::ProcessNaClManifest(const std::string& program_url) {
457 GURL gurl(program_url); 364 GURL gurl(program_url);
458 DCHECK(gurl.is_valid()); 365 DCHECK(gurl.is_valid());
459 if (gurl.is_valid()) 366 if (gurl.is_valid())
460 is_installed_ = gurl.SchemeIs("chrome-extension"); 367 is_installed_ = gurl.SchemeIs("chrome-extension");
461 set_nacl_ready_state(PP_NACL_READY_STATE_LOADING); 368 set_nacl_ready_state(PP_NACL_READY_STATE_LOADING);
462 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 369 DispatchProgressEvent(pp_instance_, ProgressEvent(PP_NACL_EVENT_PROGRESS));
463 FROM_HERE,
464 base::Bind(&NexeLoadManager::DispatchEvent,
465 weak_factory_.GetWeakPtr(),
466 ProgressEvent(PP_NACL_EVENT_PROGRESS)));
467 } 370 }
468 371
469 std::string NexeLoadManager::GetManifestURLArgument() const { 372 std::string NexeLoadManager::GetManifestURLArgument() const {
470 std::string manifest_url; 373 std::string manifest_url;
471 374
472 // If the MIME type is foreign, then this NEXE is being used as a content 375 // If the MIME type is foreign, then this NEXE is being used as a content
473 // type handler rather than directly by an HTML document. 376 // type handler rather than directly by an HTML document.
474 bool nexe_is_content_handler = 377 bool nexe_is_content_handler =
475 !mime_type_.empty() && 378 !mime_type_.empty() &&
476 mime_type_ != kNaClMIMEType && 379 mime_type_ != kNaClMIMEType &&
(...skipping 30 matching lines...) Expand all
507 !nexe_error_reported_) { 410 !nexe_error_reported_) {
508 // Crashes will be more likely near startup, so use a medium histogram 411 // Crashes will be more likely near startup, so use a medium histogram
509 // instead of a large one. 412 // instead of a large one.
510 base::TimeDelta uptime = base::Time::Now() - ready_time_; 413 base::TimeDelta uptime = base::Time::Now() - ready_time_;
511 HistogramTimeMedium("NaCl.ModuleUptime.Crash", uptime.InMilliseconds()); 414 HistogramTimeMedium("NaCl.ModuleUptime.Crash", uptime.InMilliseconds());
512 415
513 std::string message("NaCl module crashed"); 416 std::string message("NaCl module crashed");
514 SetLastError(message); 417 SetLastError(message);
515 LogToConsole(message); 418 LogToConsole(message);
516 419
517 ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( 420 DispatchProgressEvent(pp_instance_, ProgressEvent(PP_NACL_EVENT_CRASH));
518 FROM_HERE,
519 base::Bind(&NexeLoadManager::DispatchEvent,
520 weak_factory_.GetWeakPtr(),
521 ProgressEvent(PP_NACL_EVENT_CRASH)));
522 nexe_error_reported_ = true; 421 nexe_error_reported_ = true;
523 } 422 }
524 // else ReportLoadError() and ReportLoadAbort() will be used by loading code 423 // else ReportLoadError() and ReportLoadAbort() will be used by loading code
525 // to provide error handling. 424 // to provide error handling.
526 } 425 }
527 426
528 void NexeLoadManager::CopyCrashLogToJsConsole(const std::string& crash_log) { 427 void NexeLoadManager::CopyCrashLogToJsConsole(const std::string& crash_log) {
529 base::StringTokenizer t(crash_log, "\n"); 428 base::StringTokenizer t(crash_log, "\n");
530 while (t.GetNext()) 429 while (t.GetNext())
531 LogToConsole(t.token()); 430 LogToConsole(t.token());
532 } 431 }
533 432
534 } // namespace nacl 433 } // namespace nacl
OLDNEW
« no previous file with comments | « components/nacl/renderer/nexe_load_manager.h ('k') | components/nacl/renderer/ppb_nacl_private_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698