| Index: chrome/browser/tab_contents/web_drag_source.cc
|
| diff --git a/chrome/browser/tab_contents/web_drag_source.cc b/chrome/browser/tab_contents/web_drag_source.cc
|
| index 8a9ce8bdd37c3f8be694141b4356eec15c548000..9cfbb2d5cc19a5e56b8a89b6beadd2bbec907261 100644
|
| --- a/chrome/browser/tab_contents/web_drag_source.cc
|
| +++ b/chrome/browser/tab_contents/web_drag_source.cc
|
| @@ -11,6 +11,9 @@
|
| #include "chrome/browser/tab_contents/web_drag_source.h"
|
|
|
| #include "chrome/browser/renderer_host/render_view_host.h"
|
| +#include "chrome/browser/tab_contents/tab_contents.h"
|
| +#include "chrome/common/notification_type.h"
|
| +#include "chrome/common/notification_service.h"
|
|
|
| namespace {
|
|
|
| @@ -33,13 +36,20 @@ static void GetCursorPositions(gfx::NativeWindow wnd, gfx::Point* client,
|
| // WebDragSource, public:
|
|
|
| WebDragSource::WebDragSource(gfx::NativeWindow source_wnd,
|
| - RenderViewHost* render_view_host)
|
| + TabContents* tab_contents)
|
| : BaseDragSource(),
|
| source_wnd_(source_wnd),
|
| - render_view_host_(render_view_host) {
|
| + render_view_host_(tab_contents->render_view_host()) {
|
| + registrar_.Add(this, NotificationType::TAB_CONTENTS_SWAPPED,
|
| + Source<TabContents>(tab_contents));
|
| + registrar_.Add(this, NotificationType::TAB_CONTENTS_DISCONNECTED,
|
| + Source<TabContents>(tab_contents));
|
| }
|
|
|
| void WebDragSource::OnDragSourceCancel() {
|
| + if (!render_view_host_)
|
| + return;
|
| +
|
| gfx::Point client;
|
| gfx::Point screen;
|
| GetCursorPositions(source_wnd_, &client, &screen);
|
| @@ -48,6 +58,9 @@ void WebDragSource::OnDragSourceCancel() {
|
| }
|
|
|
| void WebDragSource::OnDragSourceDrop() {
|
| + if (!render_view_host_)
|
| + return;
|
| +
|
| gfx::Point client;
|
| gfx::Point screen;
|
| GetCursorPositions(source_wnd_, &client, &screen);
|
| @@ -56,9 +69,24 @@ void WebDragSource::OnDragSourceDrop() {
|
| }
|
|
|
| void WebDragSource::OnDragSourceMove() {
|
| + if (!render_view_host_)
|
| + return;
|
| +
|
| gfx::Point client;
|
| gfx::Point screen;
|
| GetCursorPositions(source_wnd_, &client, &screen);
|
| render_view_host_->DragSourceMovedTo(client.x(), client.y(),
|
| screen.x(), screen.y());
|
| }
|
| +
|
| +void WebDragSource::Observe(NotificationType type,
|
| + const NotificationSource& source, const NotificationDetails& details) {
|
| + if (NotificationType::TAB_CONTENTS_SWAPPED == type) {
|
| + // When the tab contents get swapped, our render view host goes away.
|
| + // That's OK, we can continue the drag, we just can't send messages back to
|
| + // our drag source.
|
| + render_view_host_ = NULL;
|
| + } else if (NotificationType::TAB_CONTENTS_DISCONNECTED) {
|
| + NOTREACHED();
|
| + }
|
| +}
|
|
|