| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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_win.h" | 5 #include "chrome/browser/external_tab_container_win.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 ignore_next_load_notification_(false), | 54 ignore_next_load_notification_(false), |
| 55 automation_resource_message_filter_(filter), | 55 automation_resource_message_filter_(filter), |
| 56 load_requests_via_automation_(false), | 56 load_requests_via_automation_(false), |
| 57 handle_top_level_requests_(false), | 57 handle_top_level_requests_(false), |
| 58 external_method_factory_(this), | 58 external_method_factory_(this), |
| 59 enabled_extension_automation_(false), | 59 enabled_extension_automation_(false), |
| 60 pending_(false), | 60 pending_(false), |
| 61 infobars_enabled_(true), | 61 infobars_enabled_(true), |
| 62 focus_manager_(NULL), | 62 focus_manager_(NULL), |
| 63 external_tab_view_(NULL), | 63 external_tab_view_(NULL), |
| 64 unload_reply_message_(NULL) { | 64 unload_reply_message_(NULL), |
| 65 route_all_top_level_navigations_(false) { |
| 65 } | 66 } |
| 66 | 67 |
| 67 ExternalTabContainer::~ExternalTabContainer() { | 68 ExternalTabContainer::~ExternalTabContainer() { |
| 68 Uninitialize(); | 69 Uninitialize(); |
| 69 } | 70 } |
| 70 | 71 |
| 71 bool ExternalTabContainer::Init(Profile* profile, | 72 bool ExternalTabContainer::Init(Profile* profile, |
| 72 HWND parent, | 73 HWND parent, |
| 73 const gfx::Rect& bounds, | 74 const gfx::Rect& bounds, |
| 74 DWORD style, | 75 DWORD style, |
| 75 bool load_requests_via_automation, | 76 bool load_requests_via_automation, |
| 76 bool handle_top_level_requests, | 77 bool handle_top_level_requests, |
| 77 TabContents* existing_contents, | 78 TabContents* existing_contents, |
| 78 const GURL& initial_url, | 79 const GURL& initial_url, |
| 79 const GURL& referrer, | 80 const GURL& referrer, |
| 80 bool infobars_enabled) { | 81 bool infobars_enabled, |
| 82 bool route_all_top_level_navigations) { |
| 81 if (IsWindow()) { | 83 if (IsWindow()) { |
| 82 NOTREACHED(); | 84 NOTREACHED(); |
| 83 return false; | 85 return false; |
| 84 } | 86 } |
| 85 | 87 |
| 86 load_requests_via_automation_ = load_requests_via_automation; | 88 load_requests_via_automation_ = load_requests_via_automation; |
| 87 handle_top_level_requests_ = handle_top_level_requests; | 89 handle_top_level_requests_ = handle_top_level_requests; |
| 88 infobars_enabled_ = infobars_enabled; | 90 infobars_enabled_ = infobars_enabled; |
| 91 route_all_top_level_navigations_ = route_all_top_level_navigations; |
| 89 | 92 |
| 90 set_window_style(WS_POPUP | WS_CLIPCHILDREN); | 93 set_window_style(WS_POPUP | WS_CLIPCHILDREN); |
| 91 views::WidgetWin::Init(NULL, bounds); | 94 views::WidgetWin::Init(NULL, bounds); |
| 92 if (!IsWindow()) { | 95 if (!IsWindow()) { |
| 93 NOTREACHED(); | 96 NOTREACHED(); |
| 94 return false; | 97 return false; |
| 95 } | 98 } |
| 96 | 99 |
| 97 // TODO(jcampan): limit focus traversal to contents. | 100 // TODO(jcampan): limit focus traversal to contents. |
| 98 | 101 |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 WindowOpenDisposition disposition, | 352 WindowOpenDisposition disposition, |
| 350 const gfx::Rect& initial_pos, | 353 const gfx::Rect& initial_pos, |
| 351 bool user_gesture) { | 354 bool user_gesture) { |
| 352 if (!automation_) { | 355 if (!automation_) { |
| 353 DCHECK(pending_); | 356 DCHECK(pending_); |
| 354 LOG(ERROR) << "Invalid automation provider. Dropping new contents notify"; | 357 LOG(ERROR) << "Invalid automation provider. Dropping new contents notify"; |
| 355 delete new_contents; | 358 delete new_contents; |
| 356 return; | 359 return; |
| 357 } | 360 } |
| 358 | 361 |
| 359 scoped_refptr<ExternalTabContainer> new_container = | 362 scoped_refptr<ExternalTabContainer> new_container; |
| 360 new ExternalTabContainer(NULL, NULL); | 363 // If the host is a browser like IE8, then the URL being navigated to in the |
| 364 // new tab contents could potentially navigate back to Chrome from a new |
| 365 // IE process. We support full tab mode only for IE and hence we use that as |
| 366 // a determining factor in whether the new ExternalTabContainer instance is |
| 367 // created as pending or not. |
| 368 if (!route_all_top_level_navigations_) { |
| 369 new_container = new ExternalTabContainer(NULL, NULL); |
| 370 } else { |
| 371 // Reuse the same tab handle here as the new container instance is a dummy |
| 372 // instance which does not have an automation client connected at the other |
| 373 // end. |
| 374 new_container = new TemporaryPopupExternalTabContainer( |
| 375 automation_, automation_resource_message_filter_.get()); |
| 376 new_container->SetTabHandle(tab_handle_); |
| 377 } |
| 361 | 378 |
| 362 // Make sure that ExternalTabContainer instance is initialized with | 379 // Make sure that ExternalTabContainer instance is initialized with |
| 363 // an unwrapped Profile. | 380 // an unwrapped Profile. |
| 364 bool result = new_container->Init( | 381 bool result = new_container->Init( |
| 365 new_contents->profile()->GetOriginalProfile(), | 382 new_contents->profile()->GetOriginalProfile(), |
| 366 NULL, | 383 NULL, |
| 367 initial_pos, | 384 initial_pos, |
| 368 WS_CHILD, | 385 WS_CHILD, |
| 369 load_requests_via_automation_, | 386 load_requests_via_automation_, |
| 370 handle_top_level_requests_, | 387 handle_top_level_requests_, |
| 371 new_contents, | 388 new_contents, |
| 372 GURL(), | 389 GURL(), |
| 373 GURL(), | 390 GURL(), |
| 374 true); | 391 true, |
| 392 route_all_top_level_navigations_); |
| 375 | 393 |
| 376 if (result) { | 394 if (result) { |
| 395 if (route_all_top_level_navigations_) { |
| 396 return; |
| 397 } |
| 377 uintptr_t cookie = reinterpret_cast<uintptr_t>(new_container.get()); | 398 uintptr_t cookie = reinterpret_cast<uintptr_t>(new_container.get()); |
| 378 pending_tabs_.Get()[cookie] = new_container; | 399 pending_tabs_.Get()[cookie] = new_container; |
| 379 new_container->set_pending(true); | 400 new_container->set_pending(true); |
| 380 IPC::AttachExternalTabParams attach_params_; | 401 IPC::AttachExternalTabParams attach_params_; |
| 381 attach_params_.cookie = static_cast<uint64>(cookie); | 402 attach_params_.cookie = static_cast<uint64>(cookie); |
| 382 attach_params_.dimensions = initial_pos; | 403 attach_params_.dimensions = initial_pos; |
| 383 attach_params_.user_gesture = user_gesture; | 404 attach_params_.user_gesture = user_gesture; |
| 384 attach_params_.disposition = disposition; | 405 attach_params_.disposition = disposition; |
| 385 attach_params_.profile_name = WideToUTF8( | 406 attach_params_.profile_name = WideToUTF8( |
| 386 tab_contents()->profile()->GetPath().DirName().BaseName().value()); | 407 tab_contents()->profile()->GetPath().DirName().BaseName().value()); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 render_view_host->process()->id(), | 559 render_view_host->process()->id(), |
| 539 render_view_host->routing_id()); | 560 render_view_host->routing_id()); |
| 540 } | 561 } |
| 541 } | 562 } |
| 542 | 563 |
| 543 bool ExternalTabContainer::HandleContextMenu(const ContextMenuParams& params) { | 564 bool ExternalTabContainer::HandleContextMenu(const ContextMenuParams& params) { |
| 544 if (!automation_) { | 565 if (!automation_) { |
| 545 NOTREACHED(); | 566 NOTREACHED(); |
| 546 return false; | 567 return false; |
| 547 } | 568 } |
| 548 | |
| 549 external_context_menu_.reset( | 569 external_context_menu_.reset( |
| 550 new RenderViewContextMenuViews(tab_contents(), params)); | 570 new RenderViewContextMenuViews(tab_contents(), params)); |
| 551 external_context_menu_->SetExternal(); | 571 external_context_menu_->SetExternal(); |
| 552 external_context_menu_->Init(); | 572 external_context_menu_->Init(); |
| 553 external_context_menu_->UpdateMenuItemStates(); | 573 external_context_menu_->UpdateMenuItemStates(); |
| 554 | 574 |
| 555 POINT screen_pt = { params.x, params.y }; | 575 POINT screen_pt = { params.x, params.y }; |
| 556 MapWindowPoints(GetNativeView(), HWND_DESKTOP, &screen_pt, 1); | 576 MapWindowPoints(GetNativeView(), HWND_DESKTOP, &screen_pt, 1); |
| 557 | 577 |
| 558 IPC::ContextMenuParams ipc_params; | 578 IPC::ContextMenuParams ipc_params; |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 external_tab_view_->SetLayoutManager(layout); | 1033 external_tab_view_->SetLayoutManager(layout); |
| 1014 | 1034 |
| 1015 layout->StartRow(0, 0); | 1035 layout->StartRow(0, 0); |
| 1016 layout->AddView(info_bar_container); | 1036 layout->AddView(info_bar_container); |
| 1017 layout->StartRow(1, 0); | 1037 layout->StartRow(1, 0); |
| 1018 layout->AddView(tab_contents_container_); | 1038 layout->AddView(tab_contents_container_); |
| 1019 SetContentsView(external_tab_view_); | 1039 SetContentsView(external_tab_view_); |
| 1020 // Note that SetTabContents must be called after AddChildView is called | 1040 // Note that SetTabContents must be called after AddChildView is called |
| 1021 tab_contents_container_->ChangeTabContents(tab_contents_); | 1041 tab_contents_container_->ChangeTabContents(tab_contents_); |
| 1022 } | 1042 } |
| 1043 |
| 1044 TemporaryPopupExternalTabContainer::TemporaryPopupExternalTabContainer( |
| 1045 AutomationProvider* automation, |
| 1046 AutomationResourceMessageFilter* filter) |
| 1047 : ExternalTabContainer(automation, filter) { |
| 1048 } |
| 1049 |
| 1050 TemporaryPopupExternalTabContainer::~TemporaryPopupExternalTabContainer() { |
| 1051 DLOG(INFO) << __FUNCTION__; |
| 1052 } |
| 1053 |
| 1054 void TemporaryPopupExternalTabContainer::OpenURLFromTab( |
| 1055 TabContents* source, const GURL& url, const GURL& referrer, |
| 1056 WindowOpenDisposition disposition, PageTransition::Type transition) { |
| 1057 if (!automation_) |
| 1058 return; |
| 1059 |
| 1060 if (disposition == CURRENT_TAB) { |
| 1061 DCHECK(route_all_top_level_navigations_); |
| 1062 disposition = NEW_FOREGROUND_TAB; |
| 1063 } |
| 1064 ExternalTabContainer::OpenURLFromTab(source, url, referrer, disposition, |
| 1065 transition); |
| 1066 // support only one navigation for a dummy tab before it is killed. |
| 1067 ::DestroyWindow(GetNativeView()); |
| 1068 } |
| 1069 |
| OLD | NEW |