Home | History | Annotate | Download | only in extensions
      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/views/extensions/browser_action_drag_data.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/pickle.h"
      9 #include "base/strings/string_util.h"
     10 #include "chrome/browser/profiles/profile.h"
     11 #include "ui/base/clipboard/clipboard.h"
     12 
     13 namespace {
     14 
     15 // The MIME type for the clipboard format for BrowserActionDragData.
     16 const char kClipboardFormatString[] = "chromium/x-browser-actions";
     17 
     18 }
     19 
     20 BrowserActionDragData::BrowserActionDragData()
     21     : profile_(NULL), index_(static_cast<size_t>(-1)) {
     22 }
     23 
     24 BrowserActionDragData::BrowserActionDragData(
     25     const std::string& id, int index)
     26     : profile_(NULL), id_(id), index_(index) {
     27 }
     28 
     29 bool BrowserActionDragData::GetDropFormats(
     30     std::set<ui::OSExchangeData::CustomFormat>* custom_formats) {
     31   custom_formats->insert(GetBrowserActionCustomFormat());
     32   return true;
     33 }
     34 
     35 bool BrowserActionDragData::AreDropTypesRequired() {
     36   return true;
     37 }
     38 
     39 bool BrowserActionDragData::CanDrop(const ui::OSExchangeData& data,
     40                                     const Profile* profile) {
     41   BrowserActionDragData drop_data;
     42   return drop_data.Read(data) && drop_data.IsFromProfile(profile);
     43 }
     44 
     45 bool BrowserActionDragData::IsFromProfile(const Profile* profile) const {
     46   return profile_ == profile;
     47 }
     48 
     49 #if defined(TOOLKIT_VIEWS)
     50 void BrowserActionDragData::Write(
     51     Profile* profile, ui::OSExchangeData* data) const {
     52   DCHECK(data);
     53   Pickle data_pickle;
     54   WriteToPickle(profile, &data_pickle);
     55   data->SetPickledData(GetBrowserActionCustomFormat(), data_pickle);
     56 }
     57 
     58 bool BrowserActionDragData::Read(const ui::OSExchangeData& data) {
     59   if (!data.HasCustomFormat(GetBrowserActionCustomFormat()))
     60     return false;
     61 
     62   Pickle drag_data_pickle;
     63   if (!data.GetPickledData(GetBrowserActionCustomFormat(), &drag_data_pickle))
     64     return false;
     65 
     66   if (!ReadFromPickle(&drag_data_pickle))
     67     return false;
     68 
     69   return true;
     70 }
     71 
     72 // static
     73 const ui::OSExchangeData::CustomFormat&
     74 BrowserActionDragData::GetBrowserActionCustomFormat() {
     75   CR_DEFINE_STATIC_LOCAL(
     76       ui::OSExchangeData::CustomFormat,
     77       format,
     78       (ui::Clipboard::GetFormatType(kClipboardFormatString)));
     79 
     80   return format;
     81 }
     82 #endif
     83 
     84 void BrowserActionDragData::WriteToPickle(
     85     Profile* profile, Pickle* pickle) const {
     86   pickle->WriteBytes(&profile, sizeof(profile));
     87   pickle->WriteString(id_);
     88   pickle->WriteUInt64(index_);
     89 }
     90 
     91 bool BrowserActionDragData::ReadFromPickle(Pickle* pickle) {
     92   PickleIterator data_iterator(*pickle);
     93 
     94   const char* tmp;
     95   if (!pickle->ReadBytes(&data_iterator, &tmp, sizeof(profile_)))
     96     return false;
     97   memcpy(&profile_, tmp, sizeof(profile_));
     98 
     99   if (!pickle->ReadString(&data_iterator, &id_))
    100     return false;
    101 
    102   uint64 index;
    103   if (!pickle->ReadUInt64(&data_iterator, &index))
    104     return false;
    105   index_ = static_cast<size_t>(index);
    106 
    107   return true;
    108 }
    109