Commit 10646707 authored by Yusuke Sato's avatar Yusuke Sato Committed by Commit Bot

arcvm: Get the board name from the generated prop file instead

On some boards like nami, CrOS rootfs' build.prop doesn't have the
complete ro.product.board entry. It's sometimes a template. To always
get the board name on all boards, ArcDefaultAppList needs to wait
for ArcSessionManager to generate the board's own build.prop file
in its stateful partition. This is the same as what arc-setup does
today.

This CL also stops special casing ARCVM and does the same for
ARC too. Also, when calling GetBoardName(), this CL uses
MayBlock() to make it debug build compatible.

BUG=b:144199481
TEST=try, ARCVM still starts

Change-Id: Ie878d9ffff98ecf3b9dccb837fd6dce1a382a4be
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2026668
Commit-Queue: Yusuke Sato <yusukes@chromium.org>
Reviewed-by: default avatarYury Khmel <khmel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739250}
parent ca182c3d
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include "base/strings/string_split.h" #include "base/strings/string_split.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/task/task_traits.h"
#include "base/task_runner.h"
#include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
...@@ -43,10 +45,6 @@ const base::FilePath::CharType kArcTestDirectory[] = ...@@ -43,10 +45,6 @@ const base::FilePath::CharType kArcTestDirectory[] =
FILE_PATH_LITERAL("arc_default_apps"); FILE_PATH_LITERAL("arc_default_apps");
const base::FilePath::CharType kArcTestBoardDirectory[] = const base::FilePath::CharType kArcTestBoardDirectory[] =
FILE_PATH_LITERAL("arc_board_default_apps"); FILE_PATH_LITERAL("arc_board_default_apps");
const base::FilePath::CharType kBoardDirectory[] =
FILE_PATH_LITERAL("/var/cache/arc_default_apps");
const base::FilePath::CharType kBuildProp[] =
FILE_PATH_LITERAL("/usr/share/arcvm/properties/build.prop");
bool use_test_apps_directory = false; bool use_test_apps_directory = false;
...@@ -177,14 +175,42 @@ ArcDefaultAppList::ArcDefaultAppList(Profile* profile, ...@@ -177,14 +175,42 @@ ArcDefaultAppList::ArcDefaultAppList(Profile* profile,
base::OnceClosure ready_callback) base::OnceClosure ready_callback)
: profile_(profile), ready_callback_(std::move(ready_callback)) { : profile_(profile), ready_callback_(std::move(ready_callback)) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
arc::ArcSessionManager::Get()->AddObserver(this);
}
ArcDefaultAppList::~ArcDefaultAppList() {
auto* manager = arc::ArcSessionManager::Get();
if (manager) // for unit testing
manager->RemoveObserver(this);
}
void ArcDefaultAppList::OnPropertyFilesExpanded(bool result) {
if (!result) {
// Failed to generate |kGeneratedPropertyFilesPath[Vm]| for whatever reason.
// Continue anyway not to stall the launcher initialization. In this case,
// ARC[VM] itself won't start, so not being able to get the board name won't
// be a huge problem either.
VLOG(1) << "Unable to get the board name.";
LoadDefaultApps(std::string());
return;
}
VLOG(1) << "Getting the board name";
const char* source_dir = arc::IsArcVmEnabled()
? arc::kGeneratedPropertyFilesPathVm
: arc::kGeneratedPropertyFilesPath;
base::PostTaskAndReplyWithResult(
FROM_HERE,
{base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_VISIBLE},
base::BindOnce(&GetBoardName,
base::FilePath(source_dir).Append("build.prop")),
base::BindOnce(&ArcDefaultAppList::LoadDefaultApps,
weak_ptr_factory_.GetWeakPtr()));
}
// Load default apps from two sources. void ArcDefaultAppList::LoadDefaultApps(std::string board_name) {
// /usr/share/google-chrome/extensions/arc - contains default apps for all VLOG(1) << "Start loading default apps. Board name is "
// boards that share the same image. << (board_name.empty() ? "<unknown>" : board_name);
// /var/cache/arc_default_apps that is link to
// /usr/share/google-chrome/extensions/arc/BOARD_NAME - contains default
// apps for particular current board.
//
std::vector<base::FilePath> sources; std::vector<base::FilePath> sources;
base::FilePath base_path; base::FilePath base_path;
...@@ -194,16 +220,8 @@ ArcDefaultAppList::ArcDefaultAppList(Profile* profile, ...@@ -194,16 +220,8 @@ ArcDefaultAppList::ArcDefaultAppList(Profile* profile,
DCHECK(valid_path); DCHECK(valid_path);
const base::FilePath base_arc_path = base_path.Append(kArcDirectory); const base::FilePath base_arc_path = base_path.Append(kArcDirectory);
sources.push_back(base_arc_path); sources.push_back(base_arc_path);
if (arc::IsArcVmEnabled()) { if (!board_name.empty())
// ARCVM environment doesn't have the symlink. Get the board name on the sources.push_back(base_arc_path.Append(board_name));
// fly instead.
// TODO(yusukes): Do the same for ARC and remove the arc-setup code for
// creating the symlink.
sources.push_back(
base_arc_path.Append(GetBoardName(base::FilePath(kBuildProp))));
} else {
sources.push_back(base::FilePath(kBoardDirectory));
}
} else { } else {
const bool valid_path = const bool valid_path =
base::PathService::Get(chrome::DIR_TEST_DATA, &base_path); base::PathService::Get(chrome::DIR_TEST_DATA, &base_path);
...@@ -228,8 +246,6 @@ ArcDefaultAppList::ArcDefaultAppList(Profile* profile, ...@@ -228,8 +246,6 @@ ArcDefaultAppList::ArcDefaultAppList(Profile* profile,
} }
} }
ArcDefaultAppList::~ArcDefaultAppList() = default;
void ArcDefaultAppList::OnAppsRead(std::unique_ptr<AppInfoMap> apps) { void ArcDefaultAppList::OnAppsRead(std::unique_ptr<AppInfoMap> apps) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
class Profile; class Profile;
...@@ -25,7 +26,7 @@ class PrefRegistrySyncable; ...@@ -25,7 +26,7 @@ class PrefRegistrySyncable;
} // namespace user_prefs } // namespace user_prefs
// Contains map of default pre-installed apps and packages. // Contains map of default pre-installed apps and packages.
class ArcDefaultAppList { class ArcDefaultAppList : public arc::ArcSessionManager::Observer {
public: public:
struct AppInfo { struct AppInfo {
AppInfo(const std::string& name, AppInfo(const std::string& name,
...@@ -57,7 +58,7 @@ class ArcDefaultAppList { ...@@ -57,7 +58,7 @@ class ArcDefaultAppList {
using AppInfoMap = std::map<std::string, std::unique_ptr<AppInfo>>; using AppInfoMap = std::map<std::string, std::unique_ptr<AppInfo>>;
ArcDefaultAppList(Profile* profile, base::OnceClosure ready_callback); ArcDefaultAppList(Profile* profile, base::OnceClosure ready_callback);
~ArcDefaultAppList(); ~ArcDefaultAppList() override;
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
static void UseTestAppsDirectory(); static void UseTestAppsDirectory();
...@@ -90,6 +91,18 @@ class ArcDefaultAppList { ...@@ -90,6 +91,18 @@ class ArcDefaultAppList {
} }
private: private:
// arc::ArcSessionManager::Observer:
void OnPropertyFilesExpanded(bool result) override;
// Loads default apps from two sources:
//
// /usr/share/google-chrome/extensions/arc - contains default apps for all
// boards that share the same image.
// /usr/share/google-chrome/extensions/arc/<BOARD_NAME> - contains default
// apps for particular current board.
//
void LoadDefaultApps(std::string board_name);
// Called when default apps are read from the provided source. // Called when default apps are read from the provided source.
void OnAppsRead(std::unique_ptr<AppInfoMap> apps); void OnAppsRead(std::unique_ptr<AppInfoMap> apps);
// Called when default apps from all sources are read. // Called when default apps from all sources are read.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment