Skip to content

Commit

Permalink
notification fix for linux nw12
Browse files Browse the repository at this point in the history
  • Loading branch information
rogerwang committed Dec 19, 2014
1 parent 0d88746 commit 55d902d
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 117 deletions.
22 changes: 11 additions & 11 deletions nw.gypi
Expand Up @@ -374,16 +374,16 @@
'src/renderer/shell_render_process_observer.h',
'src/nw_shell.cc',
'src/nw_shell.h',
# 'src/nw_notification_manager.h',
# 'src/nw_notification_manager.cc',
# 'src/nw_notification_manager_win.h',
# 'src/nw_notification_manager_win.cc',
# 'src/nw_notification_manager_toast_win.h',
# 'src/nw_notification_manager_toast_win.cc',
# 'src/nw_notification_manager_mac.h',
# 'src/nw_notification_manager_mac.mm',
# 'src/nw_notification_manager_linux.h',
# 'src/nw_notification_manager_linux.cc',
'src/nw_notification_manager.h',
'src/nw_notification_manager.cc',
'src/nw_notification_manager_win.h',
'src/nw_notification_manager_win.cc',
'src/nw_notification_manager_toast_win.h',
'src/nw_notification_manager_toast_win.cc',
'src/nw_notification_manager_mac.h',
'src/nw_notification_manager_mac.mm',
'src/nw_notification_manager_linux.h',
'src/nw_notification_manager_linux.cc',
'src/shell_browser_context.cc',
'src/shell_browser_context.h',
'src/shell_browser_main.cc',
Expand Down Expand Up @@ -934,7 +934,7 @@
}], # OS=="win" or (toolkit_uses_gtk == 1 and selinux == 0)
['OS=="linux"', {
'dependencies': [
#'<(DEPTH)/build/linux/system.gyp:notify',
'<(DEPTH)/build/linux/system.gyp:notify',
],
}], # OS=="linux"
['OS=="mac"', {
Expand Down
38 changes: 20 additions & 18 deletions src/nw_notification_manager.cc
Expand Up @@ -18,8 +18,8 @@
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#include "ui/gfx/image/image.h"
#include "content/public/browser/render_frame_host.h"
#include "content/common/desktop_notification_messages.h"
#include "content/public/browser/render_process_host.h"
#include "content/common/platform_notification_messages.h"


#include "content/nw/src/nw_notification_manager.h"
Expand Down Expand Up @@ -60,56 +60,58 @@ NotificationManager* NotificationManager::getSingleton() {
}


#if 0
void NotificationManager::ImageDownloadCallback(int id, int http_status, const GURL& image_url, const std::vector<SkBitmap>& bitmaps, const std::vector<gfx::Size>& size) {
NotificationManager *singleton = getSingleton();
DesktopNotificationParams params = singleton->desktop_notification_params_[id];
singleton->AddDesktopNotification(params.params_, params.render_process_id_, params.render_frame_id_, params.notification_id_, params.worker_, &bitmaps);
singleton->desktop_notification_params_.erase(id);
}
#endif

bool NotificationManager::AddDesktopNotification(const content::ShowDesktopNotificationHostMsgParams& params,
const int render_process_id,
const int render_frame_id,
const int notification_id,
const bool worker,
const std::vector<SkBitmap>* bitmaps) {
const bool worker) {
NOTIMPLEMENTED();
return false;
}

bool NotificationManager::DesktopNotificationPostClick(int render_process_id, int render_frame_id, int notification_id) {
content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(render_process_id, render_frame_id);
bool NotificationManager::DesktopNotificationPostClick(int render_process_id, int notification_id) {
content::RenderProcessHost* rfh = content::RenderProcessHost::FromID(render_process_id);
if (!rfh)
return false;
rfh->Send(new DesktopNotificationMsg_PostClick(rfh->GetRoutingID(), notification_id));

rfh->Send(new PlatformNotificationMsg_DidClick(notification_id));
return true;
}

bool NotificationManager::DesktopNotificationPostClose(int render_process_id, int render_frame_id, int notification_id, bool by_user) {
content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(render_process_id, render_frame_id);
bool NotificationManager::DesktopNotificationPostClose(int render_process_id, int notification_id, bool by_user) {
content::RenderProcessHost* rfh = content::RenderProcessHost::FromID(render_process_id);
if (!rfh)
return false;

rfh->Send(new DesktopNotificationMsg_PostClose(rfh->GetRoutingID(), notification_id, by_user));
rfh->Send(new PlatformNotificationMsg_DidClose(notification_id));
return true;
}

bool NotificationManager::DesktopNotificationPostDisplay(int render_process_id, int render_frame_id, int notification_id) {
content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(render_process_id, render_frame_id);
bool NotificationManager::DesktopNotificationPostDisplay(int render_process_id, int notification_id) {
content::RenderProcessHost* rfh = content::RenderProcessHost::FromID(render_process_id);
if (!rfh)
return false;

rfh->Send(new DesktopNotificationMsg_PostDisplay(rfh->GetRoutingID(), notification_id));
rfh->Send(new PlatformNotificationMsg_DidShow(notification_id));
return true;
}

bool NotificationManager::DesktopNotificationPostError(int render_process_id, int render_frame_id, int notification_id, const base::string16& message) {
content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(render_process_id, render_frame_id);
bool NotificationManager::DesktopNotificationPostError(int render_process_id, int notification_id, const base::string16& message) {
#if 0 //FIXME
content::RenderProcessHost* rfh = content::RenderProcessHost::FromID(render_process_id);
if (!rfh)
return false;

rfh->Send(new DesktopNotificationMsg_PostError(rfh->GetRoutingID(), notification_id));
rfh->Send(new PlatformNotificationMsg_DidError(rfh->GetRoutingID(), notification_id));
#endif
return true;
}
} // namespace nw
17 changes: 5 additions & 12 deletions src/nw_notification_manager.h
Expand Up @@ -45,27 +45,20 @@ class NotificationManager{
// map used to stored desktop notification params used by ImageDownloadCallback
std::map<int, DesktopNotificationParams> desktop_notification_params_;

// internal function for AddDesktopNotification
virtual bool AddDesktopNotification(const content::ShowDesktopNotificationHostMsgParams& params,
const int render_process_id, const int render_frame_id,
const int notification_id, const bool worker,
const std::vector<SkBitmap>* bitmaps);

public:
virtual ~NotificationManager();
static NotificationManager* getSingleton();
virtual bool AddDesktopNotification(
const content::ShowDesktopNotificationHostMsgParams& params,
const int render_process_id,
const int render_frame_id,
const int notification_id,
const bool worker) = 0;
virtual bool CancelDesktopNotification(int render_process_id, int render_frame_id, int notification_id) = 0;
virtual bool CancelDesktopNotification(int render_process_id, int notification_id) = 0;

bool DesktopNotificationPostClick(int render_process_id, int render_frame_id, int notification_id);
bool DesktopNotificationPostClose(int render_process_id, int render_frame_id, int notification_id, bool by_user);
bool DesktopNotificationPostDisplay(int render_process_id, int render_frame_id, int notification_id);
bool DesktopNotificationPostError(int render_process_id, int render_frame_id, int notification_id, const base::string16& message);
bool DesktopNotificationPostClick(int render_process_id, int notification_id);
bool DesktopNotificationPostClose(int render_process_id, int notification_id, bool by_user);
bool DesktopNotificationPostDisplay(int render_process_id, int notification_id);
bool DesktopNotificationPostError(int render_process_id, int notification_id, const base::string16& message);

};

Expand Down
68 changes: 14 additions & 54 deletions src/nw_notification_manager_linux.cc
Expand Up @@ -38,10 +38,9 @@ namespace nw {
NotificationManagerLinux::NotificationManagerLinux() {
notify_init (content::Shell::GetPackage()->GetName().c_str());
char* info[4];
notify_get_server_info(&info[0], &info[1], &info[2], &info[3]);

//Ubuntu notify-osd can only show 1 notification, this is the "hack" to do that
mForceOneNotification = strcmp(info[0], "notify-osd") == 0;
if (notify_get_server_info(&info[0], &info[1], &info[2], &info[3]))
//Ubuntu notify-osd can only show 1 notification, this is the "hack" to do that
mForceOneNotification = strcmp(info[0], "notify-osd") == 0;
}

NotificationManagerLinux::~NotificationManagerLinux() {
Expand All @@ -65,50 +64,19 @@ void NotificationManagerLinux::onClose(NotifyNotification *notif)
}
//int close_reason = notify_notification_get_closed_reason(notif);
//printf("close reason %d\n", close_reason);
singleton->DesktopNotificationPostClose(i->second.mRenderProcessId, i->second.mRenderViewId, i->first, false);
singleton->DesktopNotificationPostClose(i->second.mRenderProcessId, i->first, false);
singleton->mNotificationIDmap.erase(i);
g_object_unref(G_OBJECT(notif));
};

bool NotificationManagerLinux::AddDesktopNotification(const content::ShowDesktopNotificationHostMsgParams& params,
const int render_process_id,
const int render_frame_id,
const int notification_id,
const bool worker,
const std::vector<SkBitmap>* bitmaps) {

content::RenderViewHost* host = content::RenderFrameHost::FromID(render_process_id, render_frame_id)->GetRenderViewHost();
if (host == NULL)
return false;

content::Shell* shell = content::Shell::FromRenderViewHost(host);

if (bitmaps == NULL) {
// called from public function, save the params
DesktopNotificationParams desktop_notification_params;
desktop_notification_params.params_ = params;
desktop_notification_params.render_process_id_ = render_process_id;
desktop_notification_params.render_frame_id_ = render_frame_id;

// download the icon image first
content::WebContents::ImageDownloadCallback imageDownloadCallback = base::Bind(&NotificationManager::ImageDownloadCallback);
int id = shell->web_contents()->DownloadImage(params.icon_url, true, 0, imageDownloadCallback);
desktop_notification_params_[id] = desktop_notification_params;

// wait for the image download callback
return true;
}

// if we reach here, it means the function is called from image download callback
const bool worker) {

SkBitmap bitmap;
// try to get the notification icon image given by image download callback
if (bitmaps->size())
bitmap = bitmaps->at(0);
else {
// set the default notification icon as the app icon
bitmap = shell->window()->app_icon().AsBitmap();
}

bitmap = params.icon;

NotifyNotification * notif;
NotificationMap::iterator i = getNotification(notification_id);
Expand All @@ -118,7 +86,6 @@ bool NotificationManagerLinux::AddDesktopNotification(const content::ShowDesktop
NotificationData data;
data.mNotification = notif;
data.mRenderProcessId = render_process_id;
data.mRenderViewId = render_frame_id;
mNotificationIDmap[notification_id] = data;
}
else {
Expand All @@ -133,42 +100,35 @@ bool NotificationManagerLinux::AddDesktopNotification(const content::ShowDesktop
g_object_ref(G_OBJECT(notif));
onClose(notif);
data.mRenderProcessId = render_process_id;
data.mRenderViewId = render_frame_id;
mNotificationIDmap[notification_id] = data;
}
}

GdkPixbuf* pixbuf = libgtk2ui::GdkPixbufFromSkBitmap(bitmap);
notify_notification_set_image_from_pixbuf(notif, pixbuf);
g_object_unref(pixbuf);
if (pixbuf) {
notify_notification_set_image_from_pixbuf(notif, pixbuf);
g_object_unref(pixbuf);
}

NOTIFY_NOTIFICATION_GET_CLASS(notif)->closed = onClose;

GError* error = NULL;
if (notify_notification_show (notif, &error)) {
DesktopNotificationPostDisplay(render_process_id, render_frame_id, notification_id);
DesktopNotificationPostDisplay(render_process_id, notification_id);
}
else {
base::string16 errorMsg = base::UTF8ToUTF16(error->message);
DesktopNotificationPostError(render_process_id, render_frame_id, notification_id, errorMsg);
DesktopNotificationPostError(render_process_id, notification_id, errorMsg);
}
return error==NULL;
}

bool NotificationManagerLinux::CancelDesktopNotification(int render_process_id, int render_frame_id, int notification_id) {
bool NotificationManagerLinux::CancelDesktopNotification(int render_process_id, int notification_id) {
NotificationMap::const_iterator i = getNotification(notification_id);
if (i!=mNotificationIDmap.end()) {
return notify_notification_close(i->second.mNotification, NULL);
}
return false;
}

bool NotificationManagerLinux::AddDesktopNotification(const content::ShowDesktopNotificationHostMsgParams& params,
const int render_process_id,
const int render_frame_id,
const int notification_id,
const bool worker) {
return AddDesktopNotification(params, render_process_id, render_frame_id, notification_id, worker, NULL);
}

} // namespace nw
13 changes: 2 additions & 11 deletions src/nw_notification_manager_linux.h
Expand Up @@ -40,23 +40,14 @@ class NotificationManagerLinux : public NotificationManager {

NotificationMap::iterator getNotification(int id);

// internal function for AddDesktopNotification
virtual bool AddDesktopNotification(const content::ShowDesktopNotificationHostMsgParams& params,
const int render_process_id,
const int render_frame_id,
const int notification_id,
const bool worker,
const std::vector<SkBitmap>* bitmaps) OVERRIDE;

public:
explicit NotificationManagerLinux();
virtual ~NotificationManagerLinux();
virtual bool AddDesktopNotification(const content::ShowDesktopNotificationHostMsgParams& params,
const int render_process_id,
const int render_frame_id,
const int notification_id,
const bool worker) OVERRIDE;
virtual bool CancelDesktopNotification(int render_process_id, int render_frame_id, int notification_id) OVERRIDE;
const bool worker) override;
virtual bool CancelDesktopNotification(int render_process_id, int notification_id) override;
};

} // namespace nw
Expand Down
23 changes: 15 additions & 8 deletions src/shell_content_browser_client.cc
Expand Up @@ -525,34 +525,41 @@ ShellContentBrowserClient::CreateQuotaPermissionContext() {
return new ShellQuotaPermissionContext();
}

#if 0
void CancelDesktopNotification(int render_process_id, int render_frame_id, int notification_id) {
#if 1
void CancelDesktopNotification(int render_process_id, int notification_id) {
nw::NotificationManager *notificationManager = nw::NotificationManager::getSingleton();
if (notificationManager == NULL) {
NOTIMPLEMENTED();
return;
}
notificationManager->CancelDesktopNotification(render_process_id, render_frame_id, notification_id);
notificationManager->CancelDesktopNotification(render_process_id, notification_id);
}

blink::WebNotificationPermission
ShellContentBrowserClient::CheckDesktopNotificationPermission(
const GURL& source_origin,
content::ResourceContext* context,
int render_process_id) {
return blink::WebNotificationPermissionAllowed;
}

void ShellContentBrowserClient::ShowDesktopNotification(
const ShowDesktopNotificationHostMsgParams& params,
RenderFrameHost* render_frame_host,
BrowserContext* browser_context,
int render_process_id,
scoped_ptr<DesktopNotificationDelegate> delegate,
base::Closure* cancel_callback) {
#if defined(ENABLE_NOTIFICATIONS)
#if 1
nw::NotificationManager *notificationManager = nw::NotificationManager::getSingleton();
if (notificationManager == NULL) {
NOTIMPLEMENTED();
return;
}
content::RenderProcessHost* process = render_frame_host->GetProcess();
content::RenderProcessHost* process = content::RenderProcessHost::FromID(render_process_id);
notificationManager->AddDesktopNotification(params, process->GetID(),
render_frame_host->GetRoutingID(),
delegate->notification_id(),
false);
*cancel_callback = base::Bind(&CancelDesktopNotification, process->GetID(), render_frame_host->GetRoutingID(), delegate->notification_id());
*cancel_callback = base::Bind(&CancelDesktopNotification, process->GetID(), delegate->notification_id());
#else
NOTIMPLEMENTED();
#endif
Expand Down
11 changes: 8 additions & 3 deletions src/shell_content_browser_client.h
Expand Up @@ -100,13 +100,18 @@ class ShellContentBrowserClient : public ContentBrowserClient {
const GURL& effective_url) override;

//Notification
#if 0 //FIXME
blink::WebNotificationPermission CheckDesktopNotificationPermission(
const GURL& source_origin,
content::ResourceContext* context,
int render_process_id) override;

virtual void ShowDesktopNotification(
const ShowDesktopNotificationHostMsgParams& params,
RenderFrameHost* render_frame_host,
BrowserContext* browser_context,
int render_process_id,
scoped_ptr<DesktopNotificationDelegate> delegate,
base::Closure* cancel_callback) override;
#endif

virtual void RequestPermission(
content::PermissionType permission,
content::WebContents* web_contents,
Expand Down

0 comments on commit 55d902d

Please sign in to comment.