blob: 3355ecaf6f486c2dcc1448484d600fcddf2daa8d [file] [log] [blame]
revemanb195f41d2015-11-19 22:16:481// Copyright 2015 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
Scott Violetc668e3f92017-07-20 17:35:395#include "chrome/browser/exo_parts.h"
revemanb195f41d2015-11-19 22:16:486
dcheng4af48582016-04-19 00:29:357#include "base/memory/ptr_util.h"
8
Scott Violet737fb752018-04-11 15:35:229#include "ash/public/cpp/ash_switches.h"
10#include "ash/shell.h"
revemanb195f41d2015-11-19 22:16:4811#include "base/command_line.h"
avie4d7b6f2015-12-26 00:59:1812#include "base/macros.h"
Scott Violetc668e3f92017-07-20 17:35:3913#include "base/memory/ptr_util.h"
Satoshi Niwa22ac0e632018-01-30 04:41:0314#include "chrome/browser/chromeos/file_manager/app_id.h"
15#include "chrome/browser/chromeos/file_manager/fileapi_util.h"
Daichi Hirono0cf590f82017-08-21 01:37:0616#include "chrome/browser/chromeos/file_manager/path_util.h"
Satoshi Niwa22ac0e632018-01-30 04:41:0317#include "chrome/browser/chromeos/profiles/profile_helper.h"
revemanb195f41d2015-11-19 22:16:4818#include "chrome/common/chrome_switches.h"
Daichi Hirono0cf590f82017-08-21 01:37:0619#include "components/exo/file_helper.h"
Satoshi Niwa22ac0e632018-01-30 04:41:0320#include "components/user_manager/user_manager.h"
revemanb195f41d2015-11-19 22:16:4821#include "content/public/browser/browser_thread.h"
Satoshi Niwa22ac0e632018-01-30 04:41:0322#include "content/public/common/drop_data.h"
23#include "storage/browser/fileapi/file_system_context.h"
24#include "storage/browser/fileapi/file_system_url.h"
Scott Violet41d9e2a2018-06-20 23:36:0025#include "ui/base/ui_base_features.h"
revemanb195f41d2015-11-19 22:16:4826
Daichi Hirono0cf590f82017-08-21 01:37:0627namespace {
28
29constexpr char kMimeTypeArcUriList[] = "application/x-arc-uri-list";
30
Satoshi Niwa22ac0e632018-01-30 04:41:0331storage::FileSystemContext* GetFileSystemContext() {
32 // Obtains the primary profile.
33 if (!user_manager::UserManager::IsInitialized())
34 return nullptr;
35 const user_manager::User* primary_user =
36 user_manager::UserManager::Get()->GetPrimaryUser();
37 if (!primary_user)
38 return nullptr;
39 Profile* primary_profile =
40 chromeos::ProfileHelper::Get()->GetProfileByUser(primary_user);
41 if (!primary_profile)
42 return nullptr;
43
44 return file_manager::util::GetFileSystemContextForExtensionId(
45 primary_profile, file_manager::kFileManagerAppId);
46}
47
Satoshi Niwae40eeeb2018-02-19 10:36:1048void GetFileSystemUrlsFromPickle(
49 const base::Pickle& pickle,
50 std::vector<storage::FileSystemURL>* file_system_urls) {
51 storage::FileSystemContext* file_system_context = GetFileSystemContext();
52 if (!file_system_context)
53 return;
54
55 std::vector<content::DropData::FileSystemFileInfo> file_system_files;
56 if (!content::DropData::FileSystemFileInfo::ReadFileSystemFilesFromPickle(
57 pickle, &file_system_files))
58 return;
59
60 for (const auto& file_system_file : file_system_files) {
61 const storage::FileSystemURL file_system_url =
62 file_system_context->CrackURL(file_system_file.url);
63 if (file_system_url.is_valid())
64 file_system_urls->push_back(file_system_url);
65 }
66}
67
Daichi Hirono0cf590f82017-08-21 01:37:0668class ChromeFileHelper : public exo::FileHelper {
69 public:
Satoshi Niwae40eeeb2018-02-19 10:36:1070 ChromeFileHelper() = default;
71 ~ChromeFileHelper() override = default;
Daichi Hirono0cf590f82017-08-21 01:37:0672
73 // exo::FileHelper:
74 std::string GetMimeTypeForUriList() const override {
75 return kMimeTypeArcUriList;
76 }
Satoshi Niwae40eeeb2018-02-19 10:36:1077
Daichi Hironof3f855c02018-01-16 01:50:1678 bool GetUrlFromPath(const std::string& app_id,
79 const base::FilePath& path,
80 GURL* out) override {
Daichi Hirono0cf590f82017-08-21 01:37:0681 return file_manager::util::ConvertPathToArcUrl(path, out);
82 }
Satoshi Niwae40eeeb2018-02-19 10:36:1083
84 bool HasUrlsInPickle(const base::Pickle& pickle) override {
85 std::vector<storage::FileSystemURL> file_system_urls;
86 GetFileSystemUrlsFromPickle(pickle, &file_system_urls);
87 return !file_system_urls.empty();
88 }
89
90 void GetUrlsFromPickle(const std::string& app_id,
Satoshi Niwa22ac0e632018-01-30 04:41:0391 const base::Pickle& pickle,
Satoshi Niwae40eeeb2018-02-19 10:36:1092 UrlsFromPickleCallback callback) override {
93 std::vector<storage::FileSystemURL> file_system_urls;
94 GetFileSystemUrlsFromPickle(pickle, &file_system_urls);
95 if (file_system_urls.empty()) {
96 std::move(callback).Run(std::vector<GURL>());
97 return;
Satoshi Niwa22ac0e632018-01-30 04:41:0398 }
Satoshi Niwaaa4f22e2018-04-02 03:08:2499 file_manager::util::ConvertToContentUrls(file_system_urls,
100 std::move(callback));
Daichi Hironof3f855c02018-01-16 01:50:16101 }
Daichi Hirono0cf590f82017-08-21 01:37:06102};
103
104} // namespace
105
Scott Violetc668e3f92017-07-20 17:35:39106// static
107std::unique_ptr<ExoParts> ExoParts::CreateIfNecessary() {
Peng Huang0a460572017-09-25 18:56:54108 // For mash, exosphere will not run in the browser process.
Scott Violet41d9e2a2018-06-20 23:36:00109 if (!features::IsAshInBrowserProcess())
Peng Huang0a460572017-09-25 18:56:54110 return nullptr;
penghuang608523d42016-08-18 17:05:28111 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
Scott Violet737fb752018-04-11 15:35:22112 ash::switches::kAshEnableWaylandServer)) {
Scott Violetc668e3f92017-07-20 17:35:39113 return nullptr;
114 }
revemanb195f41d2015-11-19 22:16:48115
Scott Violetc668e3f92017-07-20 17:35:39116 return base::WrapUnique(new ExoParts());
117}
118
119ExoParts::~ExoParts() {
Scott Violet737fb752018-04-11 15:35:22120 ash::Shell::Get()->DestroyWaylandServer();
Scott Violetc668e3f92017-07-20 17:35:39121}
122
123ExoParts::ExoParts() {
Scott Violet41d9e2a2018-06-20 23:36:00124 DCHECK(features::IsAshInBrowserProcess());
Scott Violet737fb752018-04-11 15:35:22125 std::unique_ptr<ChromeFileHelper> file_helper =
126 std::make_unique<ChromeFileHelper>();
Xiyuan Xia36197372018-04-25 00:45:17127 ash::Shell::Get()->InitWaylandServer(std::move(file_helper));
revemanb195f41d2015-11-19 22:16:48128}