summaryrefslogtreecommitdiffstats
path: root/chrome/browser/external_tab_container_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/external_tab_container_win.cc')
-rw-r--r--chrome/browser/external_tab_container_win.cc59
1 files changed, 53 insertions, 6 deletions
diff --git a/chrome/browser/external_tab_container_win.cc b/chrome/browser/external_tab_container_win.cc
index d2abbb0..e591f94 100644
--- a/chrome/browser/external_tab_container_win.cc
+++ b/chrome/browser/external_tab_container_win.cc
@@ -61,7 +61,8 @@ ExternalTabContainer::ExternalTabContainer(
infobars_enabled_(true),
focus_manager_(NULL),
external_tab_view_(NULL),
- unload_reply_message_(NULL) {
+ unload_reply_message_(NULL),
+ route_all_top_level_navigations_(false) {
}
ExternalTabContainer::~ExternalTabContainer() {
@@ -77,7 +78,8 @@ bool ExternalTabContainer::Init(Profile* profile,
TabContents* existing_contents,
const GURL& initial_url,
const GURL& referrer,
- bool infobars_enabled) {
+ bool infobars_enabled,
+ bool route_all_top_level_navigations) {
if (IsWindow()) {
NOTREACHED();
return false;
@@ -86,6 +88,7 @@ bool ExternalTabContainer::Init(Profile* profile,
load_requests_via_automation_ = load_requests_via_automation;
handle_top_level_requests_ = handle_top_level_requests;
infobars_enabled_ = infobars_enabled;
+ route_all_top_level_navigations_ = route_all_top_level_navigations;
set_window_style(WS_POPUP | WS_CLIPCHILDREN);
views::WidgetWin::Init(NULL, bounds);
@@ -356,8 +359,22 @@ void ExternalTabContainer::AddNewContents(TabContents* source,
return;
}
- scoped_refptr<ExternalTabContainer> new_container =
- new ExternalTabContainer(NULL, NULL);
+ scoped_refptr<ExternalTabContainer> new_container;
+ // If the host is a browser like IE8, then the URL being navigated to in the
+ // new tab contents could potentially navigate back to Chrome from a new
+ // IE process. We support full tab mode only for IE and hence we use that as
+ // a determining factor in whether the new ExternalTabContainer instance is
+ // created as pending or not.
+ if (!route_all_top_level_navigations_) {
+ new_container = new ExternalTabContainer(NULL, NULL);
+ } else {
+ // Reuse the same tab handle here as the new container instance is a dummy
+ // instance which does not have an automation client connected at the other
+ // end.
+ new_container = new TemporaryPopupExternalTabContainer(
+ automation_, automation_resource_message_filter_.get());
+ new_container->SetTabHandle(tab_handle_);
+ }
// Make sure that ExternalTabContainer instance is initialized with
// an unwrapped Profile.
@@ -371,9 +388,13 @@ void ExternalTabContainer::AddNewContents(TabContents* source,
new_contents,
GURL(),
GURL(),
- true);
+ true,
+ route_all_top_level_navigations_);
if (result) {
+ if (route_all_top_level_navigations_) {
+ return;
+ }
uintptr_t cookie = reinterpret_cast<uintptr_t>(new_container.get());
pending_tabs_.Get()[cookie] = new_container;
new_container->set_pending(true);
@@ -545,7 +566,6 @@ bool ExternalTabContainer::HandleContextMenu(const ContextMenuParams& params) {
NOTREACHED();
return false;
}
-
external_context_menu_.reset(
new RenderViewContextMenuViews(tab_contents(), params));
external_context_menu_->SetExternal();
@@ -1020,3 +1040,30 @@ void ExternalTabContainer::SetupExternalTabView() {
// Note that SetTabContents must be called after AddChildView is called
tab_contents_container_->ChangeTabContents(tab_contents_);
}
+
+TemporaryPopupExternalTabContainer::TemporaryPopupExternalTabContainer(
+ AutomationProvider* automation,
+ AutomationResourceMessageFilter* filter)
+ : ExternalTabContainer(automation, filter) {
+}
+
+TemporaryPopupExternalTabContainer::~TemporaryPopupExternalTabContainer() {
+ DLOG(INFO) << __FUNCTION__;
+}
+
+void TemporaryPopupExternalTabContainer::OpenURLFromTab(
+ TabContents* source, const GURL& url, const GURL& referrer,
+ WindowOpenDisposition disposition, PageTransition::Type transition) {
+ if (!automation_)
+ return;
+
+ if (disposition == CURRENT_TAB) {
+ DCHECK(route_all_top_level_navigations_);
+ disposition = NEW_FOREGROUND_TAB;
+ }
+ ExternalTabContainer::OpenURLFromTab(source, url, referrer, disposition,
+ transition);
+ // support only one navigation for a dummy tab before it is killed.
+ ::DestroyWindow(GetNativeView());
+}
+