bookmark_change_processor.h revision 0529e5d033099cbfc42635f6f6183833b09dff6e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_GLUE_BOOKMARK_CHANGE_PROCESSOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_GLUE_BOOKMARK_CHANGE_PROCESSOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_observer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/bookmark_model_associator.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/bookmarks/core/browser/bookmark_node.h" 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/sync_driver/change_processor.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_error_handler.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass Profile; 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RefCountedMemory; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteNode; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteTransaction; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is responsible for taking changes from the BookmarkModel 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and applying them to the sync API 'syncable' model, and vice versa. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All operations and use of this class are from the UI thread. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is currently bookmarks specific. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkChangeProcessor : public BookmarkModelObserver, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ChangeProcessor { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BookmarkChangeProcessor(Profile* profile, 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BookmarkModelAssociator* model_associator, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DataTypeErrorHandler* error_handler); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BookmarkChangeProcessor(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BookmarkModelObserver implementation. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BookmarkModel -> sync API model change application. 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BookmarkModelLoaded(BookmarkModel* model, 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool ids_reassigned) OVERRIDE; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeMoved(BookmarkModel* model, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* old_parent, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_index, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* new_parent, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_index) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeAdded(BookmarkModel* model, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index) OVERRIDE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeRemoved(BookmarkModel* model, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* node) OVERRIDE; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BookmarkAllNodesRemoved(BookmarkModel* model) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeChanged(BookmarkModel* model, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* node) OVERRIDE; 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void BookmarkMetaInfoChanged(BookmarkModel* model, 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const BookmarkNode* node) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeFaviconChanged(BookmarkModel* model, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* node) OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* node) OVERRIDE; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The change processor implementation, responsible for applying changes from 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the sync model to the bookmarks model. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ApplyChangesFromSyncModel( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::BaseTransaction* trans, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 model_version, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::ImmutableChangeRecordList& changes) OVERRIDE; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The following methods are static and hence may be invoked at any time, and 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // do not depend on having a running ChangeProcessor. 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Updates the title, URL, creation time and favicon of the bookmark |node| 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // with data taken from the |sync_node| sync node. 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static void UpdateBookmarkWithSyncData( 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const syncer::BaseNode& sync_node, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const BookmarkNode* node, 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Profile* profile); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Creates a bookmark node under the given parent node from the given sync 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // node. Returns the newly created node. The created node is placed at the 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // specified index among the parent's children. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const BookmarkNode* CreateBookmarkNode( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::BaseNode* sync_node, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Profile* profile, 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int index); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the favicon of the given bookmark node from the given sync node. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether the favicon was set in the bookmark node. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |profile| is the profile that contains the HistoryService and BookmarkModel 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the bookmark in question. 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static bool SetBookmarkFavicon(const syncer::BaseNode* sync_node, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* bookmark_node, 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BookmarkModel* model, 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Applies the 1x favicon |bitmap_data| and |icon_url| to |bookmark_node|. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |profile| is the profile that contains the HistoryService and BookmarkModel 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the bookmark in question. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ApplyBookmarkFavicon( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* bookmark_node, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& icon_url, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::RefCountedMemory>& bitmap_data); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the favicon of the given sync node from the given bookmark node. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetSyncNodeFavicon(const BookmarkNode* bookmark_node, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::WriteNode* sync_node); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Treat the |index|th child of |parent| as a newly added node, and create a 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corresponding node in the sync domain using |trans|. All properties 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be transferred to the new node. A node corresponding to |parent| 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must already exist and be associated for this call to succeed. Returns 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ID of the just-created node, or if creation fails, kInvalidID. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int64 CreateSyncNode(const BookmarkNode* parent, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::WriteTransaction* trans, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelAssociator* associator, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DataTypeErrorHandler* error_handler); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update transaction version of |model| and |nodes| to |new_version| if 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's valid. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void UpdateTransactionVersion( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 new_version, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<const BookmarkNode*>& nodes); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void StartImpl() OVERRIDE; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum MoveOrCreate { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOVE, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CREATE, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Retrieves the meta info from the given sync node. 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static scoped_ptr<BookmarkNode::MetaInfoMap> GetBookmarkMetaInfo( 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const syncer::BaseNode* sync_node); 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Sets the meta info of the given sync node from the given bookmark node. 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void SetSyncNodeMetaInfo(const BookmarkNode* node, 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) syncer::WriteNode* sync_node); 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function used to fix the position of a sync node so that it matches 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the position of a corresponding bookmark model node. |parent| and 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |index| identify the bookmark model position. |dst| is the node whose 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // position is to be fixed. If |operation| is CREATE, treat |dst| as an 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uncreated node and set its position via InitByCreation(); otherwise, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |dst| is treated as an existing node, and its position will be set via 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetPosition(). |trans| is the transaction to which |dst| belongs. Returns 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // false on failure. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool PlaceSyncNode(MoveOrCreate operation, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::WriteTransaction* trans, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::WriteNode* dst, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelAssociator* associator); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy properties (but not position) from |src| to |dst|. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void UpdateSyncNodeProperties(const BookmarkNode* src, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::WriteNode* dst); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper function to encode a bookmark's favicon into raw PNG data. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void EncodeFavicon(const BookmarkNode* src, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedMemory>* dst); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove |sync_node|. It should not have any children 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveOneSyncNode(syncer::WriteNode* sync_node); 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove all sync nodes, except the permanent nodes. 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveAllSyncNodes(); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove all children of the bookmark node with bookmark node id: 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |topmost_node_id|. 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveAllChildNodes(syncer::WriteTransaction* trans, 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const int64& topmost_node_id); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove all the sync nodes associated with |node| and its children. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveSyncNodeHierarchy(const BookmarkNode* node); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bookmark model we are processing changes from. Non-NULL when 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |running_| is true. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model_; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile_; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The two models should be associated according to this ModelAssociator. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelAssociator* model_associator_; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BookmarkChangeProcessor); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace browser_sync 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_SYNC_GLUE_BOOKMARK_CHANGE_PROCESSOR_H_ 211