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

Unified Diff: chrome/browser/external_tab_container_win.cc

Issue 3549006: Top level navigations are not sent to the host browser in the ChromeFrame NPA... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/external_tab_container_win.h ('k') | chrome/test/automation/automation_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/external_tab_container_win.cc
===================================================================
--- chrome/browser/external_tab_container_win.cc (revision 60826)
+++ chrome/browser/external_tab_container_win.cc (working copy)
@@ -61,7 +61,8 @@
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 @@
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 @@
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 @@
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 @@
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 @@
NOTREACHED();
return false;
}
-
external_context_menu_.reset(
new RenderViewContextMenuViews(tab_contents(), params));
external_context_menu_->SetExternal();
@@ -1020,3 +1040,30 @@
// 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());
+}
+
« no previous file with comments | « chrome/browser/external_tab_container_win.h ('k') | chrome/test/automation/automation_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698