168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_sign_in_delegate.h" 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/autofill/autofill_dialog_view.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/content/browser/wallet/wallet_service_url.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/render_view_host.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/web_contents.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/renderer_preferences.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/window_open_disposition.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace autofill { 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::OpenURLParams; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Signals if |params| require opening inside the current WebContents. 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsInPageTransition(const OpenURLParams& params) { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return params.disposition == CURRENT_TAB; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Indicates if the open action specified by |params| should happen in the 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Autofill dialog (when true) or in the browser (when false). 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ShouldOpenInBrowser(const OpenURLParams& params) { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !IsInPageTransition(params) || !wallet::IsSignInRelatedUrl(params.url); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Adjusts |params| to account for the fact that the open request originated in 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the dialog, but will be executed in the browser. 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)OpenURLParams AdjustToOpenInBrowser(const OpenURLParams& params) { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IsInPageTransition(params) || wallet::IsSignInRelatedUrl(params.url)) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return params; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::OpenURLParams new_params = params; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_params.disposition = NEW_FOREGROUND_TAB; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return new_params; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AutofillDialogSignInDelegate::AutofillDialogSignInDelegate( 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AutofillDialogView* dialog_view, 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* dialog_web_contents, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* originating_web_contents, 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Size& minimum_size, 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Size& maximum_size) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : WebContentsObserver(dialog_web_contents), 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dialog_view_(dialog_view), 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) originating_web_contents_(originating_web_contents) { 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(dialog_view_); 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog_web_contents->SetDelegate(this); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::RendererPreferences* prefs = 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog_web_contents->GetMutableRendererPrefs(); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs->browser_handles_non_local_top_level_requests = true; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog_web_contents->GetRenderViewHost()->SyncRendererPrefs(); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) UpdateLimitsAndEnableAutoResize(minimum_size, maximum_size); 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogSignInDelegate::ResizeDueToAutoResize( 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::WebContents* source, 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::Size& preferred_size) { 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dialog_view_->OnSignInResize(preferred_size); 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)content::WebContents* AutofillDialogSignInDelegate::OpenURLFromTab( 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::WebContents* source, 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const content::OpenURLParams& params) { 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ShouldOpenInBrowser(params)) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return originating_web_contents_->OpenURL(AdjustToOpenInBrowser(params)); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source->GetController().LoadURL(params.url, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.referrer, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.transition, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string()); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return source; 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This gets invoked whenever there is an attempt to open a new window/tab. 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Reroute to the original browser. 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void AutofillDialogSignInDelegate::AddNewContents( 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::WebContents* source, 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::WebContents* new_contents, 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) WindowOpenDisposition disposition, 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const gfx::Rect& initial_pos, 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool user_gesture, 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool* was_blocked) { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::AddWebContents( 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::FindBrowserWithWebContents(originating_web_contents_), 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source, new_contents, disposition, initial_pos, user_gesture, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) was_blocked); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AutofillDialogSignInDelegate::PreHandleGestureEvent( 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* source, 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebGestureEvent& event) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Disable pinch zooming. 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return event.type == blink::WebGestureEvent::GesturePinchBegin || 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event.type == blink::WebGestureEvent::GesturePinchUpdate || 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event.type == blink::WebGestureEvent::GesturePinchEnd; 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AutofillDialogSignInDelegate::RenderViewCreated( 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::RenderViewHost* render_view_host) { 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EnableAutoResize(); 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Set the initial size as soon as we have an RVH to avoid bad size jumping. 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dialog_view_->OnSignInResize(minimum_size_); 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AutofillDialogSignInDelegate::UpdateLimitsAndEnableAutoResize( 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Size& minimum_size, 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Size& maximum_size) { 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) minimum_size_ = minimum_size; 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) maximum_size_ = maximum_size; 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EnableAutoResize(); 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AutofillDialogSignInDelegate::EnableAutoResize() { 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!minimum_size_.IsEmpty()); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!maximum_size_.IsEmpty()); 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::RenderViewHost* host = web_contents()->GetRenderViewHost(); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (host) 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host->EnableAutoResize(minimum_size_, maximum_size_); 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace autofill 135