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