diff options
Diffstat (limited to 'chrome/browser/safe_browsing')
3 files changed, 42 insertions, 26 deletions
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc index 6c6433a..265e4c7 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc +++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc @@ -43,7 +43,7 @@ static const wchar_t* const kSbDiagnosticHtml = SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( SafeBrowsingService* sb_service, const SafeBrowsingService::BlockingPageParam& param) - : InterstitialPage(tab_util::GetTabContentsByID( + : InterstitialPage(tab_util::GetWebContentsByID( param.render_process_host_id, param.render_view_id), param.resource_type == ResourceType::MAIN_FRAME, param.url), @@ -55,6 +55,12 @@ SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( proceed_(false), did_notify_(false), is_main_frame_(param.resource_type == ResourceType::MAIN_FRAME) { + if (!is_main_frame_) { + navigation_entry_index_to_remove_ = + tab()->controller()->GetLastCommittedEntryIndex(); + } else { + navigation_entry_index_to_remove_ = -1; + } } SafeBrowsingBlockingPage::~SafeBrowsingBlockingPage() { @@ -138,8 +144,6 @@ std::string SafeBrowsingBlockingPage::GetHTMLContents() { } void SafeBrowsingBlockingPage::CommandReceived(const std::string& command) { - DCHECK(tab()->type() == TAB_CONTENTS_WEB); - WebContents* web = tab()->AsWebContents(); if (command == "2") { // User pressed "Learn more". GURL url; @@ -150,7 +154,7 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& command) { } else { NOTREACHED(); } - web->OpenURL(url, GURL(), CURRENT_TAB, PageTransition::LINK); + tab()->OpenURL(url, GURL(), CURRENT_TAB, PageTransition::LINK); return; } if (command == "3") { @@ -161,8 +165,8 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& command) { GURL report_url = safe_browsing_util::GeneratePhishingReportUrl(kSbReportPhishingUrl, url().spec()); - web->HideInterstitialPage(false, false); - web->OpenURL(report_url, GURL(), CURRENT_TAB, PageTransition::LINK); + Hide(); + tab()->OpenURL(report_url, GURL(), CURRENT_TAB, PageTransition::LINK); return; } if (command == "4") { @@ -173,33 +177,26 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& command) { GURL diagnostic_url(diagnostic); diagnostic_url = google_util::AppendGoogleLocaleParam(diagnostic_url); DCHECK(result_ == SafeBrowsingService::URL_MALWARE); - web->HideInterstitialPage(false, false); - web->OpenURL(diagnostic_url, GURL(), CURRENT_TAB, PageTransition::LINK); + tab()->OpenURL(diagnostic_url, GURL(), CURRENT_TAB, PageTransition::LINK); return; } proceed_ = command == "1"; - if (proceed_) { - if (is_main_frame_) - web->HideInterstitialPage(true, true); - else - web->HideInterstitialPage(false, false); - } else { - if (is_main_frame_) { - DontProceed(); - } else { - NavigationController* controller = web->controller(); - controller->RemoveEntryAtIndex(controller->GetLastCommittedEntryIndex(), - NewTabUIURL()); - } - } + if (proceed_) + Proceed(); + else + DontProceed(); + NotifyDone(); } -void SafeBrowsingBlockingPage::InterstitialClosed() { - NotifyDone(); - InterstitialPage::InterstitialClosed(); +void SafeBrowsingBlockingPage::DontProceed() { + if (navigation_entry_index_to_remove_ != -1) { + tab()->controller()->RemoveEntryAtIndex(navigation_entry_index_to_remove_, + NewTabUIURL()); + } + InterstitialPage::DontProceed(); // We are now deleted. } diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h index 056d9ae..b0fa2ea 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h +++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h @@ -38,7 +38,7 @@ class SafeBrowsingBlockingPage : public InterstitialPage { // InterstitialPage method: virtual std::string GetHTMLContents(); - virtual void InterstitialClosed(); + virtual void DontProceed(); protected: // InterstitialPage method: @@ -77,6 +77,10 @@ class SafeBrowsingBlockingPage : public InterstitialPage { // Whether the flagged resource is the main page (or a sub-resource is false). bool is_main_frame_; + // The index of a navigation entry that should be removed when DontProceed() + // is invoked, -1 if not entry should be removed. + int navigation_entry_index_to_remove_; + DISALLOW_COPY_AND_ASSIGN(SafeBrowsingBlockingPage); }; diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc index 837c11f..5a7a617 100644 --- a/chrome/browser/safe_browsing/safe_browsing_service.cc +++ b/chrome/browser/safe_browsing/safe_browsing_service.cc @@ -17,6 +17,7 @@ #include "chrome/browser/safe_browsing/protocol_manager.h" #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" #include "chrome/browser/safe_browsing/safe_browsing_database.h" +#include "chrome/browser/tab_util.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" @@ -281,6 +282,20 @@ void SafeBrowsingService::DisplayBlockingPage(const GURL& url, // Invoked on the UI thread. void SafeBrowsingService::DoDisplayBlockingPage( const BlockingPageParam& param) { + // The tab might have been closed. + if (!tab_util::GetWebContentsByID(param.render_process_host_id, + param.render_view_id)) { + // The tab is gone and we did not have a chance at showing the interstitial. + // Just act as "Don't Proceed" was chosen. + base::Thread* io_thread = g_browser_process->io_thread(); + if (!io_thread) + return; + BlockingPageParam response_param = param; + response_param.proceed = false; + io_thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( + this, &SafeBrowsingService::OnBlockingPageDone, response_param)); + return; + } SafeBrowsingBlockingPage* blocking_page = new SafeBrowsingBlockingPage(this, param); blocking_page->Show(); |