Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / autofill / autofill_dialog_sign_in_delegate.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/autofill/autofill_dialog_sign_in_delegate.h"
6
7 #include "chrome/browser/ui/autofill/autofill_dialog_view.h"
8 #include "chrome/browser/ui/browser_finder.h"
9 #include "chrome/browser/ui/browser_tabstrip.h"
10 #include "components/autofill/content/browser/wallet/wallet_service_url.h"
11 #include "content/public/browser/render_view_host.h"
12 #include "content/public/browser/web_contents.h"
13 #include "content/public/common/renderer_preferences.h"
14 #include "third_party/WebKit/public/web/WebInputEvent.h"
15 #include "ui/base/window_open_disposition.h"
16
17 namespace autofill {
18
19 namespace {
20
21 using content::OpenURLParams;
22
23 // Signals if |params| require opening inside the current WebContents.
24 bool IsInPageTransition(const OpenURLParams& params) {
25   return params.disposition == CURRENT_TAB;
26 }
27
28 // Indicates if the open action specified by |params| should happen in the
29 // Autofill dialog (when true) or in the browser (when false).
30 bool ShouldOpenInBrowser(const OpenURLParams& params) {
31   return !IsInPageTransition(params) || !wallet::IsSignInRelatedUrl(params.url);
32 }
33
34 // Adjusts |params| to account for the fact that the open request originated in
35 // the dialog, but will be executed in the browser.
36 OpenURLParams AdjustToOpenInBrowser(const OpenURLParams& params) {
37   if (!IsInPageTransition(params) || wallet::IsSignInRelatedUrl(params.url))
38     return params;
39
40   content::OpenURLParams new_params = params;
41   new_params.disposition = NEW_FOREGROUND_TAB;
42   return new_params;
43 }
44
45 }  // namespace
46
47 AutofillDialogSignInDelegate::AutofillDialogSignInDelegate(
48     AutofillDialogView* dialog_view,
49     content::WebContents* dialog_web_contents,
50     content::WebContents* originating_web_contents,
51     const gfx::Size& minimum_size,
52     const gfx::Size& maximum_size)
53     : WebContentsObserver(dialog_web_contents),
54       dialog_view_(dialog_view),
55       originating_web_contents_(originating_web_contents) {
56   DCHECK(dialog_view_);
57   dialog_web_contents->SetDelegate(this);
58
59   content::RendererPreferences* prefs =
60       dialog_web_contents->GetMutableRendererPrefs();
61   prefs->browser_handles_non_local_top_level_requests = true;
62   dialog_web_contents->GetRenderViewHost()->SyncRendererPrefs();
63
64   UpdateLimitsAndEnableAutoResize(minimum_size, maximum_size);
65 }
66
67 void AutofillDialogSignInDelegate::ResizeDueToAutoResize(
68     content::WebContents* source,
69     const gfx::Size& preferred_size) {
70   dialog_view_->OnSignInResize(preferred_size);
71 }
72
73 content::WebContents* AutofillDialogSignInDelegate::OpenURLFromTab(
74     content::WebContents* source,
75     const content::OpenURLParams& params) {
76   if (ShouldOpenInBrowser(params))
77     return originating_web_contents_->OpenURL(AdjustToOpenInBrowser(params));
78
79   source->GetController().LoadURL(params.url,
80                                   params.referrer,
81                                   params.transition,
82                                   std::string());
83   return source;
84 }
85
86 // This gets invoked whenever there is an attempt to open a new window/tab.
87 // Reroute to the original browser.
88 void AutofillDialogSignInDelegate::AddNewContents(
89     content::WebContents* source,
90     content::WebContents* new_contents,
91     WindowOpenDisposition disposition,
92     const gfx::Rect& initial_pos,
93     bool user_gesture,
94     bool* was_blocked) {
95   chrome::AddWebContents(
96       chrome::FindBrowserWithWebContents(originating_web_contents_),
97       source, new_contents, disposition, initial_pos, user_gesture,
98       was_blocked);
99 }
100
101 bool AutofillDialogSignInDelegate::PreHandleGestureEvent(
102     content::WebContents* source,
103     const blink::WebGestureEvent& event) {
104   // Disable pinch zooming.
105   return event.type == blink::WebGestureEvent::GesturePinchBegin ||
106       event.type == blink::WebGestureEvent::GesturePinchUpdate ||
107       event.type == blink::WebGestureEvent::GesturePinchEnd;
108 }
109
110 void AutofillDialogSignInDelegate::RenderViewCreated(
111     content::RenderViewHost* render_view_host) {
112   EnableAutoResize();
113
114   // Set the initial size as soon as we have an RVH to avoid bad size jumping.
115   dialog_view_->OnSignInResize(minimum_size_);
116 }
117
118 void AutofillDialogSignInDelegate::UpdateLimitsAndEnableAutoResize(
119     const gfx::Size& minimum_size,
120     const gfx::Size& maximum_size) {
121   minimum_size_ = minimum_size;
122   maximum_size_ = maximum_size;
123   EnableAutoResize();
124 }
125
126 void AutofillDialogSignInDelegate::EnableAutoResize() {
127   DCHECK(!minimum_size_.IsEmpty());
128   DCHECK(!maximum_size_.IsEmpty());
129   content::RenderViewHost* host = web_contents()->GetRenderViewHost();
130   if (host)
131     host->EnableAutoResize(minimum_size_, maximum_size_);
132 }
133
134 }  // namespace autofill