| Index: content/shell/browser/layout_test/layout_test_permission_manager.cc
|
| diff --git a/content/shell/browser/layout_test/layout_test_permission_manager.cc b/content/shell/browser/layout_test/layout_test_permission_manager.cc
|
| index 14fbac953633b1379985ae3fa18ade507fe7d2a6..8445e68b4beaef83efea6fdd04f7d76962fa36b8 100644
|
| --- a/content/shell/browser/layout_test/layout_test_permission_manager.cc
|
| +++ b/content/shell/browser/layout_test/layout_test_permission_manager.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "content/shell/browser/layout_test/layout_test_permission_manager.h"
|
|
|
| +#include <list>
|
| +
|
| #include "base/bind.h"
|
| #include "base/callback.h"
|
| #include "content/public/browser/browser_thread.h"
|
| @@ -14,6 +16,12 @@
|
|
|
| namespace content {
|
|
|
| +struct LayoutTestPermissionManager::Subscription {
|
| + PermissionDescription permission;
|
| + base::Callback<void(content::PermissionStatus)> callback;
|
| + PermissionStatus current_value;
|
| +};
|
| +
|
| LayoutTestPermissionManager::PermissionDescription::PermissionDescription(
|
| PermissionType type,
|
| const GURL& origin,
|
| @@ -30,6 +38,11 @@ bool LayoutTestPermissionManager::PermissionDescription::operator==(
|
| embedding_origin == other.embedding_origin;
|
| }
|
|
|
| +bool LayoutTestPermissionManager::PermissionDescription::operator!=(
|
| + const PermissionDescription& other) const {
|
| + return !this->operator==(other);
|
| +}
|
| +
|
| size_t LayoutTestPermissionManager::PermissionDescription::Hash::operator()(
|
| const PermissionDescription& description) const {
|
| size_t hash = BASE_HASH_NAMESPACE::hash<int>()(static_cast<int>(
|
| @@ -115,15 +128,24 @@ int LayoutTestPermissionManager::SubscribePermissionStatusChange(
|
| const base::Callback<void(PermissionStatus)>& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| - // TODO(mlamouri): to be implemented, see https://crbug.com/475141
|
| - return -1;
|
| + Subscription* subscription = new Subscription();
|
| + subscription->permission =
|
| + PermissionDescription(permission, requesting_origin, embedding_origin);
|
| + subscription->callback = callback;
|
| + subscription->current_value =
|
| + GetPermissionStatus(permission,
|
| + subscription->permission.origin,
|
| + subscription->permission.embedding_origin);
|
| +
|
| + return subscriptions_.Add(subscription);
|
| }
|
|
|
| void LayoutTestPermissionManager::UnsubscribePermissionStatusChange(
|
| int subscription_id) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| - // TODO(mlamouri): to be implemented, see https://crbug.com/475141
|
| + // Whether |subscription_id| is known will be checked by the Remove() call.
|
| + subscriptions_.Remove(subscription_id);
|
| }
|
|
|
| void LayoutTestPermissionManager::SetPermission(PermissionType permission,
|
| @@ -143,6 +165,8 @@ void LayoutTestPermissionManager::SetPermission(PermissionType permission,
|
| } else {
|
| it->second = status;
|
| }
|
| +
|
| + OnPermissionChanged(description, status);
|
| }
|
|
|
| void LayoutTestPermissionManager::ResetPermissions() {
|
| @@ -152,4 +176,29 @@ void LayoutTestPermissionManager::ResetPermissions() {
|
| permissions_.clear();
|
| }
|
|
|
| +void LayoutTestPermissionManager::OnPermissionChanged(
|
| + const PermissionDescription& permission,
|
| + PermissionStatus status) {
|
| + std::list<base::Closure> callbacks;
|
| +
|
| + for (SubscriptionsMap::iterator iter(&subscriptions_);
|
| + !iter.IsAtEnd(); iter.Advance()) {
|
| + Subscription* subscription = iter.GetCurrentValue();
|
| + if (subscription->permission != permission)
|
| + continue;
|
| +
|
| + if (subscription->current_value == status)
|
| + continue;
|
| +
|
| + subscription->current_value = status;
|
| +
|
| + // Add the callback to |callbacks| which will be run after the loop to
|
| + // prevent re-entrance issues.
|
| + callbacks.push_back(base::Bind(subscription->callback, status));
|
| + }
|
| +
|
| + for (const auto& callback : callbacks)
|
| + callback.Run();
|
| +}
|
| +
|
| } // namespace content
|
|
|