Index: mojo/services/public/cpp/view_manager/lib/view.cc |
diff --git a/mojo/services/public/cpp/view_manager/lib/view.cc b/mojo/services/public/cpp/view_manager/lib/view.cc |
index b371000ee798c25e46bd83667c09743b52a1dec6..dee2a2a84155992ce752da5fdf3d0759e75fa70f 100644 |
--- a/mojo/services/public/cpp/view_manager/lib/view.cc |
+++ b/mojo/services/public/cpp/view_manager/lib/view.cc |
@@ -386,6 +386,16 @@ View::~View() { |
// ViewManagerClientImpl. |
if (manager_) |
static_cast<ViewManagerClientImpl*>(manager_)->RemoveView(id_); |
+ |
+ // Clear properties. |
+ for (std::map<const void*, Value>::const_iterator iter = prop_map_.begin(); |
sky
2014/11/14 23:11:27
enhanced for loop? auto?
|
+ iter != prop_map_.end(); |
+ ++iter) { |
+ if (iter->second.deallocator) |
+ (*iter->second.deallocator)(iter->second.value); |
+ } |
+ prop_map_.clear(); |
+ |
FOR_EACH_OBSERVER(ViewObserver, observers_, OnViewDestroyed(this)); |
} |
@@ -400,6 +410,34 @@ View::View(ViewManager* manager) |
drawn_(false) { |
} |
+int64 View::SetLocalPropertyInternal(const void* key, |
+ const char* name, |
+ PropertyDeallocator deallocator, |
+ int64 value, |
+ int64 default_value) { |
+ int64 old = GetLocalPropertyInternal(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; |
+ } |
+ // FOR_EACH_OBSERVER(WindowObserver, observers_, |
sky
2014/11/14 23:11:27
Seems reasonable to notify observers when the prop
|
+ // OnWindowPropertyChanged(this, key, old)); |
+ return old; |
+} |
+ |
+int64 View::GetLocalPropertyInternal(const void* key, |
+ int64 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; |
+} |
+ |
void View::LocalDestroy() { |
delete this; |
} |