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

Unified Diff: content/renderer/notification_provider.cc

Issue 554213003: Request the icon of a Web Notification in the renderer process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: include logging.h Created 6 years, 2 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
« no previous file with comments | « content/renderer/notification_provider.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/notification_provider.cc
diff --git a/content/renderer/notification_provider.cc b/content/renderer/notification_provider.cc
index c4d869c2b1caea82e31f46e5997d5e64675c4808..3c2a3c6e4e7c6106faf51a8aaa828a5b9e23b260 100644
--- a/content/renderer/notification_provider.cc
+++ b/content/renderer/notification_provider.cc
@@ -4,52 +4,92 @@
#include "content/renderer/notification_provider.h"
+#include <vector>
+
#include "base/strings/string_util.h"
#include "content/common/desktop_notification_messages.h"
#include "content/common/frame_messages.h"
+#include "content/renderer/notification_icon_loader.h"
#include "content/renderer/render_frame_impl.h"
-#include "third_party/WebKit/public/platform/WebURL.h"
#include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"
-#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
using blink::WebDocument;
using blink::WebNotification;
using blink::WebNotificationPresenter;
using blink::WebSecurityOrigin;
using blink::WebString;
-using blink::WebURL;
-using blink::WebUserGestureIndicator;
namespace content {
NotificationProvider::NotificationProvider(RenderFrame* render_frame)
- : RenderFrameObserver(render_frame) {
-}
+ : RenderFrameObserver(render_frame) {}
-NotificationProvider::~NotificationProvider() {
-}
+NotificationProvider::~NotificationProvider() {}
bool NotificationProvider::show(const WebNotification& notification) {
- WebDocument document = render_frame()->GetWebFrame()->document();
int notification_id = manager_.RegisterNotification(notification);
+ if (notification.iconURL().isEmpty()) {
+ DisplayNotification(notification_id, SkBitmap());
+ return true;
+ }
+
+ scoped_ptr<NotificationIconLoader> loader(
+ new NotificationIconLoader(
+ notification_id,
+ base::Bind(&NotificationProvider::DisplayNotification,
+ base::Unretained(this))));
+
+ loader->Start(notification.iconURL());
+
+ pending_notifications_.push_back(loader.release());
+ return true;
+}
+
+void NotificationProvider::DisplayNotification(int notification_id,
+ const SkBitmap& icon) {
+ WebDocument document = render_frame()->GetWebFrame()->document();
+ WebNotification notification;
+
+ if (!manager_.GetNotification(notification_id, &notification)) {
+ NOTREACHED();
+ return;
+ }
+
+ RemovePendingNotification(notification_id);
ShowDesktopNotificationHostMsgParams params;
params.origin = GURL(document.securityOrigin().toString());
- params.icon_url = notification.iconURL();
+ params.icon = icon;
params.title = notification.title();
params.body = notification.body();
params.direction = notification.direction();
params.replace_id = notification.replaceId();
- return Send(new DesktopNotificationHostMsg_Show(
- routing_id(), notification_id, params));
+
+ Send(new DesktopNotificationHostMsg_Show(routing_id(),
+ notification_id,
+ params));
+}
+
+bool NotificationProvider::RemovePendingNotification(int notification_id) {
+ PendingNotifications::iterator iter = pending_notifications_.begin();
+ for (; iter != pending_notifications_.end(); ++iter) {
+ if ((*iter)->notification_id() != notification_id)
+ continue;
+
+ pending_notifications_.erase(iter);
+ return true;
+ }
+
+ return false;
}
void NotificationProvider::cancel(const WebNotification& notification) {
int id;
bool id_found = manager_.GetId(notification, id);
- // Won't be found if the notification has already been closed by the user.
- if (id_found)
+ // Won't be found if the notification has already been closed by the user,
+ // or if the notification's icon is still being requested.
+ if (id_found && !RemovePendingNotification(id))
Send(new DesktopNotificationHostMsg_Cancel(routing_id(), id));
}
@@ -58,8 +98,10 @@ void NotificationProvider::objectDestroyed(
int id;
bool id_found = manager_.GetId(notification, id);
// Won't be found if the notification has already been closed by the user.
- if (id_found)
+ if (id_found) {
+ RemovePendingNotification(id);
manager_.UnregisterNotification(id);
+ }
}
WebNotificationPresenter::Permission NotificationProvider::checkPermission(
« no previous file with comments | « content/renderer/notification_provider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698