Index: chrome/browser/sync/glue/session_model_associator.h |
diff --git a/chrome/browser/sync/glue/session_model_associator.h b/chrome/browser/sync/glue/session_model_associator.h |
index 45663d22cd6829deaf2fd471df6615d8158c887f..99c2966fdd75b719be53a3f05c4f6fe7273dbcd0 100644 |
--- a/chrome/browser/sync/glue/session_model_associator.h |
+++ b/chrome/browser/sync/glue/session_model_associator.h |
@@ -36,6 +36,10 @@ class Prefservice; |
class Profile; |
class ProfileSyncService; |
+namespace content { |
+class NavigationEntry; |
+} // namespace content |
+ |
namespace sync_api { |
class BaseTransaction; |
class ReadNode; |
@@ -224,7 +228,13 @@ class SessionModelAssociator |
// Callback for when the session name has been computed. |
void OnSessionNameInitialized(const std::string& name); |
+ // If a valid favicon for the page at |url| is found, fills |png_favicon| with |
+ // the png-encoded image and returns true. Else, returns false. |
+ bool GetSyncedFaviconForPageURL(const std::string& url, |
+ std::string* png_favicon) const; |
+ |
private: |
+ friend class SyncSessionModelAssociatorTest; |
FRIEND_TEST_ALL_PREFIXES(ProfileSyncServiceSessionTest, WriteSessionToNode); |
FRIEND_TEST_ALL_PREFIXES(ProfileSyncServiceSessionTest, |
WriteFilledSessionToNode); |
@@ -286,6 +296,7 @@ class SessionModelAssociator |
// A pool for managing free/used tab sync nodes. Performs lazy creation |
// of sync nodes when necessary. |
+ // TODO(zea): pull this into it's own file. |
Andrew T Wilson (Slow)
2012/04/23 23:43:11
nit: it's->its
Nicolas Zea
2012/04/24 22:09:49
Done.
|
class TabNodePool { |
public: |
explicit TabNodePool(ProfileSyncService* sync_service); |
@@ -400,6 +411,22 @@ class SessionModelAssociator |
bool WriteTabContentsToSyncModel(TabLink* tab_link, |
SyncError* error); |
+ // Decrements the favicon usage counters for the favicon used by |page_url|. |
+ // Deletes the favicon and associated pages from the favicon usage maps |
+ // if no page is found to be referring to the favicon anymore. |
+ void DecrementAndCleanFaviconForURL(std::string page_url); |
+ |
+ // Helper method to build sync's tab specifics from a newly modified |
+ // tab, window, and the locally stored previous tab data. After completing, |
+ // |prev_tab| will be updated to reflect the current data, |sync_tab| will |
+ // be filled with the tab data (preserving old timestamps as necessary), and |
+ // |new_url| will be the tab's current url. |
+ void AssociateTabContents(const SyncedWindowDelegate& window, |
+ const SyncedTabDelegate& new_tab, |
+ SyncedSessionTab* prev_tab, |
+ sync_pb::SessionTab* sync_tab, |
+ GURL* new_url); |
+ |
// Load the favicon for the tab specified by |tab_link|. Will cancel any |
// outstanding request for this tab. OnFaviconDataAvailable(..) will be called |
// when the load completes. |
@@ -429,20 +456,21 @@ class SessionModelAssociator |
// Used to populate a session tab from the session specifics tab provided. |
static void PopulateSessionTabFromSpecifics(const sync_pb::SessionTab& tab, |
const base::Time& mtime, |
- SessionTab* session_tab); |
+ SyncedSessionTab* session_tab); |
- // Helper method to take the favicon data in a foreign tab and store it |
- // into the history db. |
+ // Helper method to load the favicon data from the tab specifics. If the |
+ // favicon is valid, stores it in |synced_favicons_|, increments |
+ // |synced_favicon_usage_| and updates |synced_favicon_pages_| appropriately. |
void LoadForeignTabFavicon(const sync_pb::SessionTab& tab); |
- // Used to populate a session tab from the session specifics tab provided. |
+ // Append a new navigation from sync specifics onto |tab| navigation vectors. |
static void AppendSessionTabNavigation( |
const sync_pb::TabNavigation& navigation, |
- std::vector<TabNavigation>* navigations); |
+ SyncedSessionTab* tab); |
// Populates the navigation portion of the session specifics. |
static void PopulateSessionSpecificsNavigation( |
- const TabNavigation* navigation, |
+ const content::NavigationEntry& navigation, |
sync_pb::TabNavigation* tab_navigation); |
// Returns true if this tab belongs to this profile and belongs to a window, |
@@ -456,6 +484,9 @@ class SessionModelAssociator |
bool TabHasValidEntry(const SyncedTabDelegate& tab) const; |
// For testing only. |
+ size_t NumFaviconsForTesting() const; |
+ |
+ // For testing only. |
void QuitLoopForSubtleTesting(); |
// Unique client tag. |
@@ -503,6 +534,20 @@ class SessionModelAssociator |
// SessionID for the tab whose favicon is being set. |
CancelableRequestConsumerTSimple<SessionID::id_type> load_consumer_; |
+ // Synced favicon storage and tracking. |
+ // Map of favicon URL -> favicon data for favicons synced from other clients. |
+ // Favicons are stored as png-encoded strings. |
+ // TODO(zea): if this becomes expensive memory-wise, reconsider using the |
+ // favicon service instead. For now, this is simpler due to the history |
+ // backend not properly supporting expiration of synced favicons. |
+ // See crbug.com/122890. |
+ std::map<std::string, linked_ptr<std::string> > synced_favicons_; |
+ // Map of favicon URL -> usage count. When the count reaches zero, we can |
+ // safely delete the favicon as no tabs are referring to it anymore. |
+ std::map<std::string, size_t> synced_favicon_usage_; |
+ // Map of page URL -> favicon url. |
+ std::map<std::string, std::string> synced_favicon_pages_; |
+ |
DISALLOW_COPY_AND_ASSIGN(SessionModelAssociator); |
}; |