Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h" | 5 #import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 - (void)close { | 207 - (void)close { |
| 208 // |windowWillClose:| could have already been called. http://crbug.com/279505 | 208 // |windowWillClose:| could have already been called. http://crbug.com/279505 |
| 209 if (host_) { | 209 if (host_) { |
| 210 web_modal::WebContentsModalDialogManager* modalDialogManager = | 210 web_modal::WebContentsModalDialogManager* modalDialogManager = |
| 211 web_modal::WebContentsModalDialogManager::FromWebContents( | 211 web_modal::WebContentsModalDialogManager::FromWebContents( |
| 212 host_->host_contents()); | 212 host_->host_contents()); |
| 213 if (modalDialogManager && | 213 if (modalDialogManager && |
| 214 modalDialogManager->IsDialogActive()) { | 214 modalDialogManager->IsDialogActive()) { |
| 215 return; | 215 return; |
| 216 } | 216 } |
| 217 // We must shutdown host_ immediately, and it will notify RendererProcess | |
| 218 // right away. We can't wait to do it in | |
| 219 // -[ExtensionPopController windowWillClose:...] | |
| 220 if (host_->view()) | |
| 221 host_->view()->set_container(NULL); | |
| 222 host_.reset(); | |
| 217 } | 223 } |
| 218 [super close]; | 224 [super close]; |
| 219 } | 225 } |
| 220 | 226 |
| 221 - (void)windowWillClose:(NSNotification *)notification { | 227 - (void)windowWillClose:(NSNotification*)notification { |
| 222 [super windowWillClose:notification]; | 228 [super windowWillClose:notification]; |
| 223 if (gPopup == self) | 229 if (gPopup == self) |
| 224 gPopup = nil; | 230 gPopup = nil; |
| 225 if (host_->view()) | |
| 226 host_->view()->set_container(NULL); | |
| 227 host_.reset(); | |
| 228 } | 231 } |
| 229 | 232 |
| 230 - (void)windowDidResignKey:(NSNotification*)notification { | 233 - (void)windowDidResignKey:(NSNotification*)notification { |
| 231 // |windowWillClose:| could have already been called. http://crbug.com/279505 | 234 // |windowWillClose:| could have already been called. http://crbug.com/279505 |
| 232 if (host_) { | 235 if (host_) { |
| 233 // When a modal dialog is opened on top of the popup and when it's closed, | 236 // When a modal dialog is opened on top of the popup and when it's closed, |
| 234 // it steals key-ness from the popup. Don't close the popup when this | 237 // it steals key-ness from the popup. Don't close the popup when this |
| 235 // happens. There's an extra windowDidResignKey: notification after the | 238 // happens. There's an extra windowDidResignKey: notification after the |
| 236 // modal dialog closes that should also be ignored. | 239 // modal dialog closes that should also be ignored. |
| 237 web_modal::WebContentsModalDialogManager* modalDialogManager = | 240 web_modal::WebContentsModalDialogManager* modalDialogManager = |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 273 DCHECK(browser); | 276 DCHECK(browser); |
| 274 if (!browser) | 277 if (!browser) |
| 275 return nil; | 278 return nil; |
| 276 | 279 |
| 277 extensions::ExtensionViewHost* host = | 280 extensions::ExtensionViewHost* host = |
| 278 extensions::ExtensionViewHostFactory::CreatePopupHost(url, browser); | 281 extensions::ExtensionViewHostFactory::CreatePopupHost(url, browser); |
| 279 DCHECK(host); | 282 DCHECK(host); |
| 280 if (!host) | 283 if (!host) |
| 281 return nil; | 284 return nil; |
| 282 | 285 |
| 286 // Since we only close without releasing(see bug:351278), we need to shutdown | |
| 287 // host_ in -[ExtensionPopupController close] immediately. If not, host_ might | |
| 288 // not be released even when new ExtensionPopupController is ready. And | |
| 289 // this causes bug:376511. | |
| 290 // See above -[ExtensionPopupController close]. | |
| 283 [gPopup close]; | 291 [gPopup close]; |
|
Xuefei Ren
2014/06/10 05:24:32
See bug:361278, and patch is 64ced6a2af4cb2b46756b
| |
| 284 | 292 |
| 285 // Takes ownership of |host|. Also will autorelease itself when the popup is | 293 // Takes ownership of |host|. Also will autorelease itself when the popup is |
| 286 // closed, so no need to do that here. | 294 // closed, so no need to do that here. |
| 287 gPopup = [[ExtensionPopupController alloc] | 295 gPopup = [[ExtensionPopupController alloc] |
| 288 initWithHost:host | 296 initWithHost:host |
| 289 parentWindow:browser->window()->GetNativeWindow() | 297 parentWindow:browser->window()->GetNativeWindow() |
| 290 anchoredAt:anchoredAt | 298 anchoredAt:anchoredAt |
| 291 arrowLocation:arrowLocation | 299 arrowLocation:arrowLocation |
| 292 devMode:devMode]; | 300 devMode:devMode]; |
| 293 return gPopup; | 301 return gPopup; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 [extensionView_ setFrame:frame]; | 385 [extensionView_ setFrame:frame]; |
| 378 [extensionView_ setNeedsDisplay:YES]; | 386 [extensionView_ setNeedsDisplay:YES]; |
| 379 } | 387 } |
| 380 | 388 |
| 381 - (void)onViewDidShow { | 389 - (void)onViewDidShow { |
| 382 [self onSizeChanged:pendingSize_]; | 390 [self onSizeChanged:pendingSize_]; |
| 383 } | 391 } |
| 384 | 392 |
| 385 - (void)windowDidResize:(NSNotification*)notification { | 393 - (void)windowDidResize:(NSNotification*)notification { |
| 386 // Let the extension view know, so that it can tell plugins. | 394 // Let the extension view know, so that it can tell plugins. |
| 387 if (host_->view()) | 395 if (host_ && host_->view()) |
| 388 host_->view()->WindowFrameChanged(); | 396 host_->view()->WindowFrameChanged(); |
| 389 } | 397 } |
| 390 | 398 |
| 391 - (void)windowDidMove:(NSNotification*)notification { | 399 - (void)windowDidMove:(NSNotification*)notification { |
| 392 // Let the extension view know, so that it can tell plugins. | 400 // Let the extension view know, so that it can tell plugins. |
| 393 if (host_->view()) | 401 if (host_ && host_->view()) |
| 394 host_->view()->WindowFrameChanged(); | 402 host_->view()->WindowFrameChanged(); |
| 395 } | 403 } |
| 396 | 404 |
| 397 // Private (TestingAPI) | 405 // Private (TestingAPI) |
| 398 - (NSView*)view { | 406 - (NSView*)view { |
| 399 return extensionView_; | 407 return extensionView_; |
| 400 } | 408 } |
| 401 | 409 |
| 402 // Private (TestingAPI) | 410 // Private (TestingAPI) |
| 403 + (NSSize)minPopupSize { | 411 + (NSSize)minPopupSize { |
| 404 NSSize minSize = {ExtensionViewMac::kMinWidth, ExtensionViewMac::kMinHeight}; | 412 NSSize minSize = {ExtensionViewMac::kMinWidth, ExtensionViewMac::kMinHeight}; |
| 405 return minSize; | 413 return minSize; |
| 406 } | 414 } |
| 407 | 415 |
| 408 // Private (TestingAPI) | 416 // Private (TestingAPI) |
| 409 + (NSSize)maxPopupSize { | 417 + (NSSize)maxPopupSize { |
| 410 NSSize maxSize = {ExtensionViewMac::kMaxWidth, ExtensionViewMac::kMaxHeight}; | 418 NSSize maxSize = {ExtensionViewMac::kMaxWidth, ExtensionViewMac::kMaxHeight}; |
| 411 return maxSize; | 419 return maxSize; |
| 412 } | 420 } |
| 413 | 421 |
| 414 @end | 422 @end |
| OLD | NEW |