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

Unified Diff: chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h

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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h
index 8f00e7b612eb3bc70381a28374d80441e6aa3112..e6bc61961919ced7276244ad13c8c7ec40be293d 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h
@@ -21,28 +21,32 @@
#import <Cocoa/Cocoa.h>
+#include <set>
+
#include "base/basictypes.h"
+#include "base/mac/scoped_block.h"
#include "base/memory/scoped_nsobject.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/bookmarks/bookmark_model_observer.h"
class BookmarkModelObserverForCocoa : public BookmarkModelObserver {
public:
- // When |node| in |model| changes, send |selector| to |object|.
- // Assumes |selector| is a selector that takes one arg, like an
- // IBOutlet. The arg passed is nil.
- // Many notifications happen independently of node
- // (e.g. BeingDeleted), so |node| can be nil.
- //
- // |object| is NOT retained, since the expected use case is for
- // ||object| to own the BookmarkModelObserverForCocoa and we don't
- // want a retain cycle.
- BookmarkModelObserverForCocoa(const BookmarkNode* node,
- BookmarkModel* model,
- NSObject* object,
- SEL selector);
+ // Callback called on a significant model change. |nodeWasDeleted| will
+ // be YES if an observed node was deleted in the change.
+ typedef void(^ChangeCallback)(BOOL nodeWasDeleted);
+
+ // When a |model| changes, or an observed node within it does, call a
+ // |callback|.
+ BookmarkModelObserverForCocoa(BookmarkModel* model,
+ ChangeCallback callback);
virtual ~BookmarkModelObserverForCocoa();
+ // Starts and stops observing a specified |node|; the node must be contained
+ // within the model.
+ void StartObservingNode(const BookmarkNode* node);
+ void StopObservingNode(const BookmarkNode* node);
+
+ // BookmarkModelObserver:
virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
virtual void BookmarkNodeMoved(BookmarkModel* model,
const BookmarkNode* old_parent,
@@ -56,34 +60,33 @@ class BookmarkModelObserverForCocoa : public BookmarkModelObserver {
virtual void BookmarkAllNodesRemoved(BookmarkModel* model) OVERRIDE;
virtual void BookmarkNodeChanged(BookmarkModel* model,
const BookmarkNode* node) OVERRIDE;
- virtual void ExtensiveBookmarkChangesBeginning(BookmarkModel* model) OVERRIDE;
// Some notifications we don't care about, but by being pure virtual
// in the base class we must implement them.
- virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE {
- }
+
+ virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE { }
virtual void BookmarkNodeAdded(BookmarkModel* model,
const BookmarkNode* parent,
- int index) OVERRIDE {
- }
+ int index) OVERRIDE { }
virtual void BookmarkNodeFaviconChanged(BookmarkModel* model,
- const BookmarkNode* node) OVERRIDE {
- }
+ const BookmarkNode* node) OVERRIDE { }
virtual void BookmarkNodeChildrenReordered(
BookmarkModel* model,
- const BookmarkNode* node) OVERRIDE {
- }
+ const BookmarkNode* node) OVERRIDE { }
+
+ virtual void ExtensiveBookmarkChangesBeginning(
+ BookmarkModel* model) OVERRIDE { }
- virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE {
- }
+ virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE { }
private:
- const BookmarkNode* node_; // Weak; owned by a BookmarkModel.
BookmarkModel* model_; // Weak; it is owned by a Profile.
- NSObject* object_; // Weak, like a delegate.
- SEL selector_;
+ std::set<const BookmarkNode*> nodes_; // Weak items owned by a BookmarkModel.
+ base::mac::ScopedBlock<ChangeCallback> callback_;
- void Notify();
+ // Send a notification to the client; |deleted| is YES if an observed node was
+ // deleted in the change.
+ void Notify(BOOL deleted);
DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa);
};

Powered by Google App Engine
This is Rietveld 408576698