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