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

Side by Side Diff: chrome/browser/renderer_host/render_widget_host_view_mac.mm

Issue 155021: Fix problems with render_widget_host_ being deleted out-of-sync with cocoa_view_. (Closed)
Patch Set: Style fix. Created 11 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
« no previous file with comments | « chrome/browser/renderer_host/render_widget_host_view_mac.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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/renderer_host/render_widget_host_view_mac.h" 5 #include "chrome/browser/renderer_host/render_widget_host_view_mac.h"
6 6
7 #include "base/histogram.h" 7 #include "base/histogram.h"
8 #include "base/sys_string_conversions.h" 8 #include "base/sys_string_conversions.h"
9 #include "chrome/browser/browser_trial.h" 9 #include "chrome/browser/browser_trial.h"
10 #import "chrome/browser/cocoa/rwhvm_editcommand_helper.h" 10 #import "chrome/browser/cocoa/rwhvm_editcommand_helper.h"
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 // TODO(darin): keep this around, and draw sad-tab into it. 249 // TODO(darin): keep this around, and draw sad-tab into it.
250 UpdateCursorIfOverSelf(); 250 UpdateCursorIfOverSelf();
251 Destroy(); 251 Destroy();
252 } 252 }
253 253
254 void RenderWidgetHostViewMac::Destroy() { 254 void RenderWidgetHostViewMac::Destroy() {
255 // We've been told to destroy. 255 // We've been told to destroy.
256 [cocoa_view_ retain]; 256 [cocoa_view_ retain];
257 [cocoa_view_ removeFromSuperview]; 257 [cocoa_view_ removeFromSuperview];
258 [cocoa_view_ autorelease]; 258 [cocoa_view_ autorelease];
259
260 // We get this call just before |render_widget_host_| deletes
261 // itself. But we are owned by |cocoa_view_|, which may be retained
262 // by some other code. Examples are TabContentsViewMac's
263 // |latent_focus_view_| and TabWindowController's
264 // |cachedContentView_|.
265 render_widget_host_ = NULL;
259 } 266 }
260 267
261 // Called from the renderer to tell us what the tooltip text should be. It 268 // Called from the renderer to tell us what the tooltip text should be. It
262 // calls us frequently so we need to cache the value to prevent doing a lot 269 // calls us frequently so we need to cache the value to prevent doing a lot
263 // of repeat work. We cannot simply use [-NSView setToolTip:] because NSView 270 // of repeat work. We cannot simply use [-NSView setToolTip:] because NSView
264 // can't handle the case where the tooltip text changes while the mouse is 271 // can't handle the case where the tooltip text changes while the mouse is
265 // still inside the view. Since the page elements that get tooltips are all 272 // still inside the view. Since the page elements that get tooltips are all
266 // contained within this view (and are unknown to the NSView system), we 273 // contained within this view (and are unknown to the NSView system), we
267 // are forced to implement our own tooltips with child windows. 274 // are forced to implement our own tooltips with child windows.
268 // TODO(pinkerton): Do we want these tooltips to time out after a certain time? 275 // TODO(pinkerton): Do we want these tooltips to time out after a certain time?
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 canBeKeyView_ = can; 395 canBeKeyView_ = can;
389 } 396 }
390 397
391 - (void)setCloseOnDeactivate:(BOOL)b { 398 - (void)setCloseOnDeactivate:(BOOL)b {
392 closeOnDeactivate_ = b; 399 closeOnDeactivate_ = b;
393 } 400 }
394 401
395 - (void)mouseEvent:(NSEvent *)theEvent { 402 - (void)mouseEvent:(NSEvent *)theEvent {
396 const WebMouseEvent& event = 403 const WebMouseEvent& event =
397 WebInputEventFactory::mouseEvent(theEvent, self); 404 WebInputEventFactory::mouseEvent(theEvent, self);
398 renderWidgetHostView_->render_widget_host_->ForwardMouseEvent(event); 405 if (renderWidgetHostView_->render_widget_host_)
406 renderWidgetHostView_->render_widget_host_->ForwardMouseEvent(event);
399 } 407 }
400 408
401 - (void)keyEvent:(NSEvent *)theEvent { 409 - (void)keyEvent:(NSEvent *)theEvent {
402 // TODO(avi): Possibly kill self? See RenderWidgetHostViewWin::OnKeyEvent and 410 // TODO(avi): Possibly kill self? See RenderWidgetHostViewWin::OnKeyEvent and
403 // http://b/issue?id=1192881 . 411 // http://b/issue?id=1192881 .
404 412
405 NativeWebKeyboardEvent event(theEvent); 413 NativeWebKeyboardEvent event(theEvent);
406 renderWidgetHostView_->render_widget_host_->ForwardKeyboardEvent(event); 414 if (renderWidgetHostView_->render_widget_host_)
415 renderWidgetHostView_->render_widget_host_->ForwardKeyboardEvent(event);
407 } 416 }
408 417
409 - (void)scrollWheel:(NSEvent *)theEvent { 418 - (void)scrollWheel:(NSEvent *)theEvent {
410 const WebMouseWheelEvent& event = 419 const WebMouseWheelEvent& event =
411 WebInputEventFactory::mouseWheelEvent(theEvent, self); 420 WebInputEventFactory::mouseWheelEvent(theEvent, self);
412 renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(event); 421 if (renderWidgetHostView_->render_widget_host_)
422 renderWidgetHostView_->render_widget_host_->ForwardWheelEvent(event);
413 } 423 }
414 424
415 - (void)setFrame:(NSRect)frameRect { 425 - (void)setFrame:(NSRect)frameRect {
416 [super setFrame:frameRect]; 426 [super setFrame:frameRect];
417 renderWidgetHostView_->render_widget_host_->WasResized(); 427 if (renderWidgetHostView_->render_widget_host_)
428 renderWidgetHostView_->render_widget_host_->WasResized();
418 } 429 }
419 430
420 - (void)drawRect:(NSRect)dirtyRect { 431 - (void)drawRect:(NSRect)dirtyRect {
432 if (!renderWidgetHostView_->render_widget_host_) {
433 // TODO(shess): Consider using something more noticable?
434 [[NSColor whiteColor] set];
435 NSRectFill(dirtyRect);
436 return;
437 }
438
421 DCHECK(renderWidgetHostView_->render_widget_host_->process()->HasConnection()) ; 439 DCHECK(renderWidgetHostView_->render_widget_host_->process()->HasConnection()) ;
422 DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_); 440 DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_);
423 441
424 renderWidgetHostView_->invalid_rect_ = dirtyRect; 442 renderWidgetHostView_->invalid_rect_ = dirtyRect;
425 renderWidgetHostView_->about_to_validate_and_paint_ = true; 443 renderWidgetHostView_->about_to_validate_and_paint_ = true;
426 BackingStore* backing_store = 444 BackingStore* backing_store =
427 renderWidgetHostView_->render_widget_host_->GetBackingStore(true); 445 renderWidgetHostView_->render_widget_host_->GetBackingStore(true);
428 skia::PlatformCanvas* canvas = backing_store->canvas(); 446 skia::PlatformCanvas* canvas = backing_store->canvas();
429 renderWidgetHostView_->about_to_validate_and_paint_ = false; 447 renderWidgetHostView_->about_to_validate_and_paint_ = false;
430 dirtyRect = renderWidgetHostView_->invalid_rect_; 448 dirtyRect = renderWidgetHostView_->invalid_rect_;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 } 520 }
503 } else { 521 } else {
504 [[NSColor whiteColor] set]; 522 [[NSColor whiteColor] set];
505 NSRectFill(dirtyRect); 523 NSRectFill(dirtyRect);
506 if (renderWidgetHostView_->whiteout_start_time_.is_null()) 524 if (renderWidgetHostView_->whiteout_start_time_.is_null())
507 renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks::Now(); 525 renderWidgetHostView_->whiteout_start_time_ = base::TimeTicks::Now();
508 } 526 }
509 } 527 }
510 528
511 - (BOOL)canBecomeKeyView { 529 - (BOOL)canBecomeKeyView {
530 if (!renderWidgetHostView_->render_widget_host_)
531 return NO;
532
512 return canBeKeyView_; 533 return canBeKeyView_;
513 } 534 }
514 535
515 - (BOOL)acceptsFirstResponder { 536 - (BOOL)acceptsFirstResponder {
537 if (!renderWidgetHostView_->render_widget_host_)
538 return NO;
539
516 return canBeKeyView_; 540 return canBeKeyView_;
517 } 541 }
518 542
519 - (BOOL)becomeFirstResponder { 543 - (BOOL)becomeFirstResponder {
520 if (![self superview]) { 544 if (!renderWidgetHostView_->render_widget_host_)
521 // We're dead, so becoming first responder is probably a bad idea.
522 return NO; 545 return NO;
523 }
524 546
525 renderWidgetHostView_->render_widget_host_->Focus(); 547 renderWidgetHostView_->render_widget_host_->Focus();
526 return YES; 548 return YES;
527 } 549 }
528 550
529 - (BOOL)resignFirstResponder { 551 - (BOOL)resignFirstResponder {
530 if (![self superview]) { 552 if (!renderWidgetHostView_->render_widget_host_)
531 // We're dead, so touching renderWidgetHostView_ is probably a bad
532 // idea.
533 return YES; 553 return YES;
534 }
535 554
536 if (closeOnDeactivate_) 555 if (closeOnDeactivate_)
537 renderWidgetHostView_->KillSelf(); 556 renderWidgetHostView_->KillSelf();
538 557
539 renderWidgetHostView_->render_widget_host_->Blur(); 558 renderWidgetHostView_->render_widget_host_->Blur();
540 559
541 return YES; 560 return YES;
542 } 561 }
543 562
544 - (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { 563 - (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item {
545 SEL action = [item action]; 564 SEL action = [item action];
546 565
547 return editCommand_helper_->IsMenuItemEnabled(action, self); 566 return editCommand_helper_->IsMenuItemEnabled(action, self);
548 } 567 }
549 568
550 - (RenderWidgetHostViewMac*)renderWidgetHostViewMac { 569 - (RenderWidgetHostViewMac*)renderWidgetHostViewMac {
551 return renderWidgetHostView_; 570 return renderWidgetHostView_;
552 } 571 }
553 572
554 @end 573 @end
555 574
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/render_widget_host_view_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698