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

Side by Side Diff: chrome/browser/external_tab_container.cc

Issue 39086: Fix a crash in chrome.exe caused by the external tab container instance getti... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 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 | « chrome/browser/external_tab_container.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/external_tab_container.h" 5 #include "chrome/browser/external_tab_container.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/win_util.h" 8 #include "base/win_util.h"
9 #include "chrome/browser/automation/automation_provider.h" 9 #include "chrome/browser/automation/automation_provider.h"
10 #include "chrome/browser/profile.h" 10 #include "chrome/browser/profile.h"
(...skipping 17 matching lines...) Expand all
28 : automation_(automation), 28 : automation_(automation),
29 root_view_(this), 29 root_view_(this),
30 tab_contents_(NULL), 30 tab_contents_(NULL),
31 external_accel_table_(NULL), 31 external_accel_table_(NULL),
32 external_accel_entry_count_(0), 32 external_accel_entry_count_(0),
33 tab_contents_container_(NULL), 33 tab_contents_container_(NULL),
34 ignore_next_load_notification_(false) { 34 ignore_next_load_notification_(false) {
35 } 35 }
36 36
37 ExternalTabContainer::~ExternalTabContainer() { 37 ExternalTabContainer::~ExternalTabContainer() {
38 Uninitialize(m_hWnd);
38 } 39 }
39 40
40 bool ExternalTabContainer::Init(Profile* profile, HWND parent, 41 bool ExternalTabContainer::Init(Profile* profile, HWND parent,
41 const gfx::Rect& dimensions, 42 const gfx::Rect& dimensions,
42 unsigned int style) { 43 unsigned int style) {
43 if (IsWindow()) { 44 if (IsWindow()) {
44 NOTREACHED(); 45 NOTREACHED();
45 return false; 46 return false;
46 } 47 }
47 48
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 // Note that it's important to do this before we call SetParent since 114 // Note that it's important to do this before we call SetParent since
114 // during the SetParent call we will otherwise get a WA_ACTIVATE call 115 // during the SetParent call we will otherwise get a WA_ACTIVATE call
115 // that causes us to steal the current focus. 116 // that causes us to steal the current focus.
116 ModifyStyle(WS_POPUP, style, 0); 117 ModifyStyle(WS_POPUP, style, 0);
117 118
118 // Now apply the parenting and style 119 // Now apply the parenting and style
119 if (parent) 120 if (parent)
120 SetParent(parent); 121 SetParent(parent);
121 122
122 ::ShowWindow(tab_contents_->GetNativeView(), SW_SHOWNA); 123 ::ShowWindow(tab_contents_->GetNativeView(), SW_SHOWNA);
123
124 return true; 124 return true;
125 } 125 }
126 126
127 void ExternalTabContainer::OnDestroy() { 127 bool ExternalTabContainer::Uninitialize(HWND window) {
128 views::FocusManager* focus_manager = 128 if (::IsWindow(window)) {
129 views::FocusManager::GetFocusManager(GetHWND()); 129 views::FocusManager* focus_manager =
130 if (focus_manager) { 130 views::FocusManager::GetFocusManager(window);
131 focus_manager->RemoveKeystrokeListener(this); 131 if (focus_manager) {
132 focus_manager->RemoveKeystrokeListener(this);
133 }
132 } 134 }
135
133 root_view_.RemoveAllChildViews(true); 136 root_view_.RemoveAllChildViews(true);
134 if (tab_contents_) { 137 if (tab_contents_) {
135 NavigationController* controller = tab_contents_->controller(); 138 NavigationController* controller = tab_contents_->controller();
136 DCHECK(controller); 139 DCHECK(controller);
137 140
138 NotificationService::current()->Notify( 141 NotificationService::current()->Notify(
139 NotificationType::EXTERNAL_TAB_CLOSED, 142 NotificationType::EXTERNAL_TAB_CLOSED,
140 Source<NavigationController>(controller), 143 Source<NavigationController>(controller),
141 Details<ExternalTabContainer>(this)); 144 Details<ExternalTabContainer>(this));
145
142 tab_contents_->set_delegate(NULL); 146 tab_contents_->set_delegate(NULL);
143 tab_contents_->CloseContents(); 147 tab_contents_->CloseContents();
144 // WARNING: tab_contents_ has likely been deleted. 148 // WARNING: tab_contents_ has likely been deleted.
145 tab_contents_ = NULL; 149 tab_contents_ = NULL;
146 } 150 }
151
152 return true;
147 } 153 }
148 154
149 void ExternalTabContainer::OnFinalMessage(HWND window) { 155 void ExternalTabContainer::OnFinalMessage(HWND window) {
156 Uninitialize(window);
150 delete this; 157 delete this;
151 } 158 }
152 159
153 LRESULT ExternalTabContainer::OnSize(UINT, WPARAM, LPARAM, BOOL& handled) { 160 LRESULT ExternalTabContainer::OnSize(UINT, WPARAM, LPARAM, BOOL& handled) {
154 if (tab_contents_) { 161 if (tab_contents_) {
155 RECT client_rect = {0}; 162 RECT client_rect = {0};
156 GetClientRect(&client_rect); 163 GetClientRect(&client_rect);
157 ::SetWindowPos(tab_contents_->GetNativeView(), NULL, client_rect.left, 164 ::SetWindowPos(tab_contents_->GetNativeView(), NULL, client_rect.left,
158 client_rect.top, client_rect.right - client_rect.left, 165 client_rect.top, client_rect.right - client_rect.left,
159 client_rect.bottom - client_rect.top, SWP_NOZORDER); 166 client_rect.bottom - client_rect.top, SWP_NOZORDER);
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 if (!::IsWindow(parent_window)) { 413 if (!::IsWindow(parent_window)) {
407 return NULL; 414 return NULL;
408 } 415 }
409 if (!IsExternalTabContainer(parent_window)) { 416 if (!IsExternalTabContainer(parent_window)) {
410 return NULL; 417 return NULL;
411 } 418 }
412 ExternalTabContainer* container = reinterpret_cast<ExternalTabContainer*>( 419 ExternalTabContainer* container = reinterpret_cast<ExternalTabContainer*>(
413 GetProp(parent_window, kWindowObjectKey)); 420 GetProp(parent_window, kWindowObjectKey));
414 return container; 421 return container;
415 } 422 }
OLDNEW
« no previous file with comments | « chrome/browser/external_tab_container.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698