Commit a5dc279b authored by mlerman's avatar mlerman Committed by Commit bot

Handle multiple signin_internal_uis by using a linked_ptr.

Fixes an issue where chrome://signin-internals page is opened multiple times, and the scoped_ptr was getting de-allocated by the first object. Moving to a linked_ptr for more robust reference counting.

BUG=416802

Review URL: https://codereview.chromium.org/602773002

Cr-Commit-Position: refs/heads/master@{#296932}
parent a7038bc1
......@@ -79,13 +79,13 @@ bool SignInInternalsUI::OverrideHandleWebUIMessage(
}
void SignInInternalsUI::OnSigninStateChanged(
scoped_ptr<base::DictionaryValue> info) {
const base::DictionaryValue* info) {
web_ui()->CallJavascriptFunction(
"chrome.signin.onSigninInfoChanged.fire", *info);
}
void SignInInternalsUI::OnCookieAccountsFetched(
scoped_ptr<base::DictionaryValue> info) {
const base::DictionaryValue* info) {
web_ui()->CallJavascriptFunction(
"chrome.signin.onCookieAccountsFetched.fire", *info);
}
......@@ -7,7 +7,6 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
#include "components/signin/core/browser/about_signin_internals.h"
#include "content/public/browser/web_ui_controller.h"
......@@ -26,12 +25,11 @@ class SignInInternalsUI : public content::WebUIController,
const base::ListValue& args) OVERRIDE;
// AboutSigninInternals::Observer::OnSigninStateChanged implementation.
virtual void OnSigninStateChanged(
scoped_ptr<base::DictionaryValue> info) OVERRIDE;
virtual void OnSigninStateChanged(const base::DictionaryValue* info) OVERRIDE;
// Notification that the cookie accounts are ready to be displayed.
virtual void OnCookieAccountsFetched(
scoped_ptr<base::DictionaryValue> info) OVERRIDE;
const base::DictionaryValue* info) OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(SignInInternalsUI);
......
......@@ -220,10 +220,11 @@ void AboutSigninInternals::Shutdown() {
}
void AboutSigninInternals::NotifyObservers() {
scoped_ptr<base::DictionaryValue> signin_status_value =
signin_status_.ToValue(client_->GetProductVersion());
FOR_EACH_OBSERVER(AboutSigninInternals::Observer,
signin_observers_,
OnSigninStateChanged(
signin_status_.ToValue(client_->GetProductVersion())));
OnSigninStateChanged(signin_status_value.get()));
}
scoped_ptr<base::DictionaryValue> AboutSigninInternals::GetSigninStatus() {
......@@ -295,7 +296,8 @@ void AboutSigninInternals::OnCookieChanged(
}
void AboutSigninInternals::GetCookieAccountsAsync() {
if (!gaia_fetcher_) {
// Don't bother calling /ListAccounts if no one will observe the response.
if (!gaia_fetcher_ && signin_observers_.might_have_observers()) {
// There is no list account request in flight.
gaia_fetcher_.reset(new GaiaAuthFetcher(
this, GaiaConstants::kChromeSource, client_->GetURLRequestContext()));
......@@ -324,9 +326,9 @@ void AboutSigninInternals::OnListAccountsFailure(
void AboutSigninInternals::OnListAccountsComplete(
std::vector<std::pair<std::string, bool> >& gaia_accounts) {
scoped_ptr<base::DictionaryValue> signin_status(new base::DictionaryValue());
base::DictionaryValue signin_status;
base::ListValue* cookie_info = new base::ListValue();
signin_status->Set("cookie_info", cookie_info);
signin_status.Set("cookie_info", cookie_info);
for (size_t i = 0; i < gaia_accounts.size(); ++i) {
AddCookieEntry(cookie_info,
......@@ -340,7 +342,7 @@ void AboutSigninInternals::OnListAccountsComplete(
// Update the observers that the cookie's accounts are updated.
FOR_EACH_OBSERVER(AboutSigninInternals::Observer,
signin_observers_,
OnCookieAccountsFetched(signin_status.Pass()));
OnCookieAccountsFetched(&signin_status));
}
AboutSigninInternals::TokenInfo::TokenInfo(
......
......@@ -8,6 +8,7 @@
#include <map>
#include <string>
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "base/values.h"
......@@ -39,12 +40,10 @@ class AboutSigninInternals
public:
// |info| will contain the dictionary of signin_status_ values as indicated
// in the comments for GetSigninStatus() below.
virtual void OnSigninStateChanged(
scoped_ptr<base::DictionaryValue> info) = 0;
virtual void OnSigninStateChanged(const base::DictionaryValue* info) = 0;
// Notification that the cookie accounts are ready to be displayed.
virtual void OnCookieAccountsFetched(
scoped_ptr<base::DictionaryValue> info) = 0;
virtual void OnCookieAccountsFetched(const base::DictionaryValue* info) = 0;
};
AboutSigninInternals(ProfileOAuth2TokenService* token_service,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment