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

Unified Diff: chrome/browser/notifications/notification_platform_bridge_linux.cc

Issue 2859483003: Linux native notifications: Delete notification after sending CloseNotification. (Closed)
Patch Set: Created 3 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/notifications/notification_platform_bridge_linux.cc
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.cc b/chrome/browser/notifications/notification_platform_bridge_linux.cc
index 4d0ec1152c7a4d815b4e8d6af4029a3744783c15..6d8cbc79b603b539ba1a1816bd7a4d27e224164c 100644
--- a/chrome/browser/notifications/notification_platform_bridge_linux.cc
+++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc
@@ -5,6 +5,11 @@
#include "chrome/browser/notifications/notification_platform_bridge_linux.h"
#include <algorithm>
+#include <memory>
+#include <set>
+#include <unordered_map>
+#include <utility>
+#include <vector>
Tom (Use chromium acct) 2017/05/03 21:42:56 out of curiosity, did you do this by hand?
Lei Zhang 2017/05/03 21:45:24 "git cl lint" checks for these.
#include "base/barrier_closure.h"
#include "base/files/file_util.h"
@@ -72,12 +77,11 @@ void ProfileLoadedCallback(NotificationCommon::Operation operation,
if (!profile)
return;
- NotificationDisplayService* display_service =
- NotificationDisplayServiceFactory::GetForProfile(profile);
-
- static_cast<NativeNotificationDisplayService*>(display_service)
- ->ProcessNotificationOperation(operation, notification_type, origin,
- notification_id, action_index, reply);
+ auto* display_service = static_cast<NativeNotificationDisplayService*>(
+ NotificationDisplayServiceFactory::GetForProfile(profile));
+ display_service->ProcessNotificationOperation(operation, notification_type,
+ origin, notification_id,
+ action_index, reply);
}
void ForwardNotificationOperationOnUiThread(
@@ -89,30 +93,45 @@ void ForwardNotificationOperationOnUiThread(
const std::string& profile_id,
bool is_incognito) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- ProfileManager* profile_manager = g_browser_process->profile_manager();
-
- profile_manager->LoadProfile(
+ g_browser_process->profile_manager()->LoadProfile(
profile_id, is_incognito,
base::Bind(&ProfileLoadedCallback, operation, notification_type, origin,
notification_id, action_index, base::NullableString16()));
}
-// Writes |data| to a new temporary file and returns its path.
-// Returns base::FilePath() on failure.
-base::FilePath WriteDataToTmpFile(
+class ResourceFile {
+ public:
+ explicit ResourceFile(const base::FilePath& file_path)
+ : file_path_(file_path) {
+ DCHECK(!file_path.empty());
+ }
+ ~ResourceFile() { base::DeleteFile(file_path_, false); }
+
+ const base::FilePath& file_path() const { return file_path_; }
+
+ private:
+ const base::FilePath file_path_;
+
+ DISALLOW_COPY_AND_ASSIGN(ResourceFile);
+};
+
+// Writes |data| to a new temporary file and returns the ResourceFile
+// that holds it.
+std::unique_ptr<ResourceFile> WriteDataToTmpFile(
const scoped_refptr<base::RefCountedMemory>& data) {
int data_len = data->size();
if (data_len == 0)
- return base::FilePath();
+ return nullptr;
base::FilePath file_path;
if (!base::CreateTemporaryFile(&file_path))
- return base::FilePath();
+ return nullptr;
+
+ auto resource_file = base::MakeUnique<ResourceFile>(file_path);
if (base::WriteFile(file_path, data->front_as<char>(), data_len) !=
data_len) {
- base::DeleteFile(file_path, false);
- return base::FilePath();
+ resource_file.reset();
}
- return file_path;
+ return resource_file;
}
} // namespace
@@ -208,13 +227,6 @@ class NotificationPlatformBridgeLinuxImpl
private:
friend class base::RefCountedThreadSafe<NotificationPlatformBridgeLinuxImpl>;
- struct ResourceFile {
- explicit ResourceFile(const base::FilePath& file_path)
- : file_path(file_path) {}
- ~ResourceFile() { base::DeleteFile(file_path, false); }
- const base::FilePath file_path;
- };
-
struct NotificationData {
NotificationData(NotificationCommon::Type notification_type,
const std::string& notification_id,
@@ -412,15 +424,15 @@ class NotificationPlatformBridgeLinuxImpl
desktop_entry_writer.AppendVariantOfString(desktop_file.value());
hints_writer.CloseContainer(&desktop_entry_writer);
- base::FilePath icon_file =
+ std::unique_ptr<ResourceFile> icon_file =
WriteDataToTmpFile(notification->icon().As1xPNGBytes());
- if (!icon_file.empty()) {
+ if (icon_file) {
dbus::MessageWriter image_path_writer(nullptr);
hints_writer.OpenDictEntry(&image_path_writer);
image_path_writer.AppendString("image-path");
- image_path_writer.AppendVariantOfString(icon_file.value());
+ image_path_writer.AppendVariantOfString(icon_file->file_path().value());
hints_writer.CloseContainer(&image_path_writer);
- data->resource_files.push_back(base::MakeUnique<ResourceFile>(icon_file));
+ data->resource_files.push_back(std::move(icon_file));
}
writer.CloseContainer(&hints_writer);
@@ -456,6 +468,7 @@ class NotificationPlatformBridgeLinuxImpl
writer.AppendUint32(data->dbus_id);
notification_proxy_->CallMethodAndBlock(
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT);
+ to_erase.push_back(data);
}
}
for (NotificationData* data : to_erase)
@@ -468,11 +481,10 @@ class NotificationPlatformBridgeLinuxImpl
const GetDisplayedNotificationsCallback& callback) const {
DCHECK(task_runner_->RunsTasksOnCurrentThread());
auto displayed = base::MakeUnique<std::set<std::string>>();
- for (const auto& notification : notifications_) {
- if (notification.first->profile_id == profile_id &&
- notification.first->is_incognito == incognito) {
- displayed->insert(notification.first->notification_id);
- }
+ for (const auto& pair : notifications_) {
+ NotificationData* data = pair.first;
+ if (data->profile_id == profile_id && data->is_incognito == incognito)
+ displayed->insert(data->notification_id);
}
PostTaskToUiThread(base::BindOnce(callback, std::move(displayed), true));
}
@@ -493,8 +505,9 @@ class NotificationPlatformBridgeLinuxImpl
return nullptr;
}
- NotificationData* FindNotificationData(uint32_t dbus_id) {
+ NotificationData* FindNotificationDataWithDBusId(uint32_t dbus_id) {
DCHECK(task_runner_->RunsTasksOnCurrentThread());
+ DCHECK(dbus_id);
for (const auto& pair : notifications_) {
NotificationData* data = pair.first;
if (data->dbus_id == dbus_id)
@@ -518,13 +531,13 @@ class NotificationPlatformBridgeLinuxImpl
DCHECK(task_runner_->RunsTasksOnCurrentThread());
dbus::MessageReader reader(signal);
uint32_t dbus_id;
- if (!reader.PopUint32(&dbus_id))
+ if (!reader.PopUint32(&dbus_id) || !dbus_id)
return;
std::string action;
if (!reader.PopString(&action))
return;
- NotificationData* data = FindNotificationData(dbus_id);
+ NotificationData* data = FindNotificationDataWithDBusId(dbus_id);
if (!data)
return;
@@ -549,10 +562,10 @@ class NotificationPlatformBridgeLinuxImpl
DCHECK(task_runner_->RunsTasksOnCurrentThread());
dbus::MessageReader reader(signal);
uint32_t dbus_id;
- if (!reader.PopUint32(&dbus_id))
+ if (!reader.PopUint32(&dbus_id) || !dbus_id)
return;
- NotificationData* data = FindNotificationData(dbus_id);
+ NotificationData* data = FindNotificationDataWithDBusId(dbus_id);
if (!data)
return;

Powered by Google App Engine
This is Rietveld 408576698