// Copyright (c) 2020 Slack Technologies, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #include "shell/renderer/api/context_bridge/object_cache.h" #include "v8/include/v8-local-handle.h" #include "v8/include/v8-object.h" namespace electron::api::context_bridge { ObjectCache::ObjectCache() = default; ObjectCache::~ObjectCache() = default; void ObjectCache::CacheProxiedObject(v8::Local from, v8::Local proxy_value) { if (from->IsObject() && !from->IsNullOrUndefined()) { auto obj = from.As(); int hash = obj->GetIdentityHash(); proxy_map_[hash].emplace_front(from, proxy_value); } } v8::MaybeLocal ObjectCache::GetCachedProxiedObject( v8::Local from) const { if (!from->IsObject() || from->IsNullOrUndefined()) return v8::MaybeLocal(); auto obj = from.As(); int hash = obj->GetIdentityHash(); auto iter = proxy_map_.find(hash); if (iter == proxy_map_.end()) return v8::MaybeLocal(); auto& list = iter->second; for (const auto& pair : list) { auto from_cmp = pair.first; if (from_cmp == from) { if (pair.second.IsEmpty()) return v8::MaybeLocal(); return pair.second; } } return v8::MaybeLocal(); } } // namespace electron::api::context_bridge