1// Copyright (c) 2011 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#import "chrome/browser/ui/cocoa/drag_util.h"
6
7#include "base/files/file_path.h"
8#include "chrome/browser/profiles/profile.h"
9#include "content/public/browser/plugin_service.h"
10#include "content/public/common/webplugininfo.h"
11#include "ipc/ipc_message.h"
12#include "net/base/filename_util.h"
13#include "net/base/mime_util.h"
14#import "third_party/mozilla/NSPasteboard+Utils.h"
15#import "ui/base/dragdrop/cocoa_dnd_util.h"
16#include "url/gurl.h"
17#include "url/url_constants.h"
18
19using content::PluginService;
20
21namespace drag_util {
22
23namespace {
24
25BOOL IsSupportedFileURL(Profile* profile, const GURL& url) {
26  base::FilePath full_path;
27  net::FileURLToFilePath(url, &full_path);
28
29  std::string mime_type;
30  net::GetMimeTypeFromFile(full_path, &mime_type);
31
32  // This logic mirrors |BufferedResourceHandler::ShouldDownload()|.
33  // TODO(asvitkine): Refactor this out to a common location instead of
34  //                  duplicating code.
35  if (net::IsSupportedMimeType(mime_type))
36    return YES;
37
38  // Check whether there is a plugin that supports the mime type. (e.g. PDF)
39  // TODO(bauerb): This possibly uses stale information, but it's guaranteed not
40  // to do disk access.
41  bool allow_wildcard = false;
42  content::WebPluginInfo plugin;
43  return PluginService::GetInstance()->GetPluginInfo(
44      -1,                // process ID
45      MSG_ROUTING_NONE,  // routing ID
46      profile->GetResourceContext(),
47      url, GURL(), mime_type, allow_wildcard,
48      NULL, &plugin, NULL);
49}
50
51}  // namespace
52
53GURL GetFileURLFromDropData(id<NSDraggingInfo> info) {
54  if ([[info draggingPasteboard] containsURLData]) {
55    GURL url;
56    ui::PopulateURLAndTitleFromPasteboard(&url,
57                                          NULL,
58                                          [info draggingPasteboard],
59                                          YES);
60
61    if (url.SchemeIs(url::kFileScheme))
62      return url;
63  }
64  return GURL();
65}
66
67BOOL IsUnsupportedDropData(Profile* profile, id<NSDraggingInfo> info) {
68  GURL url = GetFileURLFromDropData(info);
69  if (!url.is_empty()) {
70    // If dragging a file, only allow dropping supported file types (that the
71    // web view can display).
72    return !IsSupportedFileURL(profile, url);
73  }
74  return NO;
75}
76
77}  // namespace drag_util
78