15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/identity/web_auth_flow.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/base64.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/debug/trace_event.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/component_loader.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/extensions/api/identity_private.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/navigation_details.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_frame_host.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_details.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "crypto/random.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/guest_view/guest_view_base.h"
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "grit/browser_resources.h"
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceRedirectDetails;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsObserver;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace identity_private = api::identity_private;
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebAuthFlow::WebAuthFlow(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& provider_url,
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Mode mode)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(delegate),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_(profile),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      provider_url_(provider_url),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode_(mode),
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      embedded_window_created_(false) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebAuthFlow::~WebAuthFlow() {
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DCHECK(delegate_ == NULL);
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop listening to notifications first since some of the code
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // below may generate notifications.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.RemoveAll();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebContentsObserver::Observe(NULL);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!app_window_key_.empty()) {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AppWindowRegistry::Get(profile_)->RemoveObserver(this);
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (app_window_ && app_window_->web_contents())
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      app_window_->web_contents()->Close();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebAuthFlow::Start() {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AppWindowRegistry::Get(profile_)->AddObserver(this);
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Attach a random ID string to the window so we can recoginize it
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in OnAppWindowAdded.
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string random_bytes;
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  crypto::RandBytes(WriteInto(&random_bytes, 33), 32);
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Base64Encode(random_bytes, &app_window_key_);
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // identityPrivate.onWebFlowRequest(app_window_key, provider_url_, mode_)
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::ListValue> args(new base::ListValue());
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  args->AppendString(app_window_key_);
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  args->AppendString(provider_url_.spec());
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (mode_ == WebAuthFlow::INTERACTIVE)
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    args->AppendString("interactive");
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    args->AppendString("silent");
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<Event> event(
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new Event(identity_private::OnWebFlowRequest::kEventName, args.Pass()));
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  event->restrict_to_browser_context = profile_;
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ExtensionSystem* system = ExtensionSystem::Get(profile_);
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  extensions::ComponentLoader* component_loader =
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      system->extension_service()->component_loader();
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!component_loader->Exists(extension_misc::kIdentityApiUiAppId)) {
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    component_loader->Add(
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        IDR_IDENTITY_API_SCOPE_APPROVAL_MANIFEST,
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::FilePath(FILE_PATH_LITERAL("identity_scope_approval_dialog")));
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  system->event_router()->DispatchEventWithLazyListener(
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      extension_misc::kIdentityApiUiAppId, event.Pass());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebAuthFlow::DetachDelegateAndDelete() {
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  delegate_ = NULL;
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebAuthFlow::OnAppWindowAdded(AppWindow* app_window) {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (app_window->window_key() == app_window_key_ &&
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      app_window->extension_id() == extension_misc::kIdentityApiUiAppId) {
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    app_window_ = app_window;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebContentsObserver::Observe(app_window->web_contents());
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    registrar_.Add(
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        this,
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        content::NotificationService::AllBrowserContextsAndSources());
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebAuthFlow::OnAppWindowRemoved(AppWindow* app_window) {
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (app_window->window_key() == app_window_key_ &&
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      app_window->extension_id() == extension_misc::kIdentityApiUiAppId) {
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    app_window_ = NULL;
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    registrar_.RemoveAll();
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (delegate_)
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      delegate_->OnAuthFlowFailure(WebAuthFlow::WINDOW_CLOSED);
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebAuthFlow::BeforeUrlLoaded(const GURL& url) {
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_ && embedded_window_created_)
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    delegate_->OnAuthFlowURLChange(url);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebAuthFlow::AfterUrlLoaded() {
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_ && embedded_window_created_ && mode_ == WebAuthFlow::SILENT)
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->OnAuthFlowFailure(WebAuthFlow::INTERACTION_REQUIRED);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebAuthFlow::Observe(int type,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const content::NotificationSource& source,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const content::NotificationDetails& details) {
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(app_window_);
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!delegate_)
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!embedded_window_created_) {
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK(type == content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED);
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    RenderViewHost* render_view(
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        content::Details<RenderViewHost>(details).ptr());
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebContents* web_contents = WebContents::FromRenderViewHost(render_view);
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GuestViewBase* guest = GuestViewBase::FromWebContents(web_contents);
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WebContents* embedder = guest ? guest->embedder_web_contents() : NULL;
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (web_contents &&
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        (embedder == WebContentsObserver::web_contents())) {
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Switch from watching the app window to the guest inside it.
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      embedded_window_created_ = true;
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      WebContentsObserver::Observe(web_contents);
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      registrar_.RemoveAll();
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      registrar_.Add(this,
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT,
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     content::Source<WebContents>(web_contents));
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      registrar_.Add(this,
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     content::NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED,
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     content::Source<WebContents>(web_contents));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else {
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // embedded_window_created_
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    switch (type) {
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: {
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ResourceRedirectDetails* redirect_details =
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            content::Details<ResourceRedirectDetails>(details).ptr();
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (redirect_details != NULL)
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          BeforeUrlLoaded(redirect_details->new_url);
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case content::NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED: {
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        std::pair<content::NavigationEntry*, bool>* title =
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            content::Details<std::pair<content::NavigationEntry*, bool> >(
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                details).ptr();
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (title->first) {
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          delegate_->OnAuthFlowTitleChange(
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              base::UTF16ToUTF8(title->first->GetTitle()));
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      default:
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        NOTREACHED()
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            << "Got a notification that we did not register for: " << type;
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        break;
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid WebAuthFlow::RenderProcessGone(base::TerminationStatus status) {
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_)
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->OnAuthFlowFailure(WebAuthFlow::WINDOW_CLOSED);
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebAuthFlow::DidStartProvisionalLoadForFrame(
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::RenderFrameHost* render_frame_host,
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const GURL& validated_url,
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool is_error_page,
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool is_iframe_srcdoc) {
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!render_frame_host->GetParent())
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    BeforeUrlLoaded(validated_url);
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebAuthFlow::DidFailProvisionalLoad(
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::RenderFrameHost* render_frame_host,
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const GURL& validated_url,
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int error_code,
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::string16& error_description) {
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TRACE_EVENT_ASYNC_STEP_PAST1("identity",
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               "WebAuthFlow",
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               this,
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               "DidFailProvisionalLoad",
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               "error_code",
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               error_code);
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_)
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->OnAuthFlowFailure(LOAD_FAILED);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebAuthFlow::DidStopLoading(RenderViewHost* render_view_host) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AfterUrlLoaded();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebAuthFlow::DidNavigateMainFrame(
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const content::LoadCommittedDetails& details,
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const content::FrameNavigateParams& params) {
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_ && details.http_status_code >= 400)
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->OnAuthFlowFailure(LOAD_FAILED);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
246