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

Side by Side Diff: chrome/browser/ui/cocoa/extensions/extension_popup_controller.mm

Issue 12572006: Fix crash in extension_popup_controller.mm appearing when devtools is closed (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add reset back Created 7 years, 9 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
« no previous file with comments | « no previous file | 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) 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 "chrome/browser/devtools/devtools_window.h" 9 #include "chrome/browser/devtools/devtools_window.h"
10 #include "chrome/browser/extensions/extension_host.h" 10 #include "chrome/browser/extensions/extension_host.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 [controller_ onViewDidShow]; 74 [controller_ onViewDidShow];
75 } 75 }
76 76
77 private: 77 private:
78 ExtensionPopupController* controller_; // Weak; owns this. 78 ExtensionPopupController* controller_; // Weak; owns this.
79 }; 79 };
80 80
81 class DevtoolsNotificationBridge : public content::NotificationObserver { 81 class DevtoolsNotificationBridge : public content::NotificationObserver {
82 public: 82 public:
83 explicit DevtoolsNotificationBridge(ExtensionPopupController* controller) 83 explicit DevtoolsNotificationBridge(ExtensionPopupController* controller)
84 : controller_(controller) {} 84 : controller_(controller),
85 render_view_host_([controller_ extensionHost]->render_view_host()) {}
85 86
86 virtual void Observe( 87 virtual void Observe(
87 int type, 88 int type,
88 const content::NotificationSource& source, 89 const content::NotificationSource& source,
89 const content::NotificationDetails& details) OVERRIDE { 90 const content::NotificationDetails& details) OVERRIDE {
90 switch (type) { 91 switch (type) {
91 case chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING: { 92 case chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING: {
92 if (content::Details<extensions::ExtensionHost>( 93 if (content::Details<extensions::ExtensionHost>(
93 [controller_ extensionHost]) == details) { 94 [controller_ extensionHost]) == details) {
94 [controller_ showDevTools]; 95 [controller_ showDevTools];
95 } 96 }
96 break; 97 break;
97 } 98 }
98 case content::NOTIFICATION_DEVTOOLS_AGENT_ATTACHED: { 99 case content::NOTIFICATION_DEVTOOLS_AGENT_ATTACHED: {
99 RenderViewHost* rvh = [controller_ extensionHost]->render_view_host(); 100 if (content::Details<RenderViewHost>(render_view_host_) == details)
100 if (content::Details<RenderViewHost>(rvh) == details)
101 // Set the flag on the controller so the popup is not hidden when 101 // Set the flag on the controller so the popup is not hidden when
102 // the dev tools get focus. 102 // the dev tools get focus.
103 [controller_ setBeingInspected:YES]; 103 [controller_ setBeingInspected:YES];
104 break; 104 break;
105 } 105 }
106 case content::NOTIFICATION_DEVTOOLS_AGENT_DETACHED: { 106 case content::NOTIFICATION_DEVTOOLS_AGENT_DETACHED: {
107 RenderViewHost* rvh = [controller_ extensionHost]->render_view_host(); 107 if (content::Details<RenderViewHost>(render_view_host_) == details)
108 if (content::Details<RenderViewHost>(rvh) == details)
109 // Allow the devtools to finish detaching before we close the popup 108 // Allow the devtools to finish detaching before we close the popup
110 [controller_ performSelector:@selector(close) 109 [controller_ performSelector:@selector(close)
111 withObject:nil 110 withObject:nil
112 afterDelay:0.0]; 111 afterDelay:0.0];
113 break; 112 break;
114 } 113 }
115 default: { 114 default: {
116 NOTREACHED() << "Received unexpected notification"; 115 NOTREACHED() << "Received unexpected notification";
117 break; 116 break;
118 } 117 }
119 }; 118 };
120 } 119 }
121 120
122 private: 121 private:
123 ExtensionPopupController* controller_; 122 ExtensionPopupController* controller_;
123 // RenderViewHost for controller. Hold onto this separately because we need to
124 // know what it is for notifications, but our ExtensionHost may not be valid.
125 RenderViewHost* render_view_host_;
124 }; 126 };
125 127
126 @implementation ExtensionPopupController 128 @implementation ExtensionPopupController
127 129
128 - (id)initWithHost:(extensions::ExtensionHost*)host 130 - (id)initWithHost:(extensions::ExtensionHost*)host
129 parentWindow:(NSWindow*)parentWindow 131 parentWindow:(NSWindow*)parentWindow
130 anchoredAt:(NSPoint)anchoredAt 132 anchoredAt:(NSPoint)anchoredAt
131 arrowLocation:(info_bubble::BubbleArrowLocation)arrowLocation 133 arrowLocation:(info_bubble::BubbleArrowLocation)arrowLocation
132 devMode:(BOOL)devMode { 134 devMode:(BOOL)devMode {
133 scoped_nsobject<InfoBubbleWindow> window( 135 scoped_nsobject<InfoBubbleWindow> window(
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 [super dealloc]; 194 [super dealloc];
193 } 195 }
194 196
195 - (void)showDevTools { 197 - (void)showDevTools {
196 DevToolsWindow::OpenDevToolsWindow(host_->render_view_host()); 198 DevToolsWindow::OpenDevToolsWindow(host_->render_view_host());
197 } 199 }
198 200
199 - (void)windowWillClose:(NSNotification *)notification { 201 - (void)windowWillClose:(NSNotification *)notification {
200 [super windowWillClose:notification]; 202 [super windowWillClose:notification];
201 gPopup = nil; 203 gPopup = nil;
202 if (host_->view()) { 204 if (host_->view())
203 host_->view()->set_container(NULL); 205 host_->view()->set_container(NULL);
204 host_.reset(); 206 host_.reset();
205 }
206 } 207 }
207 208
208 - (void)windowDidResignKey:(NSNotification*)notification { 209 - (void)windowDidResignKey:(NSNotification*)notification {
209 if (!beingInspected_) 210 if (!beingInspected_)
210 [super windowDidResignKey:notification]; 211 [super windowDidResignKey:notification];
211 } 212 }
212 213
213 - (BOOL)isClosing { 214 - (BOOL)isClosing {
214 return [static_cast<InfoBubbleWindow*>([self window]) isClosing]; 215 return [static_cast<InfoBubbleWindow*>([self window]) isClosing];
215 } 216 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 return minSize; 375 return minSize;
375 } 376 }
376 377
377 // Private (TestingAPI) 378 // Private (TestingAPI)
378 + (NSSize)maxPopupSize { 379 + (NSSize)maxPopupSize {
379 NSSize maxSize = {ExtensionViewMac::kMaxWidth, ExtensionViewMac::kMaxHeight}; 380 NSSize maxSize = {ExtensionViewMac::kMaxWidth, ExtensionViewMac::kMaxHeight};
380 return maxSize; 381 return maxSize;
381 } 382 }
382 383
383 @end 384 @end
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698