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