// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import "chrome/browser/ui/cocoa/drag_util.h" #include "base/files/file_path.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/plugin_service.h" #include "content/public/common/webplugininfo.h" #include "ipc/ipc_message.h" #include "net/base/filename_util.h" #include "net/base/mime_util.h" #import "third_party/mozilla/NSPasteboard+Utils.h" #import "ui/base/dragdrop/cocoa_dnd_util.h" #include "url/gurl.h" #include "url/url_constants.h" using content::PluginService; namespace drag_util { namespace { BOOL IsSupportedFileURL(Profile* profile, const GURL& url) { base::FilePath full_path; net::FileURLToFilePath(url, &full_path); std::string mime_type; net::GetMimeTypeFromFile(full_path, &mime_type); // This logic mirrors |BufferedResourceHandler::ShouldDownload()|. // TODO(asvitkine): Refactor this out to a common location instead of // duplicating code. if (net::IsSupportedMimeType(mime_type)) return YES; // Check whether there is a plugin that supports the mime type. (e.g. PDF) // TODO(bauerb): This possibly uses stale information, but it's guaranteed not // to do disk access. bool allow_wildcard = false; content::WebPluginInfo plugin; return PluginService::GetInstance()->GetPluginInfo( -1, // process ID MSG_ROUTING_NONE, // routing ID profile->GetResourceContext(), url, GURL(), mime_type, allow_wildcard, NULL, &plugin, NULL); } } // namespace GURL GetFileURLFromDropData(id info) { if ([[info draggingPasteboard] containsURLData]) { GURL url; ui::PopulateURLAndTitleFromPasteboard(&url, NULL, [info draggingPasteboard], YES); if (url.SchemeIs(url::kFileScheme)) return url; } return GURL(); } BOOL IsUnsupportedDropData(Profile* profile, id info) { GURL url = GetFileURLFromDropData(info); if (!url.is_empty()) { // If dragging a file, only allow dropping supported file types (that the // web view can display). return !IsSupportedFileURL(profile, url); } return NO; } } // namespace drag_util