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

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

Issue 200003: Chrome side of the fix for http://b/issue?id=1694574, which is a bug caused w... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 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
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 <string> 7 #include <string>
8 8
9 #include "app/l10n_util.h" 9 #include "app/l10n_util.h"
10 #include "app/win_util.h" 10 #include "app/win_util.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/win_util.h" 12 #include "base/win_util.h"
13 #include "chrome/browser/automation/automation_provider.h" 13 #include "chrome/browser/automation/automation_provider.h"
14 #include "chrome/browser/browser_window.h" 14 #include "chrome/browser/browser_window.h"
15 #include "chrome/browser/load_notification_details.h" 15 #include "chrome/browser/load_notification_details.h"
16 #include "chrome/browser/profile.h" 16 #include "chrome/browser/profile.h"
17 #include "chrome/browser/tab_contents/provisional_load_details.h" 17 #include "chrome/browser/tab_contents/provisional_load_details.h"
18 #include "chrome/browser/views/tab_contents/render_view_context_menu_external_wi n.h" 18 #include "chrome/browser/views/tab_contents/render_view_context_menu_external_wi n.h"
19 #include "chrome/browser/tab_contents/tab_contents.h" 19 #include "chrome/browser/tab_contents/tab_contents.h"
20 #include "chrome/browser/views/tab_contents/tab_contents_container.h" 20 #include "chrome/browser/views/tab_contents/tab_contents_container.h"
21 #include "chrome/common/bindings_policy.h" 21 #include "chrome/common/bindings_policy.h"
22 #include "chrome/common/chrome_constants.h" 22 #include "chrome/common/chrome_constants.h"
23 #include "chrome/common/notification_service.h" 23 #include "chrome/common/notification_service.h"
24 #include "chrome/test/automation/automation_messages.h" 24 #include "chrome/test/automation/automation_messages.h"
25 25
26 #include "grit/generated_resources.h" 26 #include "grit/generated_resources.h"
27 27
28 static const wchar_t kWindowObjectKey[] = L"ChromeWindowObject"; 28 static const wchar_t kWindowObjectKey[] = L"ChromeWindowObject";
29 29
30 ExternalTabContainer::PendingTabs ExternalTabContainer::pending_tabs_;
31
30 ExternalTabContainer::ExternalTabContainer( 32 ExternalTabContainer::ExternalTabContainer(
31 AutomationProvider* automation, AutomationResourceMessageFilter* filter) 33 AutomationProvider* automation, AutomationResourceMessageFilter* filter)
32 : automation_(automation), 34 : automation_(automation),
33 tab_contents_(NULL), 35 tab_contents_(NULL),
34 tab_contents_container_(NULL), 36 tab_contents_container_(NULL),
35 tab_handle_(0), 37 tab_handle_(0),
36 ignore_next_load_notification_(false), 38 ignore_next_load_notification_(false),
37 automation_resource_message_filter_(filter), 39 automation_resource_message_filter_(filter),
38 load_requests_via_automation_(false), 40 load_requests_via_automation_(false),
39 handle_top_level_requests_(false) { 41 handle_top_level_requests_(false) {
40 } 42 }
41 43
42 ExternalTabContainer::~ExternalTabContainer() { 44 ExternalTabContainer::~ExternalTabContainer() {
43 Uninitialize(GetNativeView()); 45 Uninitialize();
44 } 46 }
45 47
46 bool ExternalTabContainer::Init(Profile* profile, 48 bool ExternalTabContainer::Init(Profile* profile,
47 HWND parent, 49 HWND parent,
48 const gfx::Rect& bounds, 50 const gfx::Rect& bounds,
49 DWORD style, 51 DWORD style,
50 bool load_requests_via_automation, 52 bool load_requests_via_automation,
51 bool handle_top_level_requests, 53 bool handle_top_level_requests,
52 TabContents* existing_contents) { 54 TabContents* existing_contents) {
53 if (IsWindow()) { 55 if (IsWindow()) {
(...skipping 20 matching lines...) Expand all
74 // Customize our profile. 76 // Customize our profile.
75 // TODO(joshia): If we are loading requests via automation 77 // TODO(joshia): If we are loading requests via automation
76 // and handling cookies in automation then it's probably better to 78 // and handling cookies in automation then it's probably better to
77 // use OTR profile so that cookies are not persisted in chrome. 79 // use OTR profile so that cookies are not persisted in chrome.
78 automation_profile_.reset(new AutomationProfileImpl); 80 automation_profile_.reset(new AutomationProfileImpl);
79 automation_profile_->Initialize(profile, 81 automation_profile_->Initialize(profile,
80 automation_resource_message_filter_); 82 automation_resource_message_filter_);
81 profile = automation_profile_.get(); 83 profile = automation_profile_.get();
82 } 84 }
83 85
84 if (existing_contents) 86 if (existing_contents) {
85 tab_contents_ = existing_contents; 87 tab_contents_ = existing_contents;
86 else 88 tab_contents_->controller().set_profile(profile);
89 } else {
87 tab_contents_ = new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL); 90 tab_contents_ = new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL);
91 }
88 92
89 tab_contents_->set_delegate(this); 93 tab_contents_->set_delegate(this);
94
90 tab_contents_->GetMutableRendererPrefs()->browser_handles_top_level_requests = 95 tab_contents_->GetMutableRendererPrefs()->browser_handles_top_level_requests =
91 handle_top_level_requests; 96 handle_top_level_requests;
92 97
93 if (!existing_contents) { 98 if (!existing_contents) {
94 tab_contents_->render_view_host()->AllowBindings( 99 tab_contents_->render_view_host()->AllowBindings(
95 BindingsPolicy::EXTERNAL_HOST); 100 BindingsPolicy::EXTERNAL_HOST);
96 } 101 }
97 102
98 // Create a TabContentsContainer to handle focus cycling using Tab and 103 // Create a TabContentsContainer to handle focus cycling using Tab and
99 // Shift-Tab. 104 // Shift-Tab.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 if (parent) 137 if (parent)
133 SetParent(GetNativeView(), parent); 138 SetParent(GetNativeView(), parent);
134 139
135 ::ShowWindow(tab_contents_->GetNativeView(), SW_SHOWNA); 140 ::ShowWindow(tab_contents_->GetNativeView(), SW_SHOWNA);
136 141
137 disabled_context_menu_ids_.push_back( 142 disabled_context_menu_ids_.push_back(
138 IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD); 143 IDS_CONTENT_CONTEXT_OPENLINKOFFTHERECORD);
139 return true; 144 return true;
140 } 145 }
141 146
147 void ExternalTabContainer::Uninitialize() {
148 registrar_.RemoveAll();
149 if (tab_contents_) {
150 NotificationService::current()->Notify(
151 NotificationType::EXTERNAL_TAB_CLOSED,
152 Source<NavigationController>(&tab_contents_->controller()),
153 Details<ExternalTabContainer>(this));
154
155 delete tab_contents_;
156 tab_contents_ = NULL;
157 }
158 }
159
160 bool ExternalTabContainer::Reinitialize(
161 AutomationProvider* automation_provider,
162 AutomationResourceMessageFilter* filter) {
163 if (!automation_provider || !filter) {
164 NOTREACHED();
165 return false;
166 }
167
168 automation_ = automation_provider;
169 automation_resource_message_filter_ = filter;
170
171 if (load_requests_via_automation_) {
172 RenderViewHost* rvh = tab_contents_->render_view_host();
173 if (rvh) {
174 AutomationResourceMessageFilter::RegisterRenderView(
175 rvh->process()->id(), rvh->routing_id(),
176 tab_handle_, automation_resource_message_filter_);
177 }
178
179 DCHECK(automation_profile_.get() != NULL);
180 Profile* profile = tab_contents_->profile()->GetOriginalProfile();
181 DCHECK(profile != NULL);
182 automation_profile_->Initialize(profile, filter);
183 }
184
185 return true;
186 }
187
142 void ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) { 188 void ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) {
143 DefWindowProc(msg.hwnd, msg.message, msg.wParam, msg.lParam); 189 DefWindowProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
144 } 190 }
145 191
146 void ExternalTabContainer::FocusThroughTabTraversal(bool reverse) { 192 void ExternalTabContainer::FocusThroughTabTraversal(bool reverse) {
147 DCHECK(tab_contents_); 193 DCHECK(tab_contents_);
148 if (tab_contents_) { 194 if (tab_contents_) {
149 static_cast<TabContents*>(tab_contents_)->Focus(); 195 static_cast<TabContents*>(tab_contents_)->Focus();
150 static_cast<TabContents*>(tab_contents_)->FocusThroughTabTraversal(reverse); 196 static_cast<TabContents*>(tab_contents_)->FocusThroughTabTraversal(reverse);
151 } 197 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 Browser::BuildPopupWindowHelper(source, new_contents, initial_pos, 268 Browser::BuildPopupWindowHelper(source, new_contents, initial_pos,
223 Browser::TYPE_POPUP, 269 Browser::TYPE_POPUP,
224 tab_contents_->profile(), true); 270 tab_contents_->profile(), true);
225 break; 271 break;
226 } 272 }
227 273
228 case NEW_FOREGROUND_TAB: 274 case NEW_FOREGROUND_TAB:
229 case NEW_BACKGROUND_TAB: { 275 case NEW_BACKGROUND_TAB: {
230 DCHECK(automation_ != NULL); 276 DCHECK(automation_ != NULL);
231 277
232 ExternalTabContainer* new_container = 278 scoped_refptr<ExternalTabContainer> new_container =
233 new ExternalTabContainer(automation_, 279 new ExternalTabContainer(NULL, NULL);
234 automation_resource_message_filter_);
235 bool result = new_container->Init(automation_profile_.get(),
236 NULL,
237 initial_pos,
238 WS_CHILD,
239 load_requests_via_automation_,
240 handle_top_level_requests_,
241 new_contents);
242 DCHECK(result);
243 result = automation_->AddExternalTab(new_container);
244 DCHECK(result);
245 280
246 automation_->Send(new AutomationMsg_AttachExternalTab( 281 // Make sure that ExternalTabContainer instance is initialized with
247 0, tab_handle_, new_container->tab_handle(), 282 // an unwrapped Profile.
248 new_container->GetNativeView(), new_contents->GetNativeView(), 283 bool result = new_container->Init(
249 disposition)); 284 new_contents->profile()->GetOriginalProfile(),
285 NULL,
286 initial_pos,
287 WS_CHILD,
288 load_requests_via_automation_,
289 handle_top_level_requests_,
290 new_contents);
291
292 if (result) {
293 pending_tabs_[reinterpret_cast<intptr_t>(new_container.get())] =
294 new_container;
295
296 automation_->Send(new AutomationMsg_AttachExternalTab(
297 0,
298 tab_handle_,
299 reinterpret_cast<intptr_t>(new_container.get()),
300 disposition));
301 } else {
302 NOTREACHED();
303 }
250 break; 304 break;
251 } 305 }
252 306
253 default: 307 default:
254 NOTREACHED(); 308 NOTREACHED();
255 break; 309 break;
256 } 310 }
257 } 311 }
258 312
259 void ExternalTabContainer::ActivateContents(TabContents* contents) { 313 void ExternalTabContainer::ActivateContents(TabContents* contents) {
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 break; 500 break;
447 } 501 }
448 default: 502 default:
449 NOTREACHED(); 503 NOTREACHED();
450 } 504 }
451 } 505 }
452 506
453 //////////////////////////////////////////////////////////////////////////////// 507 ////////////////////////////////////////////////////////////////////////////////
454 // ExternalTabContainer, views::WidgetWin overrides: 508 // ExternalTabContainer, views::WidgetWin overrides:
455 509
510 LRESULT ExternalTabContainer::OnCreate(LPCREATESTRUCT create_struct) {
511 LRESULT result = views::WidgetWin::OnCreate(create_struct);
512 if (result == 0) {
513 // Grab a reference here which will be released in OnFinalMessage
514 AddRef();
515 }
516 return result;
517 }
518
456 void ExternalTabContainer::OnDestroy() { 519 void ExternalTabContainer::OnDestroy() {
457 Uninitialize(GetNativeView()); 520 Uninitialize();
458 WidgetWin::OnDestroy(); 521 WidgetWin::OnDestroy();
459 if (browser_.get()) { 522 if (browser_.get()) {
460 ::DestroyWindow(browser_->window()->GetNativeHandle()); 523 ::DestroyWindow(browser_->window()->GetNativeHandle());
461 } 524 }
462 } 525 }
463 526
527 void ExternalTabContainer::OnFinalMessage(HWND window) {
528 // Release the reference which we grabbed in WM_CREATE.
529 Release();
530 }
531
464 //////////////////////////////////////////////////////////////////////////////// 532 ////////////////////////////////////////////////////////////////////////////////
465 // ExternalTabContainer, private: 533 // ExternalTabContainer, private:
466
467 void ExternalTabContainer::Uninitialize(HWND window) {
468 registrar_.RemoveAll();
469 if (tab_contents_) {
470 NotificationService::current()->Notify(
471 NotificationType::EXTERNAL_TAB_CLOSED,
472 Source<NavigationController>(&tab_contents_->controller()),
473 Details<ExternalTabContainer>(this));
474
475 delete tab_contents_;
476 tab_contents_ = NULL;
477 }
478 }
479
480 bool ExternalTabContainer::ProcessUnhandledKeyStroke(HWND window, 534 bool ExternalTabContainer::ProcessUnhandledKeyStroke(HWND window,
481 UINT message, 535 UINT message,
482 WPARAM wparam, 536 WPARAM wparam,
483 LPARAM lparam) { 537 LPARAM lparam) {
484 if (!automation_) { 538 if (!automation_) {
485 return false; 539 return false;
486 } 540 }
487 if ((wparam == VK_TAB) && !win_util::IsCtrlPressed()) { 541 if ((wparam == VK_TAB) && !win_util::IsCtrlPressed()) {
488 // Tabs are handled separately (except if this is Ctrl-Tab or 542 // Tabs are handled separately (except if this is Ctrl-Tab or
489 // Ctrl-Shift-Tab) 543 // Ctrl-Shift-Tab)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 581
528 nav_info->navigation_type = nav_type; 582 nav_info->navigation_type = nav_type;
529 nav_info->relative_offset = relative_offset; 583 nav_info->relative_offset = relative_offset;
530 nav_info->navigation_index = 584 nav_info->navigation_index =
531 tab_contents_->controller().GetCurrentEntryIndex(); 585 tab_contents_->controller().GetCurrentEntryIndex();
532 nav_info->title = UTF16ToWideHack(entry->title()); 586 nav_info->title = UTF16ToWideHack(entry->title());
533 nav_info->url = entry->url(); 587 nav_info->url = entry->url();
534 return true; 588 return true;
535 } 589 }
536 590
591 ExternalTabContainer* ExternalTabContainer::RemovePendingTab(intptr_t cookie) {
592 PendingTabs::iterator index = pending_tabs_.find(cookie);
593 if (index != pending_tabs_.end()) {
594 scoped_refptr<ExternalTabContainer> container = (*index).second;
595 pending_tabs_.erase(index);
596 return container.release();
597 }
598
599 NOTREACHED() << "Failed to find ExternalTabContainer for cookie: "
600 << cookie;
601 return NULL;
602 }
603
OLDNEW
« no previous file with comments | « chrome/browser/external_tab_container.h ('k') | chrome/browser/tab_contents/navigation_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698