Index: chrome/browser/extensions/app_notification_manager.cc |
=================================================================== |
--- chrome/browser/extensions/app_notification_manager.cc (revision 109957) |
+++ chrome/browser/extensions/app_notification_manager.cc (working copy) |
@@ -63,9 +63,10 @@ |
sync_pb::app_notification).guid()] = *iter; |
} |
} |
- |
} // namespace |
+const unsigned int AppNotificationManager::kMaxNotificationPerApp = 5; |
+ |
AppNotificationManager::AppNotificationManager(Profile* profile) |
: profile_(profile), |
sync_processor_(NULL), |
@@ -93,6 +94,11 @@ |
this, storage_path)); |
} |
+bool AppNotificationSortPredicate(const linked_ptr<AppNotification> a1, |
+ const linked_ptr<AppNotification> a2) { |
+ return a1.get()->creation_time() < a2.get()->creation_time(); |
+} |
+ |
bool AppNotificationManager::Add(AppNotification* item) { |
// Do this first since we own the incoming item and hence want to delete |
// it in error paths. |
@@ -105,6 +111,14 @@ |
SyncAddChange(*linked_item); |
+ sort(list.begin(), list.end(), AppNotificationSortPredicate); |
+ |
+ if (list.size() > AppNotificationManager::kMaxNotificationPerApp) { |
+ AppNotification* removed = list.begin()->get(); |
+ SyncRemoveChange(*removed); |
+ list.erase(list.begin()); |
+ } |
+ |
if (storage_.get()) { |
BrowserThread::PostTask( |
BrowserThread::FILE, |
@@ -412,6 +426,20 @@ |
sync_processor_->ProcessSyncChanges(FROM_HERE, changes); |
} |
+void AppNotificationManager::SyncRemoveChange(const AppNotification& notif) { |
+ // Skip if either: |
+ // - Sync is not enabled by user. |
+ // - Change is generated from within the manager. |
+ if (notif.is_local() || !models_associated_) { |
+ return; |
+ } |
+ |
+ SyncChangeList changes; |
+ SyncData sync_data = CreateSyncDataFromNotification(notif); |
+ changes.push_back(SyncChange(SyncChange::ACTION_DELETE, sync_data)); |
+ sync_processor_->ProcessSyncChanges(FROM_HERE, changes); |
+} |
+ |
void AppNotificationManager::SyncClearAllChange( |
const AppNotificationList& list) { |
// Skip if either: |
@@ -469,12 +497,13 @@ |
sync_pb::AppNotificationSpecifics* notif_specifics = |
specifics.MutableExtension(sync_pb::app_notification); |
notif_specifics->set_app_id(notification.extension_id()); |
+ notif_specifics->set_creation_timestamp_ms( |
+ notification.creation_time().ToInternalValue()); |
notif_specifics->set_body_text(notification.body()); |
notif_specifics->set_guid(notification.guid()); |
notif_specifics->set_link_text(notification.link_text()); |
notif_specifics->set_link_url(notification.link_url().spec()); |
notif_specifics->set_title(notification.title()); |
- |
return SyncData::CreateLocalData( |
notif_specifics->guid(), notif_specifics->app_id(), specifics); |
} |
@@ -487,12 +516,14 @@ |
// Check for mandatory fields. |
if (!specifics.has_app_id() || !specifics.has_guid() || |
- !specifics.has_title() || !specifics.has_body_text()) { |
+ !specifics.has_title() || !specifics.has_body_text() || |
+ !specifics.has_creation_timestamp_ms()) { |
return NULL; |
} |
AppNotification* notification = new AppNotification( |
- false, specifics.guid(), specifics.app_id(), |
+ false, base::Time::FromInternalValue(specifics.creation_timestamp_ms()), |
+ specifics.guid(), specifics.app_id(), |
specifics.title(), specifics.body_text()); |
if (specifics.has_link_text()) |
notification->set_link_text(specifics.link_text()); |