Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1986)

Unified Diff: content/shell/browser/layout_test/layout_test_permission_manager.cc

Issue 1101153002: LayoutTestPermissionManager: implement subscriptions handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remove_calls
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/shell/browser/layout_test/layout_test_permission_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/shell/browser/layout_test/layout_test_permission_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698