172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/external_tab_container_win.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/debug/trace_event.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/i18n/rtl.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h" 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/utf_string_conversions.h" 133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/win/win_util.h" 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/app/chrome_dll_resource.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/automation/automation_provider.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_manager.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_toggle_action.h" 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/google/google_util.h" 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/history/history_types.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/load_notification_details.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/page_info_window.h" 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h" 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/browser_dialogs.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/views/infobars/infobar_container_view.h" 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/page_info_bubble_view.h" 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tab_contents/render_view_context_menu_views.h" 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tab_contents/tab_contents_container.h" 324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/automation_messages.h" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_constants.h" 344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/url_constants.h" 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h" 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_dispatcher_host_request_info.h" 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/provisional_load_details.h" 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/bindings_policy.h" 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/native_web_keyboard_event.h" 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h" 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h" 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "grit/locale_settings.h" 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h" 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/view_prop.h" 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/grid_layout.h" 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/root_view.h" 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window.h" 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ui::ViewProp; 54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstatic const char kWindowObjectKey[] = "ChromeWindowObject"; 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This class overrides the LinkActivated function in the PageInfoBubbleView 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// class and routes the help center link navigation to the host browser. 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ExternalTabPageInfoBubbleView : public PageInfoBubbleView { 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExternalTabPageInfoBubbleView(ExternalTabContainer* container, 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::NativeWindow parent_window, 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Profile* profile, 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const GURL& url, 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const NavigationEntry::SSLStatus& ssl, 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool show_history) 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : PageInfoBubbleView(parent_window, profile, url, ssl, show_history), 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick container_(container) { 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DVLOG(1) << __FUNCTION__; 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~ExternalTabPageInfoBubbleView() { 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DVLOG(1) << __FUNCTION__; 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // LinkController methods: 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void LinkActivated(views::Link* source, int event_flags) { 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL url = google_util::AppendGoogleLocaleParam( 774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL(chrome::kPageInfoHelpCenterURL)); 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick container_->OpenURLFromTab(container_->tab_contents(), url, GURL(), 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NEW_FOREGROUND_TAB, PageTransition::LINK); 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<ExternalTabContainer> container_; 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbase::LazyInstance<ExternalTabContainer::PendingTabs> 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExternalTabContainer::pending_tabs_(base::LINKER_INITIALIZED); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExternalTabContainer::ExternalTabContainer( 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationProvider* automation, AutomationResourceMessageFilter* filter) 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : automation_(automation), 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_container_(NULL), 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_handle_(0), 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ignore_next_load_notification_(false), 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_resource_message_filter_(filter), 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch load_requests_via_automation_(false), 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle_top_level_requests_(false), 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_method_factory_(this), 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_(false), 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobars_enabled_(true), 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager_(NULL), 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_tab_view_(NULL), 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick unload_reply_message_(NULL), 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen route_all_top_level_navigations_(false), 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen is_popup_window_(false) { 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExternalTabContainer::~ExternalTabContainer() { 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Uninitialize(); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTabContents* ExternalTabContainer::tab_contents() const { 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return tab_contents_.get() ? tab_contents_->tab_contents() : NULL; 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::Init(Profile* profile, 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HWND parent, 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& bounds, 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DWORD style, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool load_requests_via_automation, 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool handle_top_level_requests, 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabContentsWrapper* existing_contents, 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& initial_url, 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& referrer, 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool infobars_enabled, 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool route_all_top_level_navigations) { 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (IsWindow()) { 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch load_requests_via_automation_ = load_requests_via_automation; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle_top_level_requests_ = handle_top_level_requests; 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch infobars_enabled_ = infobars_enabled; 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick route_all_top_level_navigations_ = route_all_top_level_navigations; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_window_style(WS_POPUP | WS_CLIPCHILDREN); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::WidgetWin::Init(NULL, bounds); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!IsWindow()) { 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(jcampan): limit focus traversal to contents. 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch prop_.reset(new ViewProp(GetNativeView(), kWindowObjectKey, this)); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (existing_contents) { 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_.reset(existing_contents); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->controller().set_profile(profile); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TabContents* new_contents = new TabContents(profile, NULL, MSG_ROUTING_NONE, 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NULL, NULL); 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_.reset(new TabContentsWrapper(new_contents)); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->tab_contents()->set_delegate(this); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->tab_contents()-> 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetMutableRendererPrefs()->browser_handles_top_level_requests = 16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen handle_top_level_requests; 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!existing_contents) { 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->render_view_host()->AllowBindings( 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BindingsPolicy::EXTERNAL_HOST); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationController* controller = &tab_contents_->controller(); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<NavigationController>(controller)); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR, 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<NavigationController>(controller)); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::LOAD_STOP, 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<NavigationController>(controller)); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB, 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Source<TabContents>(tab_contents_->tab_contents())); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::RENDER_VIEW_HOST_DELETED, 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::AllSources()); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::EXTERNAL_TAB_CREATED, 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<NavigationController>(controller), 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::NoDetails()); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start loading initial URL 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!initial_url.is_empty()) { 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Navigate out of context since we don't have a 'tab_handle_' yet. 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostTask( 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_method_factory_.NewRunnableMethod( 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &ExternalTabContainer::Navigate, initial_url, referrer)); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need WS_POPUP to be on the window during initialization, but 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // once initialized we apply the requested style which may or may not 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // include the popup bit. 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note that it's important to do this before we call SetParent since 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // during the SetParent call we will otherwise get a WA_ACTIVATE call 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that causes us to steal the current focus. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetWindowLong(GWL_STYLE, (GetWindowLong(GWL_STYLE) & ~WS_POPUP) | style); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now apply the parenting and style 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (parent) 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetParent(GetNativeView(), parent); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ::ShowWindow(tab_contents_->tab_contents()->GetNativeView(), SW_SHOWNA); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LoadAccelerators(); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetupExternalTabView(); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::Uninitialize() { 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.RemoveAll(); 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab_contents_.get()) { 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UnregisterRenderViewHost(tab_contents_->render_view_host()); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (GetRootView()) { 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetRootView()->RemoveAllChildViews(true); 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::EXTERNAL_TAB_CLOSED, 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<NavigationController>(&tab_contents_->controller()), 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<ExternalTabContainer>(this)); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_.reset(NULL); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (focus_manager_) { 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager_->UnregisterAccelerators(this); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager_ = NULL; 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_tab_view_ = NULL; 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request_context_ = NULL; 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_container_ = NULL; 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::Reinitialize( 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationProvider* automation_provider, 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter* filter, 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow parent_window) { 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!automation_provider || !filter) { 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_ = automation_provider; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_resource_message_filter_ = filter; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Wait for the automation channel to be initialized before resuming pending 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // render views and sending in the navigation state. 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostTask( 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_method_factory_.NewRunnableMethod( 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &ExternalTabContainer::OnReinitialize)); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (parent_window) 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetParent(GetNativeView(), parent_window); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::SetTabHandle(int handle) { 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_handle_ = handle; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) { 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NativeWebKeyboardEvent keyboard_event(msg.hwnd, msg.message, msg.wParam, 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch msg.lParam); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unhandled_keyboard_event_handler_.HandleKeyboardEvent(keyboard_event, 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager_); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::FocusThroughTabTraversal( 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reverse, bool restore_focus_to_view) { 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(tab_contents_.get()); 27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab_contents_.get()) 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->tab_contents()->Focus(); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The tab_contents_ member can get destroyed in the context of the call to 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TabContentsViewViews::Focus() above. This method eventually calls SetFocus 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on the native window, which could end up dispatching messages like 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // WM_DESTROY for the external tab. 28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (tab_contents_.get() && restore_focus_to_view) 28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->tab_contents()->FocusThroughTabTraversal(reverse); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::IsExternalTabContainer(HWND window) { 289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch return ViewProp::GetValue(window, kWindowObjectKey) != NULL; 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExternalTabContainer* ExternalTabContainer::GetContainerForTab( 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HWND tab_window) { 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HWND parent_window = ::GetParent(tab_window); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!::IsWindow(parent_window)) { 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!IsExternalTabContainer(parent_window)) { 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExternalTabContainer* container = reinterpret_cast<ExternalTabContainer*>( 303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ViewProp::GetValue(parent_window, kWindowObjectKey)); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return container; 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExternalTabContainer* 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExternalTabContainer::GetExternalContainerFromNativeWindow( 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeView native_window) { 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExternalTabContainer* tab_container = NULL; 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (native_window) { 313201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tab_container = reinterpret_cast<ExternalTabContainer*>( 314201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ViewProp::GetValue(native_window, kWindowObjectKey)); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return tab_container; 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalTabContainer, TabContentsDelegate implementation: 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::OpenURLFromTab(TabContents* source, 3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& url, 3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const GURL& referrer, 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WindowOpenDisposition disposition, 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick PageTransition::Type transition) { 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (pending()) { 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PendingTopLevelNavigation url_request; 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_request.disposition = disposition; 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_request.transition = transition; 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_request.url = url; 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_request.referrer = referrer; 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_open_url_requests_.push_back(url_request); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (disposition) { 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case CURRENT_TAB: 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SINGLETON_TAB: 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NEW_FOREGROUND_TAB: 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NEW_BACKGROUND_TAB: 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NEW_POPUP: 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NEW_WINDOW: 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case SAVE_TO_DISK: 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (automation_) { 34621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_OpenURL(tab_handle_, 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url, referrer, 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disposition)); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ananta) 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We should populate other fields in the 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ViewHostMsg_FrameNavigate_Params structure. Another option could be 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to refactor the UpdateHistoryForNavigation function in TabContents. 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ViewHostMsg_FrameNavigate_Params params; 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params.referrer = referrer; 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params.url = url; 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params.page_id = -1; 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch params.transition = PageTransition::LINK; 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationController::LoadCommittedDetails details; 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch details.did_replace_entry = false; 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<history::HistoryAddPageArgs> add_page_args( 36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->tab_contents()-> 36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CreateHistoryAddPageArgs(url, details, params)); 36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_->tab_contents()-> 36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UpdateHistoryForNavigation(add_page_args); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::NavigationStateChanged(const TabContents* source, 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unsigned changed_flags) { 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (automation_) { 37821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NavigationInfo nav_info; 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (InitNavigationInfo(&nav_info, NavigationType::NAV_IGNORE, 0)) 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_->Send(new AutomationMsg_NavigationStateChanged( 38121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen tab_handle_, changed_flags, nav_info)); 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::AddNewContents(TabContents* source, 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* new_contents, 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WindowOpenDisposition disposition, 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& initial_pos, 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool user_gesture) { 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!automation_) { 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(pending_); 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "Invalid automation provider. Dropping new contents notify"; 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete new_contents; 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<ExternalTabContainer> new_container; 398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If the host is a browser like IE8, then the URL being navigated to in the 399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // new tab contents could potentially navigate back to Chrome from a new 400731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // IE process. We support full tab mode only for IE and hence we use that as 401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // a determining factor in whether the new ExternalTabContainer instance is 402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // created as pending or not. 403731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!route_all_top_level_navigations_) { 404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new_container = new ExternalTabContainer(NULL, NULL); 405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Reuse the same tab handle here as the new container instance is a dummy 407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // instance which does not have an automation client connected at the other 408731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // end. 409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new_container = new TemporaryPopupExternalTabContainer( 410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick automation_, automation_resource_message_filter_.get()); 411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new_container->SetTabHandle(tab_handle_); 412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure that ExternalTabContainer instance is initialized with 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // an unwrapped Profile. 41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<TabContentsWrapper> wrapper(new TabContentsWrapper(new_contents)); 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool result = new_container->Init( 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new_contents->profile()->GetOriginalProfile(), 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch initial_pos, 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WS_CHILD, 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch load_requests_via_automation_, 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle_top_level_requests_, 42472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wrapper.get(), 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(), 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL(), 427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick true, 428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick route_all_top_level_navigations_); 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (result) { 43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen wrapper.release(); // Ownership has been transferred. 432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (route_all_top_level_navigations_) { 433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uintptr_t cookie = reinterpret_cast<uintptr_t>(new_container.get()); 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_tabs_.Get()[cookie] = new_container; 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new_container->set_pending(true); 438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new_container->set_is_popup_window(disposition == NEW_POPUP); 43921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AttachExternalTabParams attach_params_; 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch attach_params_.cookie = static_cast<uint64>(cookie); 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch attach_params_.dimensions = initial_pos; 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch attach_params_.user_gesture = user_gesture; 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch attach_params_.disposition = disposition; 4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick attach_params_.profile_name = WideToUTF8( 4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick tab_contents()->profile()->GetPath().DirName().BaseName().value()); 44621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_AttachExternalTab( 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_handle_, attach_params_)); 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::TabContentsCreated(TabContents* new_contents) { 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* rvh = new_contents->render_view_host(); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(rvh != NULL); 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Register this render view as a pending render view, i.e. any network 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // requests initiated by this render view would be serviced when the 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // external host connects to the new external tab instance. 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRenderViewHostForAutomation(rvh, true); 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::infobars_enabled() { 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return infobars_enabled_; 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::ActivateContents(TabContents* contents) { 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExternalTabContainer::DeactivateContents(TabContents* contents) { 4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::LoadingStateChanged(TabContents* source) { 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::CloseContents(TabContents* source) { 4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!automation_) 4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (unload_reply_message_) { 4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutomationMsg_RunUnloadHandlers::WriteReplyParams(unload_reply_message_, 4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick true); 4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick automation_->Send(unload_reply_message_); 4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unload_reply_message_ = NULL; 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 48621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_CloseExternalTab(tab_handle_)); 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::MoveContents(TabContents* source, 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const gfx::Rect& pos) { 492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (automation_ && is_popup_window_) 493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen automation_->Send(new AutomationMsg_MoveWindow(tab_handle_, pos)); 494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ExternalTabContainer::IsPopup(const TabContents* source) const { 497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return is_popup_window_; 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::UpdateTargetURL(TabContents* source, 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) { 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (automation_) { 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::wstring url_string = CA2W(url.spec().c_str()); 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_->Send( 50521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen new AutomationMsg_UpdateTargetUrl(tab_handle_, url_string)); 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::ContentsZoomChange(bool zoom_in) { 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::ForwardMessageToExternalHost( 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& message, const std::string& origin, 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& target) { 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (automation_) { 51621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_ForwardMessageToExternalHost( 51721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen tab_handle_, message, origin, target)); 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool ExternalTabContainer::IsExternalTabContainer() const { 5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return true; 5233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochgfx::NativeWindow ExternalTabContainer::GetFrameNativeWindow() { 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return hwnd(); 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::TakeFocus(bool reverse) { 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (automation_) { 53121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_TabbedOut(tab_handle_, 5323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::win::IsShiftPressed())); 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::CanDownload(int request_id) { 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (load_requests_via_automation_) { 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (automation_) { 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // In case the host needs to show UI that needs to take the focus. 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::AllowSetForegroundWindow(ASFW_ANY); 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 544731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(automation_resource_message_filter_.get(), 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &AutomationResourceMessageFilter::SendDownloadRequestToHost, 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0, tab_handle_, request_id)); 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DLOG(WARNING) << "Downloads are only supported with host browser network " 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "stack enabled."; 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Never allow downloads. 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::ShowPageInfo(Profile* profile, 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NavigationEntry::SSLStatus& ssl, 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool show_history) { 562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick POINT cursor_pos = {0}; 563731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetCursorPos(&cursor_pos); 564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::Rect bounds; 566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bounds.set_origin(gfx::Point(cursor_pos)); 567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PageInfoBubbleView* page_info_bubble = 569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new ExternalTabPageInfoBubbleView(this, NULL, profile, url, 570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ssl, show_history); 571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Bubble* bubble = Bubble::Show(this, bounds, BubbleBorder::TOP_LEFT, 572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen page_info_bubble, page_info_bubble); 573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen page_info_bubble->set_bubble(bubble); 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::RegisterRenderViewHostForAutomation( 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* render_view_host, bool pending_view) { 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (render_view_host) { 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter::RegisterRenderView( 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_view_host->process()->id(), 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_view_host->routing_id(), 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_handle(), 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_resource_message_filter_, 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_view); 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::RegisterRenderViewHost( 589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* render_view_host) { 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // RenderViewHost instances that are to be associated with this 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ExternalTabContainer should share the same resource request automation 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // settings. 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRenderViewHostForAutomation( 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_view_host, 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false); // Network requests should not be handled later. 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::UnregisterRenderViewHost( 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* render_view_host) { 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Undo the resource automation registration performed in 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ExternalTabContainer::RegisterRenderViewHost. 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (render_view_host) { 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter::UnRegisterRenderView( 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_view_host->process()->id(), 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_view_host->routing_id()); 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::HandleContextMenu(const ContextMenuParams& params) { 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!automation_) { 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_context_menu_.reset( 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new RenderViewContextMenuViews(tab_contents(), params)); 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_context_menu_->SetExternal(); 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_context_menu_->Init(); 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_context_menu_->UpdateMenuItemStates(); 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch POINT screen_pt = { params.x, params.y }; 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MapWindowPoints(GetNativeView(), HWND_DESKTOP, &screen_pt, 1); 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen MiniContextMenuParams ipc_params( 62421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen screen_pt.x, 62521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen screen_pt.y, 62621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen params.link_url, 62721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen params.unfiltered_link_url, 62821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen params.src_url, 62921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen params.page_url, 63021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen params.frame_url); 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool rtl = base::i18n::IsRTL(); 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_->Send( 63421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen new AutomationMsg_ForwardContextMenuToExternalHost(tab_handle_, 635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_context_menu_->GetMenuHandle(), 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rtl ? TPM_RIGHTALIGN : TPM_LEFTALIGN, ipc_params)); 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::ExecuteContextMenuCommand(int command) { 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!external_context_menu_.get()) { 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (command) { 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDS_CONTENT_CONTEXT_SAVEAUDIOAS: 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDS_CONTENT_CONTEXT_SAVEVIDEOAS: 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDS_CONTENT_CONTEXT_SAVEIMAGEAS: 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDS_CONTENT_CONTEXT_SAVELINKAS: { 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); // Should be handled in host. 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_context_menu_->ExecuteCommand(command); 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::PreHandleKeyboardEvent( 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NativeWebKeyboardEvent& event, bool* is_keyboard_shortcut) { 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::HandleKeyboardEvent( 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NativeWebKeyboardEvent& event) { 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProcessUnhandledKeyStroke(event.os_event.hwnd, event.os_event.message, 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event.os_event.wParam, event.os_event.lParam); 670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::ShowHtmlDialog(HtmlDialogUIDelegate* delegate, 673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow parent_window) { 674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!browser_.get()) { 675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick browser_.reset(Browser::CreateForType(Browser::TYPE_POPUP, 676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick tab_contents_->profile())); 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::NativeWindow parent = parent_window ? parent_window : GetParent(); 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_->window()->ShowHTMLDialog(delegate, parent); 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExternalTabContainer::BeforeUnloadFired(TabContents* tab, 6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool proceed, 6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool* proceed_to_fire_unload) { 6863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *proceed_to_fire_unload = true; 6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!automation_) { 6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick delete unload_reply_message_; 6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unload_reply_message_ = NULL; 6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 6923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 6933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!unload_reply_message_) { 695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "**** NULL unload reply message pointer."; 696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!proceed) { 7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutomationMsg_RunUnloadHandlers::WriteReplyParams(unload_reply_message_, 7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick automation_->Send(unload_reply_message_); 7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unload_reply_message_ = NULL; 7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *proceed_to_fire_unload = false; 7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 70821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ExternalTabContainer::ShowRepostFormWarningDialog( 70921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TabContents* tab_contents) { 71021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen browser::ShowRepostFormWarningDialog(GetNativeView(), tab_contents); 71121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 71221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalTabContainer, NotificationObserver implementation: 715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::Observe(NotificationType type, 717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details) { 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!automation_) 720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kHttpClientErrorStart = 400; 723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kHttpServerErrorEnd = 510; 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (type.value) { 726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NotificationType::LOAD_STOP: { 727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const LoadNotificationDetails* load = 728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<LoadNotificationDetails>(details).ptr(); 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (load != NULL && PageTransition::IsMainFrame(load->origin())) { 7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TRACE_EVENT_END("ExternalTabContainer::Navigate", 0, 7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick load->url().spec()); 73221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_TabLoaded(tab_handle_, 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch load->url())); 734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NotificationType::NAV_ENTRY_COMMITTED: { 738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ignore_next_load_notification_) { 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ignore_next_load_notification_ = false; 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NavigationController::LoadCommittedDetails* commit = 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<NavigationController::LoadCommittedDetails>(details).ptr(); 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (commit->http_status_code >= kHttpClientErrorStart && 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch commit->http_status_code <= kHttpServerErrorEnd) { 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_->Send(new AutomationMsg_NavigationFailed( 74921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen tab_handle_, commit->http_status_code, commit->entry->url())); 750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ignore_next_load_notification_ = true; 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 75321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NavigationInfo navigation_info; 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // When the previous entry index is invalid, it will be -1, which 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // will still make the computation come out right (navigating to the 756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 0th entry will be +1). 757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (InitNavigationInfo(&navigation_info, commit->type, 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch commit->previous_entry_index - 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->controller().last_committed_entry_index())) 76021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_DidNavigate(tab_handle_, 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch navigation_info)); 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NotificationType::FAIL_PROVISIONAL_LOAD_WITH_ERROR: { 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ProvisionalLoadDetails* load_details = 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<ProvisionalLoadDetails>(details).ptr(); 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_->Send(new AutomationMsg_NavigationFailed( 76921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen tab_handle_, load_details->error_code(), load_details->url())); 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ignore_next_load_notification_ = true; 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB: { 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (load_requests_via_automation_) { 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* rvh = Details<RenderViewHost>(details).ptr(); 777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRenderViewHostForAutomation(rvh, false); 778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NotificationType::RENDER_VIEW_HOST_DELETED: { 782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (load_requests_via_automation_) { 783ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RenderViewHost* rvh = Source<RenderViewHost>(source).ptr(); 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UnregisterRenderViewHost(rvh); 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalTabContainer, views::WidgetWin overrides: 795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 796c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLRESULT ExternalTabContainer::OnCreate(LPCREATESTRUCT create_struct) { 797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LRESULT result = views::WidgetWin::OnCreate(create_struct); 798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (result == 0) { 799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Grab a reference here which will be released in OnFinalMessage 800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddRef(); 801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::OnDestroy() { 806513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch prop_.reset(); 807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Uninitialize(); 808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WidgetWin::OnDestroy(); 809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser_.get()) { 810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::DestroyWindow(browser_->window()->GetNativeHandle()); 811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::OnFinalMessage(HWND window) { 815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Release the reference which we grabbed in WM_CREATE. 816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Release(); 817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExternalTabContainer::RunUnloadHandlers(IPC::Message* reply_message) { 8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!automation_) { 8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick delete reply_message; 8223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If we have a pending unload message, then just respond back to this 8263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // request and continue processing the previous unload message. 8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (unload_reply_message_) { 8283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutomationMsg_RunUnloadHandlers::WriteReplyParams(reply_message, true); 8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick automation_->Send(reply_message); 8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unload_reply_message_ = reply_message; 834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool wait_for_unload_handlers = 835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen tab_contents_.get() && 836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Browser::RunUnloadEventsHelper(tab_contents_->tab_contents()); 837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!wait_for_unload_handlers) { 8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AutomationMsg_RunUnloadHandlers::WriteReplyParams(reply_message, true); 8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick automation_->Send(reply_message); 840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen unload_reply_message_ = NULL; 841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalTabContainer, private: 846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::ProcessUnhandledKeyStroke(HWND window, 847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UINT message, 848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WPARAM wparam, 849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LPARAM lparam) { 850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!automation_) { 851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 8533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen if ((wparam == VK_TAB) && !base::win::IsCtrlPressed()) { 854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tabs are handled separately (except if this is Ctrl-Tab or 855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ctrl-Shift-Tab) 856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Send this keystroke to the external host as it could be processed as an 860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // accelerator there. If the host does not handle this accelerator, it will 861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // reflect the accelerator back to us via the ProcessUnhandledAccelerator 862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // method. 863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MSG msg = {0}; 864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch msg.hwnd = window; 865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch msg.message = message; 866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch msg.wParam = wparam; 867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch msg.lParam = lparam; 86821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen automation_->Send(new AutomationMsg_HandleAccelerator(tab_handle_, msg)); 869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool ExternalTabContainer::InitNavigationInfo(NavigationInfo* nav_info, 873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationType::Type nav_type, 874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int relative_offset) { 875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(nav_info); 876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NavigationEntry* entry = tab_contents_->controller().GetActiveEntry(); 877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If this is very early in the game then we may not have an entry. 878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!entry) 879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->navigation_type = nav_type; 882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->relative_offset = relative_offset; 883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->navigation_index = 884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->controller().GetCurrentEntryIndex(); 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->url = entry->url(); 8863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick nav_info->referrer = entry->referrer(); 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->title = UTF16ToWideHack(entry->title()); 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (nav_info->title.empty()) 889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->title = UTF8ToWide(nav_info->url.spec()); 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->security_style = entry->ssl().security_style(); 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->displayed_insecure_content = 893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry->ssl().displayed_insecure_content(); 894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nav_info->ran_insecure_content = entry->ssl().ran_insecure_content(); 895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochscoped_refptr<ExternalTabContainer> ExternalTabContainer::RemovePendingTab( 899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uintptr_t cookie) { 900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExternalTabContainer::PendingTabs& pending_tabs = pending_tabs_.Get(); 901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PendingTabs::iterator index = pending_tabs.find(cookie); 902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (index != pending_tabs.end()) { 903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<ExternalTabContainer> container = (*index).second; 904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_tabs.erase(index); 905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return container; 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Failed to find ExternalTabContainer for cookie: " 909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch << cookie; 910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSkColor ExternalTabContainer::GetInfoBarSeparatorColor() const { 914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return ResourceBundle::toolbar_separator_color; 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ExternalTabContainer::InfoBarContainerStateChanged(bool is_animating) { 91872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (external_tab_view_) 919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_tab_view_->Layout(); 920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ExternalTabContainer::DrawInfoBarArrows(int* x) const { 923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalTabContainer instances do not have a window. 927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::Window* ExternalTabContainer::GetWindow() { 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::AcceleratorPressed( 932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const views::Accelerator& accelerator) { 933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::map<views::Accelerator, int>::const_iterator iter = 934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch accelerator_table_.find(accelerator); 935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(iter != accelerator_table_.end()); 936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 93772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!tab_contents_.get() || !tab_contents_->render_view_host()) { 938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int command_id = iter->second; 943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (command_id) { 944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_ZOOM_PLUS: 945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->render_view_host()->Zoom(PageZoom::ZOOM_IN); 946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_ZOOM_NORMAL: 948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->render_view_host()->Zoom(PageZoom::RESET); 949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_ZOOM_MINUS: 951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->render_view_host()->Zoom(PageZoom::ZOOM_OUT); 952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_DEV_TOOLS: 954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DevToolsManager::GetInstance()->ToggleDevToolsWindow( 955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->render_view_host(), DEVTOOLS_TOGGLE_ACTION_NONE); 956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_DEV_TOOLS_CONSOLE: 958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DevToolsManager::GetInstance()->ToggleDevToolsWindow( 959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->render_view_host(), 960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DEVTOOLS_TOGGLE_ACTION_SHOW_CONSOLE); 961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case IDC_DEV_TOOLS_INSPECT: 963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DevToolsManager::GetInstance()->ToggleDevToolsWindow( 964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->render_view_host(), 965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DEVTOOLS_TOGGLE_ACTION_INSPECT); 966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Unsupported accelerator: " << command_id; 969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::Navigate(const GURL& url, const GURL& referrer) { 97572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!tab_contents_.get()) { 976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TRACE_EVENT_BEGIN("ExternalTabContainer::Navigate", 0, url.spec()); 9813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_->controller().LoadURL(url, referrer, 983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageTransition::START_PAGE); 984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalTabContainer::OnGoToEntryOffset(int offset) { 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (load_requests_via_automation_) { 988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_->Send(new AutomationMsg_RequestGoToHistoryEntryOffset( 98921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen tab_handle_, offset)); 990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::LoadAccelerators() { 997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HACCEL accelerator_table = AtlLoadAccelerators(IDR_CHROMEFRAME); 998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(accelerator_table); 999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We have to copy the table to access its contents. 1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int count = CopyAcceleratorTable(accelerator_table, 0, 0); 1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count == 0) { 1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Nothing to do in that case. 1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<ACCEL> scoped_accelerators(new ACCEL[count]); 1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ACCEL* accelerators = scoped_accelerators.get(); 1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(accelerators != NULL); 1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CopyAcceleratorTable(accelerator_table, accelerators, count); 1012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager_ = GetFocusManager(); 1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(focus_manager_); 1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's fill our own accelerator table. 1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < count; ++i) { 1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool alt_down = (accelerators[i].fVirt & FALT) == FALT; 1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ctrl_down = (accelerators[i].fVirt & FCONTROL) == FCONTROL; 1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool shift_down = (accelerators[i].fVirt & FSHIFT) == FSHIFT; 1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::Accelerator accelerator( 102272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<ui::KeyboardCode>(accelerators[i].key), 1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch shift_down, ctrl_down, alt_down); 1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch accelerator_table_[accelerator] = accelerators[i].cmd; 1025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Also register with the focus manager. 1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (focus_manager_) 1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager_->RegisterAccelerator(accelerator, this); 1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::OnReinitialize() { 1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (load_requests_via_automation_) { 1034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* rvh = tab_contents_->render_view_host(); 1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (rvh) { 1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationResourceMessageFilter::ResumePendingRenderView( 1037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rvh->process()->id(), rvh->routing_id(), 1038c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_handle_, automation_resource_message_filter_); 1039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1041c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NavigationStateChanged(tab_contents(), 0); 1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ServicePendingOpenURLRequests(); 1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::ServicePendingOpenURLRequests() { 1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(pending()); 1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_pending(false); 1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t index = 0; index < pending_open_url_requests_.size(); 105272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ++index) { 1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const PendingTopLevelNavigation& url_request = 1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_open_url_requests_[index]; 105572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OpenURLFromTab(tab_contents(), url_request.url, url_request.referrer, 1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_request.disposition, url_request.transition); 1057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_open_url_requests_.clear(); 1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalTabContainer::SetupExternalTabView() { 1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a TabContentsContainer to handle focus cycling using Tab and 1063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Shift-Tab. 1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_container_ = new TabContentsContainer; 1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The views created here will be destroyed when the ExternalTabContainer 1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // widget is torn down. 1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_tab_view_ = new views::View(); 1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1070ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InfoBarContainerView* info_bar_container = new InfoBarContainerView(this); 107172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen info_bar_container->ChangeTabContents(tab_contents()); 1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout* layout = new views::GridLayout(external_tab_view_); 1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Give this column an identifier of 0. 1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::ColumnSet* columns = layout->AddColumnSet(0); 1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch columns->AddColumn(views::GridLayout::FILL, 1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::FILL, 1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1, 1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::GridLayout::USE_PREF, 1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0, 1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0); 1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch external_tab_view_->SetLayoutManager(layout); 1084c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(0, 0); 1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(info_bar_container); 1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->StartRow(1, 0); 1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch layout->AddView(tab_contents_container_); 1089c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetContentsView(external_tab_view_); 1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note that SetTabContents must be called after AddChildView is called 109172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen tab_contents_container_->ChangeTabContents(tab_contents()); 1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1093731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1094731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTemporaryPopupExternalTabContainer::TemporaryPopupExternalTabContainer( 1095731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AutomationProvider* automation, 1096731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AutomationResourceMessageFilter* filter) 1097731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : ExternalTabContainer(automation, filter) { 1098731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1099731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1100731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTemporaryPopupExternalTabContainer::~TemporaryPopupExternalTabContainer() { 1101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DVLOG(1) << __FUNCTION__; 1102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid TemporaryPopupExternalTabContainer::OpenURLFromTab( 1105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TabContents* source, const GURL& url, const GURL& referrer, 1106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WindowOpenDisposition disposition, PageTransition::Type transition) { 1107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!automation_) 1108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 1109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (disposition == CURRENT_TAB) { 1111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(route_all_top_level_navigations_); 1112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick disposition = NEW_FOREGROUND_TAB; 1113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExternalTabContainer::OpenURLFromTab(source, url, referrer, disposition, 1115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick transition); 1116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // support only one navigation for a dummy tab before it is killed. 1117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ::DestroyWindow(GetNativeView()); 1118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1119