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
 | 
