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

Side by Side Diff: chrome/browser/ui/sync/one_click_signin_helper.cc

Issue 19699007: Ensure we don't crash if user navigates back from NTP to Chrome sign-in page before it has fully lo… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixing indent. Created 7 years, 5 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 | Annotate | Revision Log
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/ui/sync/one_click_signin_helper.h" 5 #include "chrome/browser/ui/sync/one_click_signin_helper.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 // We have to delay the cleaning until the new URL has finished loading because 469 // We have to delay the cleaning until the new URL has finished loading because
470 // we're not allowed to remove the last-loaded URL from the history. Objects 470 // we're not allowed to remove the last-loaded URL from the history. Objects
471 // of this type automatically self-destruct once they're finished their work. 471 // of this type automatically self-destruct once they're finished their work.
472 class CurrentHistoryCleaner : public content::WebContentsObserver { 472 class CurrentHistoryCleaner : public content::WebContentsObserver {
473 public: 473 public:
474 explicit CurrentHistoryCleaner(content::WebContents* contents); 474 explicit CurrentHistoryCleaner(content::WebContents* contents);
475 virtual ~CurrentHistoryCleaner(); 475 virtual ~CurrentHistoryCleaner();
476 476
477 // content::WebContentsObserver: 477 // content::WebContentsObserver:
478 virtual void WebContentsDestroyed(content::WebContents* contents) OVERRIDE; 478 virtual void WebContentsDestroyed(content::WebContents* contents) OVERRIDE;
479 virtual void DidStopLoading( 479 virtual void DidCommitProvisionalLoadForFrame(
480 int64 frame_id,
481 bool is_main_frame,
482 const GURL& url,
483 content::PageTransition transition_type,
480 content::RenderViewHost* render_view_host) OVERRIDE; 484 content::RenderViewHost* render_view_host) OVERRIDE;
481 485
482 private: 486 private:
483 scoped_ptr<content::WebContents> contents_; 487 scoped_ptr<content::WebContents> contents_;
484 int history_index_to_remove_; 488 int history_index_to_remove_;
485 489
486 DISALLOW_COPY_AND_ASSIGN(CurrentHistoryCleaner); 490 DISALLOW_COPY_AND_ASSIGN(CurrentHistoryCleaner);
487 }; 491 };
488 492
489 CurrentHistoryCleaner::CurrentHistoryCleaner(content::WebContents* contents) 493 CurrentHistoryCleaner::CurrentHistoryCleaner(content::WebContents* contents)
490 : WebContentsObserver(contents) { 494 : WebContentsObserver(contents) {
491 history_index_to_remove_ = 495 history_index_to_remove_ =
492 web_contents()->GetController().GetLastCommittedEntryIndex(); 496 web_contents()->GetController().GetLastCommittedEntryIndex();
493 } 497 }
494 498
495 CurrentHistoryCleaner::~CurrentHistoryCleaner() { 499 CurrentHistoryCleaner::~CurrentHistoryCleaner() {
496 } 500 }
497 501
498 void CurrentHistoryCleaner::DidStopLoading( 502 void CurrentHistoryCleaner::DidCommitProvisionalLoadForFrame(
503 int64 frame_id,
504 bool is_main_frame,
505 const GURL& url,
506 content::PageTransition transition_type,
499 content::RenderViewHost* render_view_host) { 507 content::RenderViewHost* render_view_host) {
508 // Return early if this is not top-level navigation.
509 if (!is_main_frame)
510 return;
511
500 content::NavigationController* nc = &web_contents()->GetController(); 512 content::NavigationController* nc = &web_contents()->GetController();
513
501 // Have to wait until something else gets added to history before removal. 514 // Have to wait until something else gets added to history before removal.
502 if (history_index_to_remove_ < nc->GetLastCommittedEntryIndex()) { 515 if (history_index_to_remove_ < nc->GetLastCommittedEntryIndex()) {
503 nc->RemoveEntryAtIndex(history_index_to_remove_); 516 content::NavigationEntry* entry =
504 delete this; // Success. 517 nc->GetEntryAtIndex(history_index_to_remove_);
518 if (SyncPromoUI::IsContinueUrlForWebBasedSigninFlow(entry->GetURL()) &&
519 nc->RemoveEntryAtIndex(history_index_to_remove_)) {
520 delete this; // Success.
521 }
505 } 522 }
506 } 523 }
507 524
508 void CurrentHistoryCleaner::WebContentsDestroyed( 525 void CurrentHistoryCleaner::WebContentsDestroyed(
509 content::WebContents* contents) { 526 content::WebContents* contents) {
510 delete this; // Failure. 527 delete this; // Failure.
511 } 528 }
512 529
513 void CloseTab(content::WebContents* tab) { 530 void CloseTab(content::WebContents* tab) {
514 Browser* browser = chrome::FindBrowserWithWebContents(tab); 531 Browser* browser = chrome::FindBrowserWithWebContents(tab);
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 helper->email_ = email; 916 helper->email_ = email;
900 917
901 if (continue_url.is_valid()) 918 if (continue_url.is_valid())
902 helper->continue_url_ = continue_url; 919 helper->continue_url_ = continue_url;
903 } 920 }
904 921
905 // static 922 // static
906 void OneClickSigninHelper::RemoveSigninRedirectURLHistoryItem( 923 void OneClickSigninHelper::RemoveSigninRedirectURLHistoryItem(
907 content::WebContents* web_contents) { 924 content::WebContents* web_contents) {
908 // Only actually remove the item if it's the blank.html continue url. 925 // Only actually remove the item if it's the blank.html continue url.
909 if (SyncPromoUI::IsContinueUrlForWebBasedSigninFlow(web_contents->GetURL())) 926 if (SyncPromoUI::IsContinueUrlForWebBasedSigninFlow(
927 web_contents->GetLastCommittedURL())) {
910 new CurrentHistoryCleaner(web_contents); // will self-destruct when done 928 new CurrentHistoryCleaner(web_contents); // will self-destruct when done
929 }
911 } 930 }
912 931
913 void OneClickSigninHelper::ShowSigninErrorBubble(Browser* browser, 932 void OneClickSigninHelper::ShowSigninErrorBubble(Browser* browser,
914 const std::string& error) { 933 const std::string& error) {
915 DCHECK(!error.empty()); 934 DCHECK(!error.empty());
916 935
917 browser->window()->ShowOneClickSigninBubble( 936 browser->window()->ShowOneClickSigninBubble(
918 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE, 937 BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE,
919 string16(), /* no SAML email */ 938 string16(), /* no SAML email */
920 UTF8ToUTF16(error), 939 UTF8ToUTF16(error),
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 if (manager && manager->IsSigninProcess(process_id)) 1053 if (manager && manager->IsSigninProcess(process_id))
1035 manager->ClearSigninProcess(); 1054 manager->ClearSigninProcess();
1036 } 1055 }
1037 } 1056 }
1038 1057
1039 void OneClickSigninHelper::DidStopLoading( 1058 void OneClickSigninHelper::DidStopLoading(
1040 content::RenderViewHost* render_view_host) { 1059 content::RenderViewHost* render_view_host) {
1041 // If the user left the sign in process, clear all members. 1060 // If the user left the sign in process, clear all members.
1042 // TODO(rogerta): might need to allow some youtube URLs. 1061 // TODO(rogerta): might need to allow some youtube URLs.
1043 content::WebContents* contents = web_contents(); 1062 content::WebContents* contents = web_contents();
1044 const GURL url = contents->GetURL(); 1063 const GURL url = contents->GetLastCommittedURL();
1045 Profile* profile = 1064 Profile* profile =
1046 Profile::FromBrowserContext(contents->GetBrowserContext()); 1065 Profile::FromBrowserContext(contents->GetBrowserContext());
1047 VLOG(1) << "OneClickSigninHelper::DidStopLoading: url=" << url.spec(); 1066 VLOG(1) << "OneClickSigninHelper::DidStopLoading: url=" << url.spec();
1048 1067
1049 // If an error has already occured during the sign in flow, make sure to 1068 // If an error has already occured during the sign in flow, make sure to
1050 // display it to the user and abort the process. Do this only for 1069 // display it to the user and abort the process. Do this only for
1051 // explicit sign ins. 1070 // explicit sign ins.
1052 // TODO(rogerta): Could we move this code back up to ShowInfoBarUIThread()? 1071 // TODO(rogerta): Could we move this code back up to ShowInfoBarUIThread()?
1053 if (!error_message_.empty() && auto_accept_ == AUTO_ACCEPT_EXPLICIT) { 1072 if (!error_message_.empty() && auto_accept_ == AUTO_ACCEPT_EXPLICIT) {
1054 VLOG(1) << "OneClickSigninHelper::DidStopLoading: error=" << error_message_; 1073 VLOG(1) << "OneClickSigninHelper::DidStopLoading: error=" << error_message_;
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 content::Referrer(), 1337 content::Referrer(),
1319 content::PAGE_TRANSITION_AUTO_TOPLEVEL, 1338 content::PAGE_TRANSITION_AUTO_TOPLEVEL,
1320 std::string()); 1339 std::string());
1321 } 1340 }
1322 } 1341 }
1323 1342
1324 // Clear the redirect URL. 1343 // Clear the redirect URL.
1325 redirect_url_ = GURL(); 1344 redirect_url_ = GURL();
1326 sync_service->RemoveObserver(this); 1345 sync_service->RemoveObserver(this);
1327 } 1346 }
OLDNEW
« no previous file with comments | « chrome/browser/signin/signin_browsertest.cc ('k') | content/browser/web_contents/navigation_controller_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698