60 lines
1.8 KiB
C++
60 lines
1.8 KiB
C++
// 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<content::RenderProcessHost>(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
|