| Index: content/browser/tab_contents/tab_contents_view_aura.cc
|
| ===================================================================
|
| --- content/browser/tab_contents/tab_contents_view_aura.cc (revision 130641)
|
| +++ content/browser/tab_contents/tab_contents_view_aura.cc (working copy)
|
| @@ -2,10 +2,599 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -// This is just a placeholder - TabContentsViewAura is not yet implemented
|
| -// (instead chrome has it's own TabContentsViewViews that is used for Aura).
|
| +#include "content/browser/tab_contents/tab_contents_view_aura.h"
|
|
|
| -// We need to make sure the compiler sees this interface declaration somewhere
|
| -// so that it can emit exported versions of the inline ctor/dtor functions,
|
| -// otherwise chrome.dll will get a linker error on Windows Aura builds.
|
| +#include "base/utf_string_conversions.h"
|
| +#include "content/browser/renderer_host/render_view_host_factory.h"
|
| +#include "content/browser/tab_contents/interstitial_page_impl.h"
|
| +#include "content/browser/tab_contents/tab_contents.h"
|
| +#include "content/public/browser/render_view_host.h"
|
| +#include "content/public/browser/render_widget_host.h"
|
| +#include "content/public/browser/render_widget_host_view.h"
|
| +#include "content/public/browser/web_contents_delegate.h"
|
| #include "content/public/browser/web_contents_view_delegate.h"
|
| +#include "content/public/browser/web_drag_dest_delegate.h"
|
| +#include "ui/aura/client/drag_drop_client.h"
|
| +#include "ui/aura/client/drag_drop_delegate.h"
|
| +#include "ui/aura/event.h"
|
| +#include "ui/aura/root_window.h"
|
| +#include "ui/aura/window.h"
|
| +#include "ui/base/clipboard/custom_data_helper.h"
|
| +#include "ui/base/dragdrop/drag_drop_types.h"
|
| +#include "ui/base/dragdrop/os_exchange_data.h"
|
| +#include "ui/base/dragdrop/os_exchange_data_provider_aura.h"
|
| +#include "ui/base/hit_test.h"
|
| +#include "ui/gfx/compositor/layer.h"
|
| +#include "ui/gfx/screen.h"
|
| +#include "webkit/glue/webdropdata.h"
|
| +
|
| +namespace {
|
| +
|
| +// Listens to all mouse drag events during a drag and drop and sends them to
|
| +// the renderer.
|
| +class WebDragSourceAura : public MessageLoopForUI::Observer {
|
| + public:
|
| + explicit WebDragSourceAura(TabContents* contents)
|
| + : contents_(contents) {
|
| + MessageLoopForUI::current()->AddObserver(this);
|
| + }
|
| +
|
| + virtual ~WebDragSourceAura() {
|
| + MessageLoopForUI::current()->RemoveObserver(this);
|
| + }
|
| +
|
| + // MessageLoop::Observer implementation:
|
| + virtual base::EventStatus WillProcessEvent(
|
| + const base::NativeEvent& event) OVERRIDE {
|
| + return base::EVENT_CONTINUE;
|
| + }
|
| + virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE {
|
| + ui::EventType type = ui::EventTypeFromNative(event);
|
| + content::RenderViewHost* rvh = NULL;
|
| + switch (type) {
|
| + case ui::ET_MOUSE_DRAGGED:
|
| + rvh = contents_->GetRenderViewHost();
|
| + if (rvh) {
|
| + gfx::Point screen_loc = ui::EventLocationFromNative(event);
|
| + gfx::Point client_loc = screen_loc;
|
| + aura::Window* window = rvh->GetView()->GetNativeView();
|
| + aura::Window::ConvertPointToWindow(window->GetRootWindow(),
|
| + window, &client_loc);
|
| + rvh->DragSourceMovedTo(client_loc.x(), client_loc.y(),
|
| + screen_loc.x(), screen_loc.y());
|
| + }
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + }
|
| +
|
| +
|
| + private:
|
| + TabContents* contents_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura);
|
| +};
|
| +
|
| +// Utility to fill a ui::OSExchangeDataProviderAura object from WebDropData.
|
| +void PrepareDragData(const WebDropData& drop_data,
|
| + ui::OSExchangeDataProviderAura* provider) {
|
| + if (!drop_data.plain_text.empty())
|
| + provider->SetString(drop_data.plain_text);
|
| + if (drop_data.url.is_valid())
|
| + provider->SetURL(drop_data.url, drop_data.url_title);
|
| + if (!drop_data.text_html.empty())
|
| + provider->SetHtml(drop_data.text_html, drop_data.html_base_url);
|
| + if (!drop_data.filenames.empty()) {
|
| + std::vector<FilePath> paths;
|
| + for (std::vector<string16>::const_iterator it = drop_data.filenames.begin();
|
| + it != drop_data.filenames.end(); ++it)
|
| + paths.push_back(FilePath::FromUTF8Unsafe(UTF16ToUTF8(*it)));
|
| + provider->SetFilenames(paths);
|
| + }
|
| + if (!drop_data.custom_data.empty()) {
|
| + Pickle pickle;
|
| + ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle);
|
| + provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(),
|
| + pickle);
|
| + }
|
| +}
|
| +
|
| +// Utility to fill a WebDropData object from ui::OSExchangeData.
|
| +void PrepareWebDropData(WebDropData* drop_data,
|
| + const ui::OSExchangeData& data) {
|
| + string16 plain_text, url_title;
|
| + GURL url;
|
| +
|
| + data.GetString(&plain_text);
|
| + if (!plain_text.empty())
|
| + drop_data->plain_text = plain_text;
|
| +
|
| + data.GetURLAndTitle(&url, &url_title);
|
| + if (url.is_valid()) {
|
| + drop_data->url = url;
|
| + drop_data->url_title = url_title;
|
| + }
|
| +
|
| + data.GetHtml(&drop_data->text_html, &drop_data->html_base_url);
|
| +
|
| + std::vector<FilePath> files;
|
| + if (data.GetFilenames(&files) && !files.empty()) {
|
| + for (std::vector<FilePath>::const_iterator it = files.begin();
|
| + it != files.end(); ++it)
|
| + drop_data->filenames.push_back(UTF8ToUTF16(it->AsUTF8Unsafe()));
|
| + }
|
| +
|
| + Pickle pickle;
|
| + if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(),
|
| + &pickle))
|
| + ui::ReadCustomDataIntoMap(pickle.data(), pickle.size(),
|
| + &drop_data->custom_data);
|
| +}
|
| +
|
| +// Utilities to convert between WebKit::WebDragOperationsMask and
|
| +// ui::DragDropTypes.
|
| +int ConvertFromWeb(WebKit::WebDragOperationsMask ops) {
|
| + int drag_op = ui::DragDropTypes::DRAG_NONE;
|
| + if (ops & WebKit::WebDragOperationCopy)
|
| + drag_op |= ui::DragDropTypes::DRAG_COPY;
|
| + if (ops & WebKit::WebDragOperationMove)
|
| + drag_op |= ui::DragDropTypes::DRAG_MOVE;
|
| + if (ops & WebKit::WebDragOperationLink)
|
| + drag_op |= ui::DragDropTypes::DRAG_LINK;
|
| + return drag_op;
|
| +}
|
| +
|
| +WebKit::WebDragOperationsMask ConvertToWeb(int drag_op) {
|
| + int web_drag_op = WebKit::WebDragOperationNone;
|
| + if (drag_op & ui::DragDropTypes::DRAG_COPY)
|
| + web_drag_op |= WebKit::WebDragOperationCopy;
|
| + if (drag_op & ui::DragDropTypes::DRAG_MOVE)
|
| + web_drag_op |= WebKit::WebDragOperationMove;
|
| + if (drag_op & ui::DragDropTypes::DRAG_LINK)
|
| + web_drag_op |= WebKit::WebDragOperationLink;
|
| + return (WebKit::WebDragOperationsMask) web_drag_op;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TabContentsViewAura, public:
|
| +
|
| +TabContentsViewAura::TabContentsViewAura(
|
| + TabContents* tab_contents,
|
| + content::WebContentsViewDelegate* delegate)
|
| + : tab_contents_(tab_contents),
|
| + view_(NULL),
|
| + delegate_(delegate),
|
| + current_drag_op_(WebKit::WebDragOperationNone),
|
| + close_tab_after_drag_ends_(false) {
|
| +}
|
| +
|
| +TabContentsViewAura::~TabContentsViewAura() {
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TabContentsViewAura, private:
|
| +
|
| +void TabContentsViewAura::SizeChangedCommon(const gfx::Size& size) {
|
| + if (tab_contents_->GetInterstitialPage())
|
| + tab_contents_->GetInterstitialPage()->SetSize(size);
|
| + content::RenderWidgetHostView* rwhv =
|
| + tab_contents_->GetRenderWidgetHostView();
|
| + if (rwhv)
|
| + rwhv->SetSize(size);
|
| +}
|
| +
|
| +void TabContentsViewAura::EndDrag(WebKit::WebDragOperationsMask ops) {
|
| + aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
|
| + gfx::Point screen_loc = root_window->last_mouse_location();
|
| + gfx::Point client_loc = screen_loc;
|
| + content::RenderViewHost* rvh = tab_contents_->GetRenderViewHost();
|
| + aura::Window* window = rvh->GetView()->GetNativeView();
|
| + aura::Window::ConvertPointToWindow(root_window, window, &client_loc);
|
| + rvh->DragSourceEndedAt(client_loc.x(), client_loc.y(), screen_loc.x(),
|
| + screen_loc.y(), ops);
|
| +}
|
| +
|
| +content::WebDragDestDelegate* TabContentsViewAura::GetDragDestDelegate() {
|
| + return delegate_.get() ? delegate_->GetDragDestDelegate() : NULL;
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TabContentsViewAura, WebContentsView implementation:
|
| +
|
| +void TabContentsViewAura::CreateView(const gfx::Size& initial_size) {
|
| + initial_size_ = initial_size;
|
| +
|
| + window_.reset(new aura::Window(this));
|
| + window_->SetType(aura::client::WINDOW_TYPE_CONTROL);
|
| + window_->SetTransparent(false);
|
| + window_->Init(ui::LAYER_TEXTURED);
|
| + window_->layer()->SetMasksToBounds(true);
|
| + window_->SetName("TabContentsViewAura");
|
| +
|
| + // TODO(beng): allow for delegate init step.
|
| +
|
| + // TODO(beng): drag & drop init.
|
| +}
|
| +
|
| +content::RenderWidgetHostView* TabContentsViewAura::CreateViewForWidget(
|
| + content::RenderWidgetHost* render_widget_host) {
|
| + if (render_widget_host->GetView()) {
|
| + // During testing, the view will already be set up in most cases to the
|
| + // test view, so we don't want to clobber it with a real one. To verify that
|
| + // this actually is happening (and somebody isn't accidentally creating the
|
| + // view twice), we check for the RVH Factory, which will be set when we're
|
| + // making special ones (which go along with the special views).
|
| + DCHECK(RenderViewHostFactory::has_factory());
|
| + return render_widget_host->GetView();
|
| + }
|
| +
|
| + view_ = content::RenderWidgetHostView::CreateViewForWidget(
|
| + render_widget_host);
|
| + view_->InitAsChild(NULL);
|
| + GetNativeView()->AddChild(view_->GetNativeView());
|
| + view_->Show();
|
| +
|
| + // We listen to drag drop events in the newly created view's window.
|
| + aura::client::SetDragDropDelegate(view_->GetNativeView(), this);
|
| + return view_;
|
| +}
|
| +
|
| +gfx::NativeView TabContentsViewAura::GetNativeView() const {
|
| + return window_.get();
|
| +}
|
| +
|
| +gfx::NativeView TabContentsViewAura::GetContentNativeView() const {
|
| + return view_->GetNativeView();
|
| +}
|
| +
|
| +gfx::NativeWindow TabContentsViewAura::GetTopLevelNativeWindow() const {
|
| + return window_->GetToplevelWindow();
|
| +}
|
| +
|
| +void TabContentsViewAura::GetContainerBounds(gfx::Rect *out) const {
|
| + *out = window_->GetScreenBounds();
|
| +}
|
| +
|
| +void TabContentsViewAura::SetPageTitle(const string16& title) {
|
| + window_->set_title(title);
|
| +}
|
| +
|
| +void TabContentsViewAura::OnTabCrashed(base::TerminationStatus status,
|
| + int error_code) {
|
| + view_ = NULL;
|
| +}
|
| +
|
| +void TabContentsViewAura::SizeContents(const gfx::Size& size) {
|
| + gfx::Rect bounds = window_->bounds();
|
| + if (bounds.size() != size) {
|
| + bounds.set_size(size);
|
| + window_->SetBounds(bounds);
|
| + } else {
|
| + // Our size matches what we want but the renderers size may not match.
|
| + // Pretend we were resized so that the renderers size is updated too.
|
| + SizeChangedCommon(size);
|
| +
|
| + }
|
| +}
|
| +
|
| +void TabContentsViewAura::RenderViewCreated(content::RenderViewHost* host) {
|
| +}
|
| +
|
| +void TabContentsViewAura::Focus() {
|
| + if (tab_contents_->GetInterstitialPage()) {
|
| + tab_contents_->GetInterstitialPage()->Focus();
|
| + return;
|
| + }
|
| +
|
| + if (delegate_.get() && delegate_->Focus())
|
| + return;
|
| +
|
| + content::RenderWidgetHostView* rwhv =
|
| + tab_contents_->GetRenderWidgetHostView();
|
| + if (rwhv)
|
| + rwhv->Focus();
|
| +}
|
| +
|
| +void TabContentsViewAura::SetInitialFocus() {
|
| + if (tab_contents_->FocusLocationBarByDefault())
|
| + tab_contents_->SetFocusToLocationBar(false);
|
| + else
|
| + Focus();
|
| +}
|
| +
|
| +void TabContentsViewAura::StoreFocus() {
|
| + if (delegate_.get())
|
| + delegate_->StoreFocus();
|
| +}
|
| +
|
| +void TabContentsViewAura::RestoreFocus() {
|
| + if (delegate_.get())
|
| + delegate_->RestoreFocus();
|
| +}
|
| +
|
| +bool TabContentsViewAura::IsDoingDrag() const {
|
| + aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
|
| + if (aura::client::GetDragDropClient(root_window))
|
| + return aura::client::GetDragDropClient(root_window)->IsDragDropInProgress();
|
| + return false;
|
| +}
|
| +
|
| +void TabContentsViewAura::CancelDragAndCloseTab() {
|
| + DCHECK(IsDoingDrag());
|
| + // We can't close the tab while we're in the drag and
|
| + // |drag_handler_->CancelDrag()| is async. Instead, set a flag to cancel
|
| + // the drag and when the drag nested message loop ends, close the tab.
|
| + aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
|
| + if (aura::client::GetDragDropClient(root_window))
|
| + aura::client::GetDragDropClient(root_window)->DragCancel();
|
| +
|
| + close_tab_after_drag_ends_ = true;
|
| +}
|
| +
|
| +bool TabContentsViewAura::IsEventTracking() const {
|
| + return false;
|
| +}
|
| +
|
| +void TabContentsViewAura::CloseTabAfterEventTracking() {
|
| +}
|
| +
|
| +void TabContentsViewAura::GetViewBounds(gfx::Rect* out) const {
|
| + *out = window_->GetScreenBounds();
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TabContentsViewAura, RenderViewHostDelegate::View implementation:
|
| +
|
| +void TabContentsViewAura::CreateNewWindow(
|
| + int route_id,
|
| + const ViewHostMsg_CreateWindow_Params& params) {
|
| + tab_contents_view_helper_.CreateNewWindow(tab_contents_, route_id, params);
|
| +}
|
| +
|
| +void TabContentsViewAura::CreateNewWidget(int route_id,
|
| + WebKit::WebPopupType popup_type) {
|
| + tab_contents_view_helper_.CreateNewWidget(tab_contents_,
|
| + route_id,
|
| + false,
|
| + popup_type);
|
| +}
|
| +
|
| +void TabContentsViewAura::CreateNewFullscreenWidget(int route_id) {
|
| + tab_contents_view_helper_.CreateNewWidget(tab_contents_,
|
| + route_id,
|
| + true,
|
| + WebKit::WebPopupTypeNone);
|
| +}
|
| +
|
| +void TabContentsViewAura::ShowCreatedWindow(int route_id,
|
| + WindowOpenDisposition disposition,
|
| + const gfx::Rect& initial_pos,
|
| + bool user_gesture) {
|
| + tab_contents_view_helper_.ShowCreatedWindow(
|
| + tab_contents_, route_id, disposition, initial_pos, user_gesture);
|
| +}
|
| +
|
| +void TabContentsViewAura::ShowCreatedWidget(int route_id,
|
| + const gfx::Rect& initial_pos) {
|
| + tab_contents_view_helper_.ShowCreatedWidget(tab_contents_,
|
| + route_id,
|
| + false,
|
| + initial_pos);
|
| +}
|
| +
|
| +void TabContentsViewAura::ShowCreatedFullscreenWidget(int route_id) {
|
| + tab_contents_view_helper_.ShowCreatedWidget(tab_contents_,
|
| + route_id,
|
| + true,
|
| + gfx::Rect());
|
| +}
|
| +
|
| +void TabContentsViewAura::ShowContextMenu(
|
| + const content::ContextMenuParams& params) {
|
| + // Allow WebContentsDelegates to handle the context menu operation first.
|
| + if (tab_contents_->GetDelegate() &&
|
| + tab_contents_->GetDelegate()->HandleContextMenu(params)) {
|
| + return;
|
| + }
|
| +
|
| + if (delegate_.get())
|
| + delegate_->ShowContextMenu(params);
|
| +}
|
| +
|
| +void TabContentsViewAura::ShowPopupMenu(const gfx::Rect& bounds,
|
| + int item_height,
|
| + double item_font_size,
|
| + int selected_item,
|
| + const std::vector<WebMenuItem>& items,
|
| + bool right_aligned) {
|
| + // External popup menus are only used on Mac.
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void TabContentsViewAura::StartDragging(
|
| + const WebDropData& drop_data,
|
| + WebKit::WebDragOperationsMask operations,
|
| + const SkBitmap& image,
|
| + const gfx::Point& image_offset) {
|
| + aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
|
| + if (!aura::client::GetDragDropClient(root_window))
|
| + return;
|
| +
|
| + ui::OSExchangeDataProviderAura* provider = new ui::OSExchangeDataProviderAura;
|
| + PrepareDragData(drop_data, provider);
|
| + if (!image.isNull())
|
| + provider->set_drag_image(image);
|
| + ui::OSExchangeData data(provider); // takes ownership of |provider|.
|
| +
|
| + scoped_ptr<WebDragSourceAura> drag_source(
|
| + new WebDragSourceAura(tab_contents_));
|
| +
|
| + // We need to enable recursive tasks on the message loop so we can get
|
| + // updates while in the system DoDragDrop loop.
|
| + int result_op = 0;
|
| + {
|
| + // TODO(sad): Avoid using last_mouse_location here, since the drag may not
|
| + // always start from a mouse-event (e.g. a touch or gesture event could
|
| + // initiate the drag). The location information should be carried over from
|
| + // webkit. http://crbug.com/114754
|
| + gfx::Point location(root_window->last_mouse_location());
|
| + location.Offset(-image_offset.x(), -image_offset.y());
|
| + MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
|
| + result_op = aura::client::GetDragDropClient(root_window)->StartDragAndDrop(
|
| + data, location, ConvertFromWeb(operations));
|
| + }
|
| +
|
| + EndDrag(ConvertToWeb(result_op));
|
| + tab_contents_->GetRenderViewHost()->DragSourceSystemDragEnded();}
|
| +
|
| +void TabContentsViewAura::UpdateDragCursor(WebKit::WebDragOperation operation) {
|
| + current_drag_op_ = operation;
|
| +}
|
| +
|
| +void TabContentsViewAura::GotFocus() {
|
| + if (tab_contents_->GetDelegate())
|
| + tab_contents_->GetDelegate()->WebContentsFocused(tab_contents_);
|
| +}
|
| +
|
| +void TabContentsViewAura::TakeFocus(bool reverse) {
|
| + if (tab_contents_->GetDelegate() &&
|
| + !tab_contents_->GetDelegate()->TakeFocus(reverse) &&
|
| + delegate_.get()) {
|
| + delegate_->TakeFocus(reverse);
|
| + }
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TabContentsViewAura, aura::WindowDelegate implementation:
|
| +
|
| +gfx::Size TabContentsViewAura::GetMinimumSize() const {
|
| + return gfx::Size();
|
| +}
|
| +
|
| +void TabContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
|
| + const gfx::Rect& new_bounds) {
|
| + SizeChangedCommon(new_bounds.size());
|
| + if (delegate_.get())
|
| + delegate_->SizeChanged(new_bounds.size());
|
| +}
|
| +
|
| +void TabContentsViewAura::OnFocus() {
|
| +}
|
| +
|
| +void TabContentsViewAura::OnBlur() {
|
| +}
|
| +
|
| +bool TabContentsViewAura::OnKeyEvent(aura::KeyEvent* event) {
|
| + return false;
|
| +}
|
| +
|
| +gfx::NativeCursor TabContentsViewAura::GetCursor(const gfx::Point& point) {
|
| + return gfx::kNullCursor;
|
| +}
|
| +
|
| +int TabContentsViewAura::GetNonClientComponent(const gfx::Point& point) const {
|
| + return HTCLIENT;
|
| +}
|
| +
|
| +bool TabContentsViewAura::OnMouseEvent(aura::MouseEvent* event) {
|
| + if (!tab_contents_->GetDelegate())
|
| + return false;
|
| +
|
| + switch (event->type()) {
|
| + case ui::ET_MOUSE_PRESSED:
|
| + tab_contents_->GetDelegate()->ActivateContents(tab_contents_);
|
| + break;
|
| + case ui::ET_MOUSE_MOVED:
|
| + tab_contents_->GetDelegate()->ContentsMouseEvent(
|
| + tab_contents_, gfx::Screen::GetCursorScreenPoint(), true);
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +ui::TouchStatus TabContentsViewAura::OnTouchEvent(aura::TouchEvent* event) {
|
| + return ui::TOUCH_STATUS_UNKNOWN;
|
| +}
|
| +
|
| +ui::GestureStatus TabContentsViewAura::OnGestureEvent(
|
| + aura::GestureEvent* event) {
|
| + return ui::GESTURE_STATUS_UNKNOWN;
|
| +}
|
| +
|
| +bool TabContentsViewAura::CanFocus() {
|
| + return false;
|
| +}
|
| +
|
| +void TabContentsViewAura::OnCaptureLost() {
|
| +}
|
| +
|
| +void TabContentsViewAura::OnPaint(gfx::Canvas* canvas) {
|
| +}
|
| +
|
| +void TabContentsViewAura::OnWindowDestroying() {
|
| +}
|
| +
|
| +void TabContentsViewAura::OnWindowDestroyed() {
|
| +}
|
| +
|
| +void TabContentsViewAura::OnWindowVisibilityChanged(bool visible) {
|
| + if (visible)
|
| + tab_contents_->ShowContents();
|
| + else
|
| + tab_contents_->HideContents();
|
| +}
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// TabContentsViewAura, aura::client::DragDropDelegate implementation:
|
| +
|
| +void TabContentsViewAura::OnDragEntered(const aura::DropTargetEvent& event) {
|
| + if (GetDragDestDelegate())
|
| + GetDragDestDelegate()->DragInitialize(tab_contents_);
|
| +
|
| + WebDropData drop_data;
|
| + PrepareWebDropData(&drop_data, event.data());
|
| + WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
|
| +
|
| + gfx::Point screen_pt =
|
| + GetNativeView()->GetRootWindow()->last_mouse_location();
|
| + tab_contents_->GetRenderViewHost()->DragTargetDragEnter(
|
| + drop_data, event.location(), screen_pt, op);
|
| +
|
| + if (GetDragDestDelegate()) {
|
| + GetDragDestDelegate()->OnReceiveDragData(event.data());
|
| + GetDragDestDelegate()->OnDragEnter();
|
| + }
|
| +}
|
| +
|
| +int TabContentsViewAura::OnDragUpdated(const aura::DropTargetEvent& event) {
|
| + WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
|
| + gfx::Point screen_pt =
|
| + GetNativeView()->GetRootWindow()->last_mouse_location();
|
| + tab_contents_->GetRenderViewHost()->DragTargetDragOver(
|
| + event.location(), screen_pt, op);
|
| +
|
| + if (GetDragDestDelegate())
|
| + GetDragDestDelegate()->OnDragOver();
|
| +
|
| + return ConvertFromWeb(current_drag_op_);
|
| +}
|
| +
|
| +void TabContentsViewAura::OnDragExited() {
|
| + tab_contents_->GetRenderViewHost()->DragTargetDragLeave();
|
| + if (GetDragDestDelegate())
|
| + GetDragDestDelegate()->OnDragLeave();
|
| +}
|
| +
|
| +int TabContentsViewAura::OnPerformDrop(const aura::DropTargetEvent& event) {
|
| + tab_contents_->GetRenderViewHost()->DragTargetDrop(
|
| + event.location(),
|
| + GetNativeView()->GetRootWindow()->last_mouse_location());
|
| + if (GetDragDestDelegate())
|
| + GetDragDestDelegate()->OnDrop();
|
| + return current_drag_op_;
|
| +}
|
|
|