Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.mm

Issue 14130008: Fix race condition if a pulsing bookmark button is deleted while the bookmark bubble controller is … (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: less crash Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h" 5 #include "chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h"
6 6
7 BookmarkModelObserverForCocoa::BookmarkModelObserverForCocoa( 7 BookmarkModelObserverForCocoa::BookmarkModelObserverForCocoa(
8 const BookmarkNode* node,
9 BookmarkModel* model, 8 BookmarkModel* model,
10 NSObject* object, 9 ChangeCallback callback) {
11 SEL selector) {
12 DCHECK(model); 10 DCHECK(model);
13 node_ = node; 11 callback_.reset(Block_copy(callback));
14 model_ = model; 12 model_ = model;
15 object_ = object;
16 selector_ = selector;
17 model_->AddObserver(this); 13 model_->AddObserver(this);
18 } 14 }
19 15
20 BookmarkModelObserverForCocoa::~BookmarkModelObserverForCocoa() { 16 BookmarkModelObserverForCocoa::~BookmarkModelObserverForCocoa() {
21 model_->RemoveObserver(this); 17 model_->RemoveObserver(this);
22 } 18 }
23 19
20 void BookmarkModelObserverForCocoa::StartObservingNode(
21 const BookmarkNode* node) {
22 nodes_.insert(node);
23 }
24
25 void BookmarkModelObserverForCocoa::StopObservingNode(
26 const BookmarkNode* node) {
27 nodes_.erase(node);
28 }
29
24 void BookmarkModelObserverForCocoa::BookmarkModelBeingDeleted( 30 void BookmarkModelObserverForCocoa::BookmarkModelBeingDeleted(
25 BookmarkModel* model) { 31 BookmarkModel* model) {
26 Notify(); 32 Notify(YES);
27 } 33 }
28 34
29 void BookmarkModelObserverForCocoa::BookmarkNodeMoved( 35 void BookmarkModelObserverForCocoa::BookmarkNodeMoved(
30 BookmarkModel* model, 36 BookmarkModel* model,
31 const BookmarkNode* old_parent, 37 const BookmarkNode* old_parent,
32 int old_index, 38 int old_index,
33 const BookmarkNode* new_parent, 39 const BookmarkNode* new_parent,
34 int new_index) { 40 int new_index) {
35 // Editors often have a tree of parents, so movement of folders 41 // Editors often have a tree of parents, so movement of folders
36 // must cause a cancel. 42 // must cause a cancel.
37 Notify(); 43 Notify(NO);
38 } 44 }
39 45
40 void BookmarkModelObserverForCocoa::BookmarkNodeRemoved( 46 void BookmarkModelObserverForCocoa::BookmarkNodeRemoved(
41 BookmarkModel* model, 47 BookmarkModel* model,
42 const BookmarkNode* parent, 48 const BookmarkNode* parent,
43 int old_index, 49 int old_index,
44 const BookmarkNode* node) { 50 const BookmarkNode* node) {
45 // See comment in BookmarkNodeMoved. 51 // See comment in BookmarkNodeMoved.
46 Notify(); 52 Notify(YES);
47 } 53 }
48 54
49 void BookmarkModelObserverForCocoa::BookmarkAllNodesRemoved( 55 void BookmarkModelObserverForCocoa::BookmarkAllNodesRemoved(
50 BookmarkModel* model) { 56 BookmarkModel* model) {
51 Notify(); 57 Notify(YES);
52 } 58 }
53 59
54 void BookmarkModelObserverForCocoa::BookmarkNodeChanged( 60 void BookmarkModelObserverForCocoa::BookmarkNodeChanged(
55 BookmarkModel* model, 61 BookmarkModel* model,
56 const BookmarkNode* node) { 62 const BookmarkNode* node) {
57 if ((node_ == node) || (!node_)) 63 if (!nodes_.size() || nodes_.find(node) != nodes_.end())
58 Notify(); 64 Notify(NO);
59 } 65 }
60 66
61 void BookmarkModelObserverForCocoa::ExtensiveBookmarkChangesBeginning( 67 void BookmarkModelObserverForCocoa::Notify(BOOL deleted) {
62 BookmarkModel* model) { 68 callback_.get()(deleted);
63 // Be conservative.
64 Notify();
65 } 69 }
66
67 void BookmarkModelObserverForCocoa::Notify() {
68 [object_ performSelector:selector_ withObject:nil];
69 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698