Chromium Code Reviews| Index: content/browser/ssl/ssl_manager.cc |
| diff --git a/content/browser/ssl/ssl_manager.cc b/content/browser/ssl/ssl_manager.cc |
| index d41260e583e325a7dc9ef4e251c148ba006ce283..53a430a839e5eefba66185148916ff8523b819a7 100644 |
| --- a/content/browser/ssl/ssl_manager.cc |
| +++ b/content/browser/ssl/ssl_manager.cc |
| @@ -4,7 +4,10 @@ |
| #include "content/browser/ssl/ssl_manager.h" |
| +#include <set> |
| + |
| #include "base/bind.h" |
| +#include "base/supports_user_data.h" |
| #include "base/utf_string_conversions.h" |
| #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| #include "content/browser/loader/resource_request_info_impl.h" |
| @@ -14,6 +17,7 @@ |
| #include "content/browser/web_contents/navigation_entry_impl.h" |
| #include "content/browser/web_contents/web_contents_impl.h" |
| #include "content/common/ssl_status_serialization.h" |
| +#include "content/public/browser/browser_context.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/load_from_memory_cache_details.h" |
| #include "content/public/browser/navigation_details.h" |
| @@ -25,6 +29,25 @@ |
| namespace content { |
| +namespace { |
| + |
| +const char kSSLManagerKeyName[] = "content_ssl_manager"; |
| + |
| +class SSLManagerSet : public base::SupportsUserData::Data { |
| + public: |
| + SSLManagerSet() { |
| + } |
| + |
| + std::set<SSLManager*>& get() { return set_; } |
| + |
| + private: |
| + std::set<SSLManager*> set_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SSLManagerSet); |
| +}; |
| + |
| +} // namespace |
| + |
| // static |
| void SSLManager::OnSSLCertificateError( |
| const base::WeakPtr<SSLErrorHandler::Delegate>& delegate, |
| @@ -61,12 +84,17 @@ void SSLManager::OnSSLCertificateError( |
| } |
| // static |
| -void SSLManager::NotifySSLInternalStateChanged( |
| - NavigationControllerImpl* controller) { |
| - NotificationService::current()->Notify( |
| - NOTIFICATION_SSL_INTERNAL_STATE_CHANGED, |
| - Source<BrowserContext>(controller->GetBrowserContext()), |
| - NotificationService::NoDetails()); |
| +void SSLManager::NotifySSLInternalStateChanged(BrowserContext* context) { |
| + SSLManagerSet* managers = static_cast<SSLManagerSet*>( |
| + context->GetUserData(kSSLManagerKeyName)); |
| + if (!managers) |
|
jam
2013/02/07 17:56:24
can this really happen? if not, i prefer not addin
Paweł Hajdan Jr.
2013/02/08 09:12:22
Done.
|
| + return; |
| + |
| + for (std::set<SSLManager*>::iterator i = managers->get().begin(); |
| + i != managers->get().end(); ++i) { |
| + (*i)->UpdateEntry(NavigationEntryImpl::FromNavigationEntry( |
| + (*i)->controller()->GetActiveEntry())); |
| + } |
| } |
| SSLManager::SSLManager(NavigationControllerImpl* controller) |
| @@ -85,13 +113,21 @@ SSLManager::SSLManager(NavigationControllerImpl* controller) |
| registrar_.Add( |
| this, NOTIFICATION_LOAD_FROM_MEMORY_CACHE, |
| Source<NavigationController>(controller_)); |
| - registrar_.Add( |
| - this, NOTIFICATION_SSL_INTERNAL_STATE_CHANGED, |
| - Source<BrowserContext>( |
| - controller_->GetBrowserContext())); |
| + |
| + SSLManagerSet* managers = static_cast<SSLManagerSet*>( |
| + controller_->GetBrowserContext()->GetUserData(kSSLManagerKeyName)); |
| + if (!managers) { |
| + managers = new SSLManagerSet; |
| + controller_->GetBrowserContext()->SetUserData(kSSLManagerKeyName, managers); |
| + } |
| + managers->get().insert(this); |
| } |
| SSLManager::~SSLManager() { |
| + SSLManagerSet* managers = static_cast<SSLManagerSet*>( |
| + controller_->GetBrowserContext()->GetUserData(kSSLManagerKeyName)); |
| + if (managers) |
|
jam
2013/02/07 17:56:24
ditto, don't see how this could happen
Paweł Hajdan Jr.
2013/02/08 09:12:22
Done.
|
| + managers->get().erase(this); |
| } |
| void SSLManager::DidCommitProvisionalLoad( |
| @@ -128,10 +164,16 @@ void SSLManager::DidCommitProvisionalLoad( |
| UpdateEntry(entry); |
| } |
| +void SSLManager::DidDisplayInsecureContent() { |
| + UpdateEntry( |
| + NavigationEntryImpl::FromNavigationEntry(controller_->GetActiveEntry())); |
| +} |
| + |
| void SSLManager::DidRunInsecureContent(const std::string& security_origin) { |
| - policy()->DidRunInsecureContent( |
| - NavigationEntryImpl::FromNavigationEntry(controller_->GetActiveEntry()), |
| - security_origin); |
| + NavigationEntryImpl* navigation_entry = |
| + NavigationEntryImpl::FromNavigationEntry(controller_->GetActiveEntry()); |
| + policy()->DidRunInsecureContent(navigation_entry, security_origin); |
| + UpdateEntry(navigation_entry); |
| } |
| void SSLManager::Observe(int type, |
| @@ -151,9 +193,6 @@ void SSLManager::Observe(int type, |
| DidLoadFromMemoryCache( |
| Details<LoadFromMemoryCacheDetails>(details).ptr()); |
| break; |
| - case NOTIFICATION_SSL_INTERNAL_STATE_CHANGED: |
| - DidChangeSSLInternalState(); |
| - break; |
| default: |
| NOTREACHED() << "The SSLManager received an unexpected notification."; |
| } |
| @@ -198,11 +237,6 @@ void SSLManager::DidReceiveResourceRedirect(ResourceRedirectDetails* details) { |
| // HTTP request to https://attacker.com/payload.js. |
| } |
| -void SSLManager::DidChangeSSLInternalState() { |
| - UpdateEntry( |
| - NavigationEntryImpl::FromNavigationEntry(controller_->GetActiveEntry())); |
| -} |
| - |
| void SSLManager::UpdateEntry(NavigationEntryImpl* entry) { |
| // We don't always have a navigation entry to update, for example in the |
| // case of the Web Inspector. |
| @@ -213,12 +247,8 @@ void SSLManager::UpdateEntry(NavigationEntryImpl* entry) { |
| policy()->UpdateEntry(entry, controller_->web_contents()); |
| - if (!entry->GetSSL().Equals(original_ssl_status)) { |
| - NotificationService::current()->Notify( |
| - NOTIFICATION_SSL_VISIBLE_STATE_CHANGED, |
| - Source<NavigationController>(controller_), |
| - NotificationService::NoDetails()); |
| - } |
| + if (!entry->GetSSL().Equals(original_ssl_status)) |
| + controller_->web_contents()->DidChangeVisibleSSLState(); |
| } |
| } // namespace content |