|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "ui/base/class_property.h" | 
|  |  | 
|  | #include <algorithm> | 
|  | #include <utility> | 
|  |  | 
|  | namespace ui { | 
|  |  | 
|  | PropertyHandler::PropertyHandler() {} | 
|  |  | 
|  | PropertyHandler::~PropertyHandler() { | 
|  | ClearProperties(); | 
|  | } | 
|  |  | 
|  | int64_t PropertyHandler::SetPropertyInternal(const void* key, | 
|  | const char* name, | 
|  | PropertyDeallocator deallocator, | 
|  | int64_t value, | 
|  | int64_t default_value) { | 
|  | // This code may be called before |port_| has been created. | 
|  | std::unique_ptr<PropertyData> data = BeforePropertyChange(key); | 
|  | int64_t old = GetPropertyInternal(key, default_value); | 
|  | if (value == default_value) { | 
|  | prop_map_.erase(key); | 
|  | } else { | 
|  | Value prop_value; | 
|  | prop_value.name = name; | 
|  | prop_value.value = value; | 
|  | prop_value.deallocator = deallocator; | 
|  | prop_map_[key] = prop_value; | 
|  | } | 
|  | AfterPropertyChange(key, old, std::move(data)); | 
|  | return old; | 
|  | } | 
|  |  | 
|  | std::unique_ptr<PropertyData> PropertyHandler::BeforePropertyChange( | 
|  | const void* key) { | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | void PropertyHandler::ClearProperties() { | 
|  | // Clear properties. | 
|  | for (std::map<const void*, Value>::const_iterator iter = prop_map_.begin(); | 
|  | iter != prop_map_.end(); | 
|  | ++iter) { | 
|  | if (iter->second.deallocator) | 
|  | (*iter->second.deallocator)(iter->second.value); | 
|  | } | 
|  | prop_map_.clear(); | 
|  | } | 
|  |  | 
|  | int64_t PropertyHandler::GetPropertyInternal(const void* key, | 
|  | int64_t default_value) const { | 
|  | std::map<const void*, Value>::const_iterator iter = prop_map_.find(key); | 
|  | if (iter == prop_map_.end()) | 
|  | return default_value; | 
|  | return iter->second.value; | 
|  | } | 
|  |  | 
|  | std::set<const void*> PropertyHandler::GetAllPropertyKeys() const { | 
|  | std::set<const void*> keys; | 
|  | for (auto& pair : prop_map_) | 
|  | keys.insert(pair.first); | 
|  | return keys; | 
|  | } | 
|  |  | 
|  | } // namespace ui |