Revert "Don't attempt to clone NSPasteboards."

This reverts commit e11a5a297736acdbc93609906facd5da04e7b6c0.

Reason for revert: https://crbug.com/928684

Original change's description:
> Don't attempt to clone NSPasteboards.
> 
> It doesn't work, as any file promises will be called in, and the
> loop over all the flavors will not be equipped to handle it.
> 
> The MacViews code wants to provide an OSExchangeDataProvider for
> drags that it didn't initiate, so wrap a provider around the
> pasteboard rather than clone it.
> 
> BUG=908349
> TEST=as in bug
> 
> Change-Id: Iae6281a46e6559439f62d5c2097dc10a0cd2006a
> Reviewed-on: https://chromium-review.googlesource.com/c/1447332
> Commit-Queue: Sidney San Martín <[email protected]>
> Auto-Submit: Avi Drissman <[email protected]>
> Reviewed-by: Sidney San Martín <[email protected]>
> Cr-Commit-Position: refs/heads/master@{#628945}

[email protected],[email protected]

Change-Id: I7058a327b8113b044e43516377b839bea68b279d
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 908349
Reviewed-on: https://chromium-review.googlesource.com/c/1455309
Reviewed-by: Leonard Grey <[email protected]>
Commit-Queue: Leonard Grey <[email protected]>
Cr-Commit-Position: refs/heads/master@{#629304}
diff --git a/ui/base/dragdrop/os_exchange_data_provider_builder_mac.mm b/ui/base/dragdrop/os_exchange_data_provider_builder_mac.mm
index a115b31..e8d108a 100644
--- a/ui/base/dragdrop/os_exchange_data_provider_builder_mac.mm
+++ b/ui/base/dragdrop/os_exchange_data_provider_builder_mac.mm
@@ -9,7 +9,7 @@
 namespace ui {
 
 std::unique_ptr<OSExchangeData::Provider> BuildOSExchangeDataProviderMac() {
-  return OSExchangeDataProviderMac::CreateProvider();
+  return std::make_unique<OSExchangeDataProviderMac>();
 }
 
 }  // namespace ui
diff --git a/ui/base/dragdrop/os_exchange_data_provider_mac.h b/ui/base/dragdrop/os_exchange_data_provider_mac.h
index 11dff74..5ba2a69 100644
--- a/ui/base/dragdrop/os_exchange_data_provider_mac.h
+++ b/ui/base/dragdrop/os_exchange_data_provider_mac.h
@@ -5,9 +5,6 @@
 #ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_MAC_H_
 #define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_MAC_H_
 
-#include <memory>
-
-#include "base/mac/scoped_nsobject.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #import "ui/base/clipboard/clipboard_util_mac.h"
@@ -21,22 +18,17 @@
 @class NSString;
 
 namespace ui {
+class UniquePasteboard;
 
 // OSExchangeData::Provider implementation for Mac.
 class UI_BASE_EXPORT OSExchangeDataProviderMac
     : public OSExchangeData::Provider {
  public:
+  OSExchangeDataProviderMac();
   ~OSExchangeDataProviderMac() override;
 
-  // Creates a stand-alone OSExchangeDataProviderMac.
-  static std::unique_ptr<OSExchangeDataProviderMac> CreateProvider();
-
-  // Creates an OSExchangeDataProviderMac object wrapping the given NSPasteboard
-  // object.
-  static std::unique_ptr<OSExchangeDataProviderMac>
-  CreateProviderWrappingPasteboard(NSPasteboard* pasteboard);
-
   // Overridden from OSExchangeData::Provider:
+  std::unique_ptr<Provider> Clone() const override;
   void MarkOriginatedFromRenderer() override;
   bool DidOriginateFromRenderer() const override;
   void SetString(const base::string16& data) override;
@@ -66,25 +58,29 @@
   NSData* GetNSDataForType(NSString* type) const;
 
   // Gets the underlying pasteboard.
-  virtual NSPasteboard* GetPasteboard() const = 0;
+  NSPasteboard* GetPasteboard() const;
 
   // Returns the union of SupportedPasteboardTypes() and the types in the
   // current pasteboard.
   NSArray* GetAvailableTypes() const;
 
+  // Creates an OSExchangeData object from the given NSPasteboard object.
+  static std::unique_ptr<OSExchangeData> CreateDataFromPasteboard(
+      NSPasteboard* pasteboard);
+
   // Returns an array of pasteboard types that can be supported by
   // OSExchangeData.
   static NSArray* SupportedPasteboardTypes();
 
- protected:
-  OSExchangeDataProviderMac();
-  OSExchangeDataProviderMac(const OSExchangeDataProviderMac&);
-  OSExchangeDataProviderMac& operator=(const OSExchangeDataProviderMac&);
-
  private:
+  explicit OSExchangeDataProviderMac(scoped_refptr<ui::UniquePasteboard>);
+  scoped_refptr<ui::UniquePasteboard> pasteboard_;
+
   // Drag image and offset data.
   gfx::ImageSkia drag_image_;
   gfx::Vector2d cursor_offset_;
+
+  DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderMac);
 };
 
 }  // namespace ui
diff --git a/ui/base/dragdrop/os_exchange_data_provider_mac.mm b/ui/base/dragdrop/os_exchange_data_provider_mac.mm
index 1ba06641..68e89f0 100644
--- a/ui/base/dragdrop/os_exchange_data_provider_mac.mm
+++ b/ui/base/dragdrop/os_exchange_data_provider_mac.mm
@@ -22,64 +22,20 @@
 
 namespace ui {
 
-namespace {
+OSExchangeDataProviderMac::OSExchangeDataProviderMac()
+    : pasteboard_(new ui::UniquePasteboard) {}
 
-class OwningProvider : public OSExchangeDataProviderMac {
- public:
-  OwningProvider()
-      : OSExchangeDataProviderMac(),
-        owned_pasteboard_(new ui::UniquePasteboard) {}
-  OwningProvider(const OwningProvider& provider) = default;
-
-  std::unique_ptr<OSExchangeData::Provider> Clone() const override {
-    return std::make_unique<OwningProvider>(*this);
-  }
-
-  NSPasteboard* GetPasteboard() const override {
-    return owned_pasteboard_->get();
-  }
-
- private:
-  scoped_refptr<ui::UniquePasteboard> owned_pasteboard_;
-};
-
-class WrappingProvider : public OSExchangeDataProviderMac {
- public:
-  WrappingProvider(NSPasteboard* pasteboard)
-      : OSExchangeDataProviderMac(), wrapped_pasteboard_([pasteboard retain]) {}
-  WrappingProvider(const WrappingProvider& provider) = default;
-
-  std::unique_ptr<OSExchangeData::Provider> Clone() const override {
-    return std::make_unique<WrappingProvider>(*this);
-  }
-
-  NSPasteboard* GetPasteboard() const override { return wrapped_pasteboard_; }
-
- private:
-  base::scoped_nsobject<NSPasteboard> wrapped_pasteboard_;
-};
-
-}  // namespace
-
-OSExchangeDataProviderMac::OSExchangeDataProviderMac() = default;
 OSExchangeDataProviderMac::OSExchangeDataProviderMac(
-    const OSExchangeDataProviderMac&) = default;
-OSExchangeDataProviderMac& OSExchangeDataProviderMac::operator=(
-    const OSExchangeDataProviderMac&) = default;
+    scoped_refptr<ui::UniquePasteboard> pb)
+    : pasteboard_(pb) {}
 
-OSExchangeDataProviderMac::~OSExchangeDataProviderMac() = default;
-
-// static
-std::unique_ptr<OSExchangeDataProviderMac>
-OSExchangeDataProviderMac::CreateProvider() {
-  return std::make_unique<OwningProvider>();
+OSExchangeDataProviderMac::~OSExchangeDataProviderMac() {
 }
 
-// static
-std::unique_ptr<OSExchangeDataProviderMac>
-OSExchangeDataProviderMac::CreateProviderWrappingPasteboard(
-    NSPasteboard* pasteboard) {
-  return std::make_unique<WrappingProvider>(pasteboard);
+std::unique_ptr<OSExchangeData::Provider>
+OSExchangeDataProviderMac::Clone() const {
+  return std::unique_ptr<OSExchangeData::Provider>(
+      new OSExchangeDataProviderMac(pasteboard_));
 }
 
 void OSExchangeDataProviderMac::MarkOriginatedFromRenderer() {
@@ -92,8 +48,8 @@
 }
 
 void OSExchangeDataProviderMac::SetString(const base::string16& string) {
-  [GetPasteboard() setString:base::SysUTF16ToNSString(string)
-                     forType:NSPasteboardTypeString];
+  [pasteboard_->get() setString:base::SysUTF16ToNSString(string)
+                        forType:NSPasteboardTypeString];
 }
 
 void OSExchangeDataProviderMac::SetURL(const GURL& url,
@@ -101,12 +57,12 @@
   base::scoped_nsobject<NSPasteboardItem> item =
       ClipboardUtil::PasteboardItemFromUrl(base::SysUTF8ToNSString(url.spec()),
                                            base::SysUTF16ToNSString(title));
-  ui::ClipboardUtil::AddDataToPasteboard(GetPasteboard(), item);
+  ui::ClipboardUtil::AddDataToPasteboard(pasteboard_->get(), item);
 }
 
 void OSExchangeDataProviderMac::SetFilename(const base::FilePath& path) {
-  [GetPasteboard() setPropertyList:@[ base::SysUTF8ToNSString(path.value()) ]
-                           forType:NSFilenamesPboardType];
+  [pasteboard_->get() setPropertyList:@[ base::SysUTF8ToNSString(path.value()) ]
+                              forType:NSFilenamesPboardType];
 }
 
 void OSExchangeDataProviderMac::SetFilenames(
@@ -120,19 +76,19 @@
     NSString* path = base::SysUTF8ToNSString(filename.path.value());
     [paths addObject:path];
   }
-  [GetPasteboard() setPropertyList:paths forType:NSFilenamesPboardType];
+  [pasteboard_->get() setPropertyList:paths forType:NSFilenamesPboardType];
 }
 
 void OSExchangeDataProviderMac::SetPickledData(
     const ClipboardFormatType& format,
     const base::Pickle& data) {
   NSData* ns_data = [NSData dataWithBytes:data.data() length:data.size()];
-  [GetPasteboard() setData:ns_data forType:format.ToNSString()];
+  [pasteboard_->get() setData:ns_data forType:format.ToNSString()];
 }
 
 bool OSExchangeDataProviderMac::GetString(base::string16* data) const {
   DCHECK(data);
-  NSString* item = [GetPasteboard() stringForType:NSPasteboardTypeString];
+  NSString* item = [pasteboard_->get() stringForType:NSPasteboardTypeString];
   if (item) {
     *data = base::SysNSStringToUTF16(item);
     return true;
@@ -156,7 +112,7 @@
   DCHECK(url);
   DCHECK(title);
 
-  if (ui::PopulateURLAndTitleFromPasteboard(url, title, GetPasteboard(),
+  if (ui::PopulateURLAndTitleFromPasteboard(url, title, pasteboard_->get(),
                                             false)) {
     return true;
   }
@@ -182,7 +138,8 @@
 }
 
 bool OSExchangeDataProviderMac::GetFilename(base::FilePath* path) const {
-  NSArray* paths = [GetPasteboard() propertyListForType:NSFilenamesPboardType];
+  NSArray* paths =
+      [pasteboard_->get() propertyListForType:NSFilenamesPboardType];
   if ([paths count] == 0)
     return false;
 
@@ -192,7 +149,8 @@
 
 bool OSExchangeDataProviderMac::GetFilenames(
     std::vector<FileInfo>* filenames) const {
-  NSArray* paths = [GetPasteboard() propertyListForType:NSFilenamesPboardType];
+  NSArray* paths =
+      [pasteboard_->get() propertyListForType:NSFilenamesPboardType];
   if ([paths count] == 0)
     return false;
 
@@ -207,7 +165,7 @@
     const ClipboardFormatType& format,
     base::Pickle* data) const {
   DCHECK(data);
-  NSData* ns_data = [GetPasteboard() dataForType:format.ToNSString()];
+  NSData* ns_data = [pasteboard_->get() dataForType:format.ToNSString()];
   if (!ns_data)
     return false;
 
@@ -229,12 +187,12 @@
 }
 
 bool OSExchangeDataProviderMac::HasFile() const {
-  return [[GetPasteboard() types] containsObject:NSFilenamesPboardType];
+  return [[pasteboard_->get() types] containsObject:NSFilenamesPboardType];
 }
 
 bool OSExchangeDataProviderMac::HasCustomFormat(
     const ClipboardFormatType& format) const {
-  return [[GetPasteboard() types] containsObject:format.ToNSString()];
+  return [[pasteboard_->get() types] containsObject:format.ToNSString()];
 }
 
 void OSExchangeDataProviderMac::SetDragImage(
@@ -253,18 +211,34 @@
 }
 
 NSData* OSExchangeDataProviderMac::GetNSDataForType(NSString* type) const {
-  return [GetPasteboard() dataForType:type];
+  return [pasteboard_->get() dataForType:type];
+}
+
+NSPasteboard* OSExchangeDataProviderMac::GetPasteboard() const {
+  return pasteboard_->get();
 }
 
 NSArray* OSExchangeDataProviderMac::GetAvailableTypes() const {
   NSSet* supportedTypes = [NSSet setWithArray:SupportedPasteboardTypes()];
   NSMutableSet* availableTypes =
-      [NSMutableSet setWithArray:[GetPasteboard() types]];
+      [NSMutableSet setWithArray:[pasteboard_->get() types]];
   [availableTypes unionSet:supportedTypes];
   return [availableTypes allObjects];
 }
 
 // static
+std::unique_ptr<OSExchangeData>
+OSExchangeDataProviderMac::CreateDataFromPasteboard(NSPasteboard* pasteboard) {
+  OSExchangeDataProviderMac* provider = new OSExchangeDataProviderMac();
+
+  for (NSPasteboardItem* item in [pasteboard pasteboardItems])
+    ClipboardUtil::AddDataToPasteboard(provider->pasteboard_->get(), item);
+
+  return std::make_unique<OSExchangeData>(
+      base::WrapUnique<OSExchangeData::Provider>(provider));
+}
+
+// static
 NSArray* OSExchangeDataProviderMac::SupportedPasteboardTypes() {
   return @[
     kWebCustomDataPboardType, ui::ClipboardUtil::UTIForWebURLsAndTitles(),