Index: chrome/browser/android/tab_android.cc |
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc |
index baa0a000cb2aeef6856c7b08386b17534184d8da..f3bbf505358b3775452bff036bfd898c72427d4f 100644 |
--- a/chrome/browser/android/tab_android.cc |
+++ b/chrome/browser/android/tab_android.cc |
@@ -23,6 +23,7 @@ |
#include "chrome/browser/search/search.h" |
#include "chrome/browser/sessions/session_tab_helper.h" |
#include "chrome/browser/sync/glue/synced_tab_delegate_android.h" |
+#include "chrome/browser/tab_contents/tab_util.h" |
#include "chrome/browser/ui/android/content_settings/popup_blocked_infobar_delegate.h" |
#include "chrome/browser/ui/android/context_menu_helper.h" |
#include "chrome/browser/ui/android/infobars/infobar_container_android.h" |
@@ -48,6 +49,65 @@ |
#include "jni/Tab_jni.h" |
#include "third_party/WebKit/public/platform/WebReferrerPolicy.h" |
+using content::GlobalRequestID; |
+using content::NavigationController; |
+using content::WebContents; |
+ |
+namespace { |
+ |
+WebContents* CreateTargetContents(const chrome::NavigateParams& params, |
+ const GURL& url) { |
+ WebContents::CreateParams create_params( |
+ params.initiating_profile, |
+ tab_util::GetSiteInstanceForNewTab(params.initiating_profile, url)); |
+ if (params.source_contents) { |
+ create_params.initial_size = |
+ params.source_contents->GetContainerBounds().size(); |
+ if (params.should_set_opener) |
+ create_params.opener = params.source_contents; |
+ } |
+ if (params.disposition == NEW_BACKGROUND_TAB) |
+ create_params.initially_hidden = true; |
+ |
+ WebContents* target_contents = WebContents::Create(create_params); |
+ |
+ // New tabs can have WebUI URLs that will make calls back to arbitrary |
+ // tab helpers, so the entire set of tab helpers needs to be set up |
+ // immediately. |
+ TabAndroid::AttachTabHelpers(target_contents); |
+ return target_contents; |
+} |
+ |
+} // namespace |
+ |
+void TabAndroid::MakeLoadURLParam( |
Bernhard Bauer
2014/07/10 18:39:30
Please move this method to a position correspondin
Jitu( very slow this week)
2014/07/11 06:19:13
Done.
|
+ chrome::NavigateParams* params, |
+ NavigationController::LoadURLParams* load_url_params) { |
+ load_url_params->referrer = params->referrer; |
+ load_url_params->frame_tree_node_id = params->frame_tree_node_id; |
+ load_url_params->redirect_chain = params->redirect_chain; |
+ load_url_params->transition_type = params->transition; |
+ load_url_params->extra_headers = params->extra_headers; |
+ load_url_params->should_replace_current_entry = |
+ params->should_replace_current_entry; |
+ |
+ if (params->transferred_global_request_id != GlobalRequestID()) { |
+ load_url_params->is_renderer_initiated = params->is_renderer_initiated; |
+ load_url_params->transferred_global_request_id = |
+ params->transferred_global_request_id; |
+ } else if (params->is_renderer_initiated) { |
+ load_url_params->is_renderer_initiated = true; |
+ } |
+ |
+ // Only allows the browser-initiated navigation to use POST. |
+ if (params->uses_post && !params->is_renderer_initiated) { |
+ load_url_params->load_type = |
+ NavigationController::LOAD_TYPE_BROWSER_INITIATED_HTTP_POST; |
+ load_url_params->browser_initiated_post_data = |
+ params->browser_initiated_post_data; |
+ } |
+} |
+ |
TabAndroid* TabAndroid::FromWebContents(content::WebContents* web_contents) { |
CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(web_contents); |
if (!core_tab_helper) |
@@ -170,7 +230,22 @@ void TabAndroid::SetSyncId(int sync_id) { |
} |
void TabAndroid::HandlePopupNavigation(chrome::NavigateParams* params) { |
- NOTIMPLEMENTED(); |
+ if (!params->url.is_empty()) { |
+ bool was_blocked = false; |
+ GURL url = params->url; |
+ params->target_contents = CreateTargetContents(*params, url); |
+ NavigationController::LoadURLParams load_url_params(url); |
+ MakeLoadURLParam(params, &load_url_params); |
+ params->target_contents->GetController().LoadURLWithParams(load_url_params); |
+ web_contents_delegate_->AddNewContents(params->source_contents, |
+ params->target_contents, |
+ params->disposition, |
+ params->window_bounds, |
+ params->user_gesture, |
+ &was_blocked); |
+ if (was_blocked) |
+ params->target_contents = NULL; |
+ } |
} |
void TabAndroid::OnReceivedHttpAuthRequest(jobject auth_handler, |