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

Side by Side Diff: chrome/browser/extensions/api/identity/experimental_web_auth_flow.cc

Issue 14081014: Identity API: Change WebAuthFlow to use <webview> instead of a normal browser pop-up. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: chrome.identity side-by-side with chrome.experimental.identity Created 7 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/identity/web_auth_flow.h" 5 #include "chrome/browser/extensions/api/identity/experimental_web_auth_flow.h"
6 6
7 #include "base/location.h" 7 #include "base/location.h"
8 #include "chrome/browser/profiles/profile.h" 8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/ui/browser.h" 9 #include "chrome/browser/ui/browser.h"
10 #include "chrome/browser/ui/browser_navigator.h" 10 #include "chrome/browser/ui/browser_navigator.h"
11 #include "content/public/browser/load_notification_details.h" 11 #include "content/public/browser/load_notification_details.h"
12 #include "content/public/browser/navigation_controller.h" 12 #include "content/public/browser/navigation_controller.h"
13 #include "content/public/browser/notification_details.h" 13 #include "content/public/browser/notification_details.h"
14 #include "content/public/browser/notification_source.h" 14 #include "content/public/browser/notification_source.h"
15 #include "content/public/browser/notification_types.h" 15 #include "content/public/browser/notification_types.h"
16 #include "content/public/browser/resource_request_details.h" 16 #include "content/public/browser/resource_request_details.h"
17 #include "content/public/browser/web_contents.h" 17 #include "content/public/browser/web_contents.h"
18 #include "content/public/common/page_transition_types.h" 18 #include "content/public/common/page_transition_types.h"
19 #include "googleurl/src/gurl.h" 19 #include "googleurl/src/gurl.h"
20 #include "ui/base/window_open_disposition.h" 20 #include "ui/base/window_open_disposition.h"
21 21
22 using content::LoadNotificationDetails; 22 using content::LoadNotificationDetails;
23 using content::NavigationController; 23 using content::NavigationController;
24 using content::RenderViewHost; 24 using content::RenderViewHost;
25 using content::ResourceRedirectDetails; 25 using content::ResourceRedirectDetails;
26 using content::WebContents; 26 using content::WebContents;
27 using content::WebContentsObserver; 27 using content::WebContentsObserver;
28 28
29 namespace extensions { 29 namespace extensions {
30 30
31 WebAuthFlow::WebAuthFlow( 31 ExperimentalWebAuthFlow::ExperimentalWebAuthFlow(
32 Delegate* delegate, 32 Delegate* delegate,
33 Profile* profile, 33 Profile* profile,
34 const GURL& provider_url, 34 const GURL& provider_url,
35 Mode mode, 35 Mode mode,
36 const gfx::Rect& initial_bounds, 36 const gfx::Rect& initial_bounds,
37 chrome::HostDesktopType host_desktop_type) 37 chrome::HostDesktopType host_desktop_type)
38 : delegate_(delegate), 38 : delegate_(delegate),
39 profile_(profile), 39 profile_(profile),
40 provider_url_(provider_url), 40 provider_url_(provider_url),
41 mode_(mode), 41 mode_(mode),
42 initial_bounds_(initial_bounds), 42 initial_bounds_(initial_bounds),
43 host_desktop_type_(host_desktop_type), 43 host_desktop_type_(host_desktop_type),
44 popup_shown_(false), 44 popup_shown_(false),
45 contents_(NULL) { 45 contents_(NULL) {
46 } 46 }
47 47
48 WebAuthFlow::~WebAuthFlow() { 48 ExperimentalWebAuthFlow::~ExperimentalWebAuthFlow() {
49 // Stop listening to notifications first since some of the code 49 // Stop listening to notifications first since some of the code
50 // below may generate notifications. 50 // below may generate notifications.
51 registrar_.RemoveAll(); 51 registrar_.RemoveAll();
52 WebContentsObserver::Observe(NULL); 52 WebContentsObserver::Observe(NULL);
53 53
54 if (contents_) { 54 if (contents_) {
55 // The popup owns the contents if it was displayed. 55 // The popup owns the contents if it was displayed.
56 if (popup_shown_) 56 if (popup_shown_)
57 contents_->Close(); 57 contents_->Close();
58 else 58 else
59 delete contents_; 59 delete contents_;
60 } 60 }
61 } 61 }
62 62
63 void WebAuthFlow::Start() { 63 void ExperimentalWebAuthFlow::Start() {
64 contents_ = CreateWebContents(); 64 contents_ = CreateWebContents();
65 WebContentsObserver::Observe(contents_); 65 WebContentsObserver::Observe(contents_);
66 66
67 NavigationController* controller = &(contents_->GetController()); 67 NavigationController* controller = &(contents_->GetController());
68 68
69 // Register for appropriate notifications to intercept navigation to the 69 // Register for appropriate notifications to intercept navigation to the
70 // redirect URLs. 70 // redirect URLs.
71 registrar_.Add( 71 registrar_.Add(
72 this, 72 this,
73 content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, 73 content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT,
74 content::Source<WebContents>(contents_)); 74 content::Source<WebContents>(contents_));
75 75
76 controller->LoadURL( 76 controller->LoadURL(
77 provider_url_, 77 provider_url_,
78 content::Referrer(), 78 content::Referrer(),
79 content::PAGE_TRANSITION_AUTO_TOPLEVEL, 79 content::PAGE_TRANSITION_AUTO_TOPLEVEL,
80 std::string()); 80 std::string());
81 } 81 }
82 82
83 WebContents* WebAuthFlow::CreateWebContents() { 83 WebContents* ExperimentalWebAuthFlow::CreateWebContents() {
84 return WebContents::Create(WebContents::CreateParams(profile_)); 84 return WebContents::Create(WebContents::CreateParams(profile_));
85 } 85 }
86 86
87 void WebAuthFlow::ShowAuthFlowPopup() { 87 void ExperimentalWebAuthFlow::ShowAuthFlowPopup() {
88 Browser::CreateParams browser_params(Browser::TYPE_POPUP, profile_, 88 Browser::CreateParams browser_params(Browser::TYPE_POPUP, profile_,
89 host_desktop_type_); 89 host_desktop_type_);
90 browser_params.initial_bounds = initial_bounds_; 90 browser_params.initial_bounds = initial_bounds_;
91 Browser* browser = new Browser(browser_params); 91 Browser* browser = new Browser(browser_params);
92 chrome::NavigateParams params(browser, contents_); 92 chrome::NavigateParams params(browser, contents_);
93 params.disposition = CURRENT_TAB; 93 params.disposition = CURRENT_TAB;
94 params.window_action = chrome::NavigateParams::SHOW_WINDOW; 94 params.window_action = chrome::NavigateParams::SHOW_WINDOW;
95 chrome::Navigate(&params); 95 chrome::Navigate(&params);
96 // Observe method and WebContentsObserver::* methods will be called 96 // Observe method and WebContentsObserver::* methods will be called
97 // for varous navigation events. That is where we check for redirect 97 // for varous navigation events. That is where we check for redirect
98 // to the right URL. 98 // to the right URL.
99 popup_shown_ = true; 99 popup_shown_ = true;
100 } 100 }
101 101
102 void WebAuthFlow::BeforeUrlLoaded(const GURL& url) { 102 void ExperimentalWebAuthFlow::BeforeUrlLoaded(const GURL& url) {
103 delegate_->OnAuthFlowURLChange(url); 103 delegate_->OnAuthFlowURLChange(url);
104 } 104 }
105 105
106 void WebAuthFlow::AfterUrlLoaded() { 106 void ExperimentalWebAuthFlow::AfterUrlLoaded() {
107 // Do nothing if a popup is already created. 107 // Do nothing if a popup is already created.
108 if (popup_shown_) 108 if (popup_shown_)
109 return; 109 return;
110 110
111 // Report results directly if not in interactive mode. 111 // Report results directly if not in interactive mode.
112 if (mode_ != WebAuthFlow::INTERACTIVE) { 112 if (mode_ != ExperimentalWebAuthFlow::INTERACTIVE) {
113 delegate_->OnAuthFlowFailure(WebAuthFlow::INTERACTION_REQUIRED); 113 delegate_->OnAuthFlowFailure(ExperimentalWebAuthFlow::INTERACTION_REQUIRED);
114 return; 114 return;
115 } 115 }
116 116
117 // We are in interactive mode and window is not shown yet; show the window. 117 // We are in interactive mode and window is not shown yet; show the window.
118 ShowAuthFlowPopup(); 118 ShowAuthFlowPopup();
119 } 119 }
120 120
121 void WebAuthFlow::Observe(int type, 121 void ExperimentalWebAuthFlow::Observe(int type,
122 const content::NotificationSource& source, 122 const content::NotificationSource& source,
123 const content::NotificationDetails& details) { 123 const content::NotificationDetails& details) {
124 switch (type) { 124 switch (type) {
125 case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: { 125 case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: {
126 ResourceRedirectDetails* redirect_details = 126 ResourceRedirectDetails* redirect_details =
127 content::Details<ResourceRedirectDetails>(details).ptr(); 127 content::Details<ResourceRedirectDetails>(details).ptr();
128 if (redirect_details != NULL) 128 if (redirect_details != NULL)
129 BeforeUrlLoaded(redirect_details->new_url); 129 BeforeUrlLoaded(redirect_details->new_url);
130 } 130 }
131 break; 131 break;
132 default: 132 default:
133 NOTREACHED() << "Got a notification that we did not register for: " 133 NOTREACHED() << "Got a notification that we did not register for: "
134 << type; 134 << type;
135 break; 135 break;
136 } 136 }
137 } 137 }
138 138
139 void WebAuthFlow::ProvisionalChangeToMainFrameUrl( 139 void ExperimentalWebAuthFlow::ProvisionalChangeToMainFrameUrl(
140 const GURL& url, 140 const GURL& url,
141 RenderViewHost* render_view_host) { 141 RenderViewHost* render_view_host) {
142 BeforeUrlLoaded(url); 142 BeforeUrlLoaded(url);
143 } 143 }
144 144
145 void WebAuthFlow::DidStopLoading(RenderViewHost* render_view_host) { 145 void ExperimentalWebAuthFlow::DidStopLoading(RenderViewHost* render_view_host) {
146 AfterUrlLoaded(); 146 AfterUrlLoaded();
147 } 147 }
148 148
149 void WebAuthFlow::WebContentsDestroyed(WebContents* web_contents) { 149 void ExperimentalWebAuthFlow::WebContentsDestroyed(WebContents* web_contents) {
150 contents_ = NULL; 150 contents_ = NULL;
151 delegate_->OnAuthFlowFailure(WebAuthFlow::WINDOW_CLOSED); 151 delegate_->OnAuthFlowFailure(ExperimentalWebAuthFlow::WINDOW_CLOSED);
152 } 152 }
153 153
154 } // namespace extensions 154 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698