// Copyright (c) 2016 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #include "atom/browser/render_process_preferences.h" #include "atom/common/api/api_messages.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h" #include "content/public/browser/render_process_host.h" namespace atom { RenderProcessPreferences::RenderProcessPreferences(const Predicate& predicate) : predicate_(predicate) { registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CREATED, content::NotificationService::AllBrowserContextsAndSources()); } RenderProcessPreferences::~RenderProcessPreferences() {} int RenderProcessPreferences::AddEntry(const base::DictionaryValue& entry) { int id = ++next_id_; entries_[id] = base::DictionaryValue::From(base::Value::ToUniquePtrValue(entry.Clone())); cache_needs_update_ = true; return id; } void RenderProcessPreferences::RemoveEntry(int id) { cache_needs_update_ = true; entries_.erase(id); } void RenderProcessPreferences::Observe( int type, const content::NotificationSource& source, const content::NotificationDetails& details) { DCHECK_EQ(type, content::NOTIFICATION_RENDERER_PROCESS_CREATED); content::RenderProcessHost* process = content::Source(source).ptr(); if (!predicate_.Run(process)) return; UpdateCache(); process->Send(new AtomMsg_UpdatePreferences(cached_entries_)); } void RenderProcessPreferences::UpdateCache() { if (!cache_needs_update_) return; cached_entries_.Clear(); for (const auto& iter : entries_) cached_entries_.Append(base::Value::ToUniquePtrValue(iter.second->Clone())); cache_needs_update_ = false; } } // namespace atom