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

Side by Side Diff: chrome/browser/ui/extensions/shell_window.cc

Issue 12210107: Fix issue 174250, crash when reloading packaged app. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: comments Created 7 years, 10 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 "chrome/browser/ui/extensions/shell_window.h" 5 #include "chrome/browser/ui/extensions/shell_window.h"
6 6
7 #include "base/utf_string_conversions.h" 7 #include "base/utf_string_conversions.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "chrome/browser/extensions/extension_process_manager.h" 9 #include "chrome/browser/extensions/extension_process_manager.h"
10 #include "chrome/browser/extensions/extension_system.h" 10 #include "chrome/browser/extensions/extension_system.h"
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 242
243 ShellWindow::~ShellWindow() { 243 ShellWindow::~ShellWindow() {
244 // Unregister now to prevent getting NOTIFICATION_APP_TERMINATING if we're the 244 // Unregister now to prevent getting NOTIFICATION_APP_TERMINATING if we're the
245 // last window open. 245 // last window open.
246 registrar_.RemoveAll(); 246 registrar_.RemoveAll();
247 247
248 // Remove shutdown prevention. 248 // Remove shutdown prevention.
249 chrome::EndKeepAlive(); 249 chrome::EndKeepAlive();
250 } 250 }
251 251
252 void ShellWindow::Close() {
253 extensions::ShellWindowRegistry::Get(profile_)->RemoveShellWindow(this);
254 native_app_window_->Close();
255 }
256
252 void ShellWindow::RequestMediaAccessPermission( 257 void ShellWindow::RequestMediaAccessPermission(
253 content::WebContents* web_contents, 258 content::WebContents* web_contents,
254 const content::MediaStreamRequest& request, 259 const content::MediaStreamRequest& request,
255 const content::MediaResponseCallback& callback) { 260 const content::MediaResponseCallback& callback) {
256 // Get the preferred default devices for the request. 261 // Get the preferred default devices for the request.
257 content::MediaStreamDevices devices; 262 content::MediaStreamDevices devices;
258 MediaCaptureDevicesDispatcher::GetInstance()->GetDefaultDevicesForProfile( 263 MediaCaptureDevicesDispatcher::GetInstance()->GetDefaultDevicesForProfile(
259 profile_, 264 profile_,
260 content::IsAudioMediaType(request.audio_type), 265 content::IsAudioMediaType(request.audio_type),
261 content::IsVideoMediaType(request.video_type), 266 content::IsVideoMediaType(request.video_type),
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 bool last_unlocked_by_target) { 346 bool last_unlocked_by_target) {
342 bool has_permission = IsExtensionWithPermissionOrSuggestInConsole( 347 bool has_permission = IsExtensionWithPermissionOrSuggestInConsole(
343 APIPermission::kPointerLock, 348 APIPermission::kPointerLock,
344 extension_, 349 extension_,
345 web_contents->GetRenderViewHost()); 350 web_contents->GetRenderViewHost());
346 351
347 web_contents->GotResponseToLockMouseRequest(has_permission); 352 web_contents->GotResponseToLockMouseRequest(has_permission);
348 } 353 }
349 354
350 void ShellWindow::OnNativeClose() { 355 void ShellWindow::OnNativeClose() {
356 // This method is shared between the path for the user clicking the close
357 // button and the path where a close is triggered by code (e.g. by the
358 // extension being unloaded). In the latter case, this RemoveShellWindow is
359 // superfluous, since it will already have been removed, but the call is
360 // idempotent so it's harmless the second time.
351 extensions::ShellWindowRegistry::Get(profile_)->RemoveShellWindow(this); 361 extensions::ShellWindowRegistry::Get(profile_)->RemoveShellWindow(this);
352 content::RenderViewHost* rvh = web_contents_->GetRenderViewHost(); 362 if (extension_) {
353 rvh->Send(new ExtensionMsg_AppWindowClosed(rvh->GetRoutingID())); 363 content::RenderViewHost* rvh = web_contents_->GetRenderViewHost();
364 rvh->Send(new ExtensionMsg_AppWindowClosed(rvh->GetRoutingID()));
365 }
354 delete this; 366 delete this;
355 } 367 }
356 368
357 void ShellWindow::OnNativeWindowChanged() { 369 void ShellWindow::OnNativeWindowChanged() {
358 SaveWindowPosition(); 370 SaveWindowPosition();
359 if (!native_app_window_ || !web_contents_) 371 if (!native_app_window_ || !web_contents_)
360 return; 372 return;
361 ListValue args; 373 ListValue args;
362 DictionaryValue* dictionary = new DictionaryValue(); 374 DictionaryValue* dictionary = new DictionaryValue();
363 args.Append(dictionary); 375 args.Append(dictionary);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 extension(), 497 extension(),
486 extension()->GetIconResource(kPreferredIconSize, 498 extension()->GetIconResource(kPreferredIconSize,
487 ExtensionIconSet::MATCH_BIGGER), 499 ExtensionIconSet::MATCH_BIGGER),
488 gfx::Size(kPreferredIconSize, kPreferredIconSize), 500 gfx::Size(kPreferredIconSize, kPreferredIconSize),
489 base::Bind(&ShellWindow::OnImageLoaded, 501 base::Bind(&ShellWindow::OnImageLoaded,
490 image_loader_ptr_factory_.GetWeakPtr())); 502 image_loader_ptr_factory_.GetWeakPtr()));
491 } 503 }
492 504
493 void ShellWindow::CloseContents(WebContents* contents) { 505 void ShellWindow::CloseContents(WebContents* contents) {
494 DCHECK(contents == web_contents_); 506 DCHECK(contents == web_contents_);
495 native_app_window_->Close(); 507 Close();
496 } 508 }
497 509
498 bool ShellWindow::ShouldSuppressDialogs() { 510 bool ShellWindow::ShouldSuppressDialogs() {
499 return true; 511 return true;
500 } 512 }
501 513
502 void ShellWindow::WebIntentDispatch( 514 void ShellWindow::WebIntentDispatch(
503 content::WebContents* web_contents, 515 content::WebContents* web_contents,
504 content::WebIntentsDispatcher* intents_dispatcher) { 516 content::WebIntentsDispatcher* intents_dispatcher) {
505 #if defined(ENABLE_WEB_INTENTS) 517 #if defined(ENABLE_WEB_INTENTS)
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 // TODO(jianli): once http://crbug.com/123007 is fixed, we'll no longer 578 // TODO(jianli): once http://crbug.com/123007 is fixed, we'll no longer
567 // need to make the native window (ShellWindowViews specially) update 579 // need to make the native window (ShellWindowViews specially) update
568 // the clickthrough region for the new RVH. 580 // the clickthrough region for the new RVH.
569 native_app_window_->RenderViewHostChanged(); 581 native_app_window_->RenderViewHostChanged();
570 break; 582 break;
571 } 583 }
572 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { 584 case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
573 const extensions::Extension* unloaded_extension = 585 const extensions::Extension* unloaded_extension =
574 content::Details<extensions::UnloadedExtensionInfo>( 586 content::Details<extensions::UnloadedExtensionInfo>(
575 details)->extension; 587 details)->extension;
576 if (extension_ == unloaded_extension) 588 if (extension_ == unloaded_extension) {
577 native_app_window_->Close(); 589 Close();
590 // After this notification finishes processing, the Extension will be
591 // deleted, so we null out our reference to avoid bad access.
592 extension_ = NULL;
593 }
578 break; 594 break;
579 } 595 }
580 case chrome::NOTIFICATION_APP_TERMINATING: 596 case chrome::NOTIFICATION_APP_TERMINATING:
581 native_app_window_->Close(); 597 Close();
582 break; 598 break;
583 default: 599 default:
584 NOTREACHED() << "Received unexpected notification"; 600 NOTREACHED() << "Received unexpected notification";
585 } 601 }
586 } 602 }
587 603
588 extensions::WindowController* 604 extensions::WindowController*
589 ShellWindow::GetExtensionWindowController() const { 605 ShellWindow::GetExtensionWindowController() const {
590 return NULL; 606 return NULL;
591 } 607 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 const extensions::DraggableRegion& region = *iter; 652 const extensions::DraggableRegion& region = *iter;
637 sk_region->op( 653 sk_region->op(
638 region.bounds.x(), 654 region.bounds.x(),
639 region.bounds.y(), 655 region.bounds.y(),
640 region.bounds.right(), 656 region.bounds.right(),
641 region.bounds.bottom(), 657 region.bounds.bottom(),
642 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); 658 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op);
643 } 659 }
644 return sk_region; 660 return sk_region;
645 } 661 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/extensions/shell_window.h ('k') | chrome/browser/ui/gtk/extensions/native_app_window_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698