Home | History | Annotate | Download | only in tab_contents
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/gtk/tab_contents/web_drag_bookmark_handler_gtk.h"
      6 
      7 #include "chrome/browser/ui/browser.h"
      8 #include "chrome/browser/ui/browser_finder.h"
      9 #include "chrome/browser/ui/browser_window.h"
     10 #include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h"
     11 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
     12 #include "chrome/browser/profiles/profile.h"
     13 #include "content/public/browser/web_contents.h"
     14 #include "ui/base/dragdrop/gtk_dnd_util.h"
     15 
     16 using content::WebContents;
     17 
     18 WebDragBookmarkHandlerGtk::WebDragBookmarkHandlerGtk()
     19     : bookmark_tab_helper_(NULL),
     20       web_contents_(NULL) {
     21 }
     22 
     23 WebDragBookmarkHandlerGtk::~WebDragBookmarkHandlerGtk() {}
     24 
     25 void WebDragBookmarkHandlerGtk::DragInitialize(WebContents* contents) {
     26   bookmark_drag_data_.Clear();
     27 
     28   // Ideally we would want to initialize the the BookmarkTabHelper member in
     29   // the constructor. We cannot do that as the WebDragDestGtk object is
     30   // created during the construction of the WebContents object.  The
     31   // BookmarkTabHelper is created much later.
     32   web_contents_ = contents;
     33   if (!bookmark_tab_helper_)
     34     bookmark_tab_helper_ = BookmarkTabHelper::FromWebContents(contents);
     35 }
     36 
     37 GdkAtom WebDragBookmarkHandlerGtk::GetBookmarkTargetAtom() const {
     38   // For GTK, bookmark drag data is encoded as pickle and associated with
     39   // ui::CHROME_BOOKMARK_ITEM. See WriteBookmarksToSelection() for details.
     40   return ui::GetAtomForTarget(ui::CHROME_BOOKMARK_ITEM);
     41 }
     42 
     43 void WebDragBookmarkHandlerGtk::OnReceiveDataFromGtk(GtkSelectionData* data) {
     44   Profile* profile =
     45       Profile::FromBrowserContext(web_contents_->GetBrowserContext());
     46   bookmark_drag_data_.ReadFromVector(GetNodesFromSelection(
     47       NULL, data, ui::CHROME_BOOKMARK_ITEM, profile, NULL, NULL));
     48   bookmark_drag_data_.SetOriginatingProfile(profile);
     49 }
     50 
     51 void WebDragBookmarkHandlerGtk::OnReceiveProcessedData(
     52     const GURL& url,
     53     const base::string16& title) {
     54   bookmark_drag_data_.ReadFromTuple(url, title);
     55 }
     56 
     57 void WebDragBookmarkHandlerGtk::OnDragOver() {
     58   if (bookmark_tab_helper_ && bookmark_tab_helper_->bookmark_drag_delegate()) {
     59     bookmark_tab_helper_->bookmark_drag_delegate()->OnDragOver(
     60         bookmark_drag_data_);
     61   }
     62 }
     63 
     64 void WebDragBookmarkHandlerGtk::OnDragEnter() {
     65   // This is non-null if the web_contents_ is showing an ExtensionWebUI with
     66   // support for (at the moment experimental) drag and drop extensions.
     67   if (bookmark_tab_helper_ && bookmark_tab_helper_->bookmark_drag_delegate()) {
     68     bookmark_tab_helper_->bookmark_drag_delegate()->OnDragEnter(
     69         bookmark_drag_data_);
     70   }
     71 }
     72 
     73 void WebDragBookmarkHandlerGtk::OnDrop() {
     74   // This is non-null if web_contents_ is showing an ExtensionWebUI with
     75   // support for (at the moment experimental) drag and drop extensions.
     76   if (bookmark_tab_helper_) {
     77     if (bookmark_tab_helper_->bookmark_drag_delegate()) {
     78       bookmark_tab_helper_->bookmark_drag_delegate()->OnDrop(
     79           bookmark_drag_data_);
     80     }
     81 
     82     // Focus the target browser.
     83     Browser* browser = chrome::FindBrowserWithWebContents(web_contents_);
     84     if (browser)
     85       browser->window()->Show();
     86   }
     87 }
     88 
     89 void WebDragBookmarkHandlerGtk::OnDragLeave() {
     90   if (bookmark_tab_helper_ && bookmark_tab_helper_->bookmark_drag_delegate()) {
     91     bookmark_tab_helper_->bookmark_drag_delegate()->OnDragLeave(
     92         bookmark_drag_data_);
     93   }
     94 }
     95