Index: chrome/browser/ui/user_manager.cc |
diff --git a/chrome/browser/ui/user_manager.cc b/chrome/browser/ui/user_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2e826f861b27d3b9637319f85e99e121a9cbac65 |
--- /dev/null |
+++ b/chrome/browser/ui/user_manager.cc |
@@ -0,0 +1,60 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/user_manager.h" |
+ |
+#include "chrome/browser/signin/signin_promo.h" |
+#include "components/guest_view/browser/guest_view_manager.h" |
+#include "google_apis/gaia/gaia_urls.h" |
+ |
+namespace { |
+ |
+bool AddToSet(std::set<content::WebContents*>* content_set, |
+ content::WebContents* web_contents) { |
+ content_set->insert(web_contents); |
+ return false; |
+} |
+ |
+} // namespace |
+ |
+UserManager::ReauthDialogObserver::ReauthDialogObserver( |
+ content::WebContents* web_contents, const std::string& email_address) |
+ : email_address_(email_address) { |
+ // Observe navigations of the web contents so that the dialog can close itself |
+ // when the sign in process is done. |
+ Observe(web_contents); |
+} |
+ |
+void UserManager::ReauthDialogObserver::DidStopLoading() { |
+ // If the sign in process reaches the termination URL, close the dialog. |
+ // Make sure to remove any parts of the URL that gaia might append during |
+ // signin. |
+ GURL url = web_contents()->GetURL(); |
+ url::Replacements<char> replacements; |
+ replacements.ClearQuery(); |
+ replacements.ClearRef(); |
+ if (url.ReplaceComponents(replacements) == |
+ GaiaUrls::GetInstance()->signin_completed_continue_url()) { |
+ CloseReauthDialog(); |
+ return; |
+ } |
+ |
+ // If still observing the top level web contents, try to find the embedded |
+ // webview and observe it instead. The webview may not be found in the |
+ // initial page load since it loads asynchronously. |
+ if (url.GetOrigin() != |
+ signin::GetReauthURLWithEmail(email_address_).GetOrigin()) { |
+ return; |
+ } |
+ |
+ std::set<content::WebContents*> content_set; |
+ guest_view::GuestViewManager* manager = |
+ guest_view::GuestViewManager::FromBrowserContext( |
+ web_contents()->GetBrowserContext()); |
+ if (manager) |
+ manager->ForEachGuest(web_contents(), base::Bind(&AddToSet, &content_set)); |
+ DCHECK_LE(content_set.size(), 1U); |
+ if (!content_set.empty()) |
+ Observe(*content_set.begin()); |
+} |