summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormlamouri <mlamouri@chromium.org>2015-04-01 16:30:57 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-01 23:31:23 +0000
commita500a0fbbfbaac5ddf2f58d52be34a4d1df03f91 (patch)
treec06ef0eb5fa9fa42111f9ec77d954cd7ec7d76ff /chrome
parent23cb362e78184197f00f2d136ad1e7f148ef2a88 (diff)
downloadchromium_src-a500a0fbbfbaac5ddf2f58d52be34a4d1df03f91.zip
chromium_src-a500a0fbbfbaac5ddf2f58d52be34a4d1df03f91.tar.gz
chromium_src-a500a0fbbfbaac5ddf2f58d52be34a4d1df03f91.tar.bz2
Improve Mojo permission service and chrome::PermissionManager observing.
This is fixing two bugs: - mojo callbacks were not always run, which is now required. - the service was not always unsubscribing from the PermissionManager, keeping stalled subscriptions alive. BUG=430238, 437770 Review URL: https://codereview.chromium.org/1054653002 Cr-Commit-Position: refs/heads/master@{#323368}
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/permissions/permission_manager.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc
index 44f281a..217ec7f 100644
--- a/chrome/browser/permissions/permission_manager.cc
+++ b/chrome/browser/permissions/permission_manager.cc
@@ -207,6 +207,8 @@ void PermissionManager::OnContentSettingChanged(
const ContentSettingsPattern& secondary_pattern,
ContentSettingsType content_type,
std::string resource_identifier) {
+ std::list<base::Closure> callbacks;
+
for (SubscriptionsMap::iterator iter(&subscriptions_);
!iter.IsAtEnd(); iter.Advance()) {
Subscription* subscription = iter.GetCurrentValue();
@@ -230,6 +232,14 @@ void PermissionManager::OnContentSettingChanged(
continue;
subscription->current_value = new_value;
- subscription->callback.Run(ContentSettingToPermissionStatus(new_value));
+
+ // Add the callback to |callbacks| which will be run after the loop to
+ // prevent re-entrance issues.
+ callbacks.push_back(
+ base::Bind(subscription->callback,
+ ContentSettingToPermissionStatus(new_value)));
}
+
+ for (const auto& callback : callbacks)
+ callback.Run();
}