Commit 17343deb authored by Regan Hsu's avatar Regan Hsu Committed by Commit Bot

[CrOS PhoneHub] Use a vector BrowserTabsMetadata instead of optionals

* Remove the two optionals BrowserTabMetadata from BrowserTabsModel.
* Adds sorted vector of BrowserTabMetadata to BrowserTabsModel, from
  most recently visited to least recently visited browser tabs.
* Modifies chrome://multidevice-internals to accommodate.

https://screenshot.googleplex.com/ASLmNrodybKchY6
https://screenshot.googleplex.com/5CyAkSuWD5wXM9g

Bug: 1106937
Change-Id: I5bc898b12db304491cec8091c51a2bf7b1c2ad24
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2415537
Commit-Queue: Regan Hsu <hsuregan@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808108}
parent ab49c94d
...@@ -4,6 +4,14 @@ ...@@ -4,6 +4,14 @@
flex: 1 0 100%; flex: 1 0 100%;
} }
:host(:not([is-valid])) {
background-color: LightGray;
}
:host([is-valid]) {
background-color: LightGreen;
}
#faviconSelector { #faviconSelector {
align-items: normal; align-items: normal;
} }
...@@ -11,12 +19,12 @@ ...@@ -11,12 +19,12 @@
<div class="column"> <div class="column">
<cr-input value="{{url_}}" id="urlInput" auto-validate required label="URL: " <cr-input value="{{url_}}" id="urlInput" auto-validate required label="URL: "
error-message="This browser tab will be a nullopt if no url input"> error-message="This row is invalid">
</cr-input> </cr-input>
</div> </div>
<div class="column"> <div class="column">
<cr-input value="{{title_}}" label="Title:" auto-validate required <cr-input value="{{title_}}" label="Title:" auto-validate required
error-message="This browser tab will be a nullopt if no title input"> error-message="This row is invalid">
</cr-input> </cr-input>
</div> </div>
<div class="column"> <div class="column">
......
...@@ -20,7 +20,15 @@ Polymer({ ...@@ -20,7 +20,15 @@ Polymer({
browserTabMetadata: { browserTabMetadata: {
type: Object, type: Object,
notify: true, notify: true,
computed: 'getMetadata_(url_, title_, lastAccessedTimeStamp_, favicon_)', computed: 'getMetadata_(isValid, url_, title_, lastAccessedTimeStamp_, ' +
'favicon_)',
},
/** True if the fields are all filled out. */
isValid: {
type: Boolean,
computed: 'getIsValid_(url_, title_, lastAccessedTimeStamp_, favicon_)',
reflectToAttribute: true,
}, },
/** @private */ /** @private */
...@@ -80,12 +88,22 @@ Polymer({ ...@@ -80,12 +88,22 @@ Polymer({
this.favicon_ = this.faviconList_[select.selectedIndex]; this.favicon_ = this.faviconList_[select.selectedIndex];
}, },
/**
* @return{boolean}
* @private
*/
getIsValid_() {
return !!this.url_ && !!this.title_ && this.lastAccessedTimeStamp_ > -1 &&
this.favicon_ !== ImageType.NONE;
},
/** /**
* @return{BrowserTabsMetadataModel} * @return{BrowserTabsMetadataModel}
* @private * @private
*/ */
getMetadata_() { getMetadata_() {
return { return {
isValid: this.isValid,
url: this.url_, url: this.url_,
title: this.title_, title: this.title_,
lastAccessedTimeStamp: this.lastAccessedTimeStamp_, lastAccessedTimeStamp: this.lastAccessedTimeStamp_,
......
<style include="cr-shared-style shared-style"> <style include="cr-shared-style shared-style">
:host { :host {
display: flex; display: flex;
height: 250px; height: 500px;
} }
#fieldColumn { #fieldColumn {
flex: 2; flex: 2;
} }
.updates {
font-size: 15px;
}
</style> </style>
<div class="column"> <div class="column">
<div class="emphasize updates" hidden="[[!isTabSyncEnabled_]]">
[[nValidTabs_]] valid metadatas
</div>
<cr-button on-click="setFakeBrowserTabModel_" class="internals-button"> <cr-button on-click="setFakeBrowserTabModel_" class="internals-button">
<span class="emphasize">Change Browser Tabs Status</span> <span class="emphasize">Change Browser Tabs Status</span>
</cr-button> </cr-button>
<div class="label"> <div class="label">
<span class="emphasize">Note:</span> Click the button above to propagate all <span class="emphasize">Note:</span> Click the button above to propagate
browser tab status values on the right hand side to the fake phonehub <span class="emphasize">VALID (green)</span> browser tab status values on
manager. Note that if a field is empty, then that corresponding tab will the right hand side to the fake phonehub manager. Note that if a field is
be nullopt. empty or favicon is set to NONE, then that corresponding tab will not be
sent, and the background will be grey.
</div> </div>
</div> </div>
<div class="column" id="fieldColumn"> <div class="column" id="fieldColumn">
...@@ -39,6 +47,18 @@ ...@@ -39,6 +47,18 @@
browser-tab-metadata="{{browserTabTwoMetadata_}}"> browser-tab-metadata="{{browserTabTwoMetadata_}}">
</browser-tabs-metadata-form> </browser-tabs-metadata-form>
</div> </div>
<div class="cr-row">
<div class="column">3: </div>
<browser-tabs-metadata-form
browser-tab-metadata="{{browserTabThreeMetadata_}}">
</browser-tabs-metadata-form>
</div>
<div class="cr-row">
<div class="column">4: </div>
<browser-tabs-metadata-form
browser-tab-metadata="{{browserTabFourMetadata_}}">
</browser-tabs-metadata-form>
</div>
</template> </template>
</div> </div>
...@@ -33,6 +33,25 @@ Polymer({ ...@@ -33,6 +33,25 @@ Polymer({
browserTabTwoMetadata_: { browserTabTwoMetadata_: {
type: Object, type: Object,
}, },
/** @private{BrowserTabsMetadataModel} */
browserTabThreeMetadata_: {
type: Object,
},
/** @private{BrowserTabsMetadataModel} */
browserTabFourMetadata_: {
type: Object,
},
/** @type{number} */
nValidTabs_: {
type: Number,
computed:
'computeNValidTabs_(isTabSyncEnabled_, browserTabOneMetadata_, ' +
'browserTabTwoMetadata_, browserTabThreeMetadata_, ' +
'browserTabFourMetadata_)',
},
}, },
/** @private{?MultidevicePhoneHubBrowserProxy}*/ /** @private{?MultidevicePhoneHubBrowserProxy}*/
...@@ -43,14 +62,51 @@ Polymer({ ...@@ -43,14 +62,51 @@ Polymer({
this.browserProxy_ = MultidevicePhoneHubBrowserProxy.getInstance(); this.browserProxy_ = MultidevicePhoneHubBrowserProxy.getInstance();
}, },
/**
* @return {Array<!BrowserTabsMetadataModel>}
* @private
*/
getAllBrowserTabMetadatas_() {
return [
this.browserTabOneMetadata_, this.browserTabTwoMetadata_,
this.browserTabThreeMetadata_, this.browserTabFourMetadata_
];
},
/**
* @return {number}
* @private
*/
computeNValidTabs_() {
if (!this.isTabSyncEnabled_) {
return 0;
}
return this.getAllBrowserTabMetadatas_().reduce((acc, metadata) => {
return acc + (!!metadata && metadata.isValid);
}, 0);
},
/** @private */ /** @private */
setFakeBrowserTabModel_() { setFakeBrowserTabModel_() {
if (!this.isTabSyncEnabled_) {
const syncDisabledBrowserTabsModel = {
isTabSyncEnabled: false,
browserTabOneMetadata: null,
browserTabTwoMetadata: null,
browserTabThreeMetadata: null,
browserTabFourMetadata: null,
};
this.browserProxy_.setBrowserTabs(syncDisabledBrowserTabsModel);
return;
}
const browserTabsModel = { const browserTabsModel = {
isTabSyncEnabled: this.isTabSyncEnabled_, isTabSyncEnabled: this.isTabSyncEnabled_,
browserTabOneMetadata: browserTabOneMetadata: this.browserTabOneMetadata_,
this.isTabSyncEnabled_ ? this.browserTabOneMetadata_ : null, browserTabTwoMetadata: this.browserTabTwoMetadata_,
browserTabTwoMetadata: browserTabThreeMetadata: this.browserTabThreeMetadata_,
this.isTabSyncEnabled_ ? this.browserTabTwoMetadata_ : null, browserTabFourMetadata: this.browserTabFourMetadata_,
}; };
this.browserProxy_.setBrowserTabs(browserTabsModel); this.browserProxy_.setBrowserTabs(browserTabsModel);
}, },
......
...@@ -129,6 +129,7 @@ export let PhoneStatusModel; ...@@ -129,6 +129,7 @@ export let PhoneStatusModel;
/** /**
* @typedef {{ * @typedef {{
* isValid: boolean,
* url: string, * url: string,
* title: string, * title: string,
* lastAccessedTimeStamp: number, * lastAccessedTimeStamp: number,
...@@ -142,6 +143,8 @@ export let BrowserTabsMetadataModel; ...@@ -142,6 +143,8 @@ export let BrowserTabsMetadataModel;
* isTabSyncEnabled: boolean, * isTabSyncEnabled: boolean,
* browserTabOneMetadata: ?BrowserTabsMetadataModel, * browserTabOneMetadata: ?BrowserTabsMetadataModel,
* browserTabTwoMetadata: ?BrowserTabsMetadataModel, * browserTabTwoMetadata: ?BrowserTabsMetadataModel,
* browserTabThreeMetadata: ?BrowserTabsMetadataModel,
* browserTabFourMetadata: ?BrowserTabsMetadataModel,
* }} * }}
*/ */
export let BrowserTabsModel; export let BrowserTabsModel;
......
...@@ -71,38 +71,46 @@ phonehub::Notification::AppMetadata DictToAppMetadata( ...@@ -71,38 +71,46 @@ phonehub::Notification::AppMetadata DictToAppMetadata(
icon); icon);
} }
base::Optional<phonehub::BrowserTabsModel::BrowserTabMetadata> void TryAddingMetadata(
DictToBrowserTabMetadataModel( const std::string& key,
const base::DictionaryValue* browser_tab_metadata) { const base::DictionaryValue* browser_tab_status_dict,
std::vector<phonehub::BrowserTabsModel::BrowserTabMetadata>& metadatas) {
const base::DictionaryValue* browser_tab_metadata = nullptr;
if (!browser_tab_status_dict->GetDictionary(key, &browser_tab_metadata))
return;
std::string url; std::string url;
if (!browser_tab_metadata->GetString("url", &url) || url.empty()) { if (!browser_tab_metadata->GetString("url", &url) || url.empty())
return base::nullopt; return;
}
base::string16 title; base::string16 title;
if (!browser_tab_metadata->GetString("title", &title) || title.empty()) { if (!browser_tab_metadata->GetString("title", &title) || title.empty())
return base::nullopt; return;
}
// JavaScript time stamps don't fit in int. // JavaScript time stamps don't fit in int.
double last_accessed_timestamp; double last_accessed_timestamp;
if (!browser_tab_metadata->GetDouble("lastAccessedTimeStamp", if (!browser_tab_metadata->GetDouble("lastAccessedTimeStamp",
&last_accessed_timestamp)) { &last_accessed_timestamp)) {
return base::nullopt; return;
} }
int favicon_image_type_as_int; int favicon_image_type_as_int;
if (!browser_tab_metadata->GetInteger("favicon", if (!browser_tab_metadata->GetInteger("favicon",
&favicon_image_type_as_int)) { &favicon_image_type_as_int) ||
return base::nullopt; !favicon_image_type_as_int) {
return;
} }
auto favicon_image_type = static_cast<ImageType>(favicon_image_type_as_int); auto favicon_image_type = static_cast<ImageType>(favicon_image_type_as_int);
gfx::Image favicon = gfx::Image favicon =
gfx::Image::CreateFrom1xBitmap(ImageTypeToBitmap(favicon_image_type)); gfx::Image::CreateFrom1xBitmap(ImageTypeToBitmap(favicon_image_type));
return phonehub::BrowserTabsModel::BrowserTabMetadata(
auto metadata = phonehub::BrowserTabsModel::BrowserTabMetadata(
GURL(url), title, base::Time::FromJsTime(last_accessed_timestamp), GURL(url), title, base::Time::FromJsTime(last_accessed_timestamp),
favicon); favicon);
metadatas.push_back(metadata);
} }
} // namespace } // namespace
...@@ -300,34 +308,28 @@ void MultidevicePhoneHubHandler::HandleSetBrowserTabs( ...@@ -300,34 +308,28 @@ void MultidevicePhoneHubHandler::HandleSetBrowserTabs(
return; return;
} }
base::Optional<phonehub::BrowserTabsModel::BrowserTabMetadata> metadata_one; std::vector<phonehub::BrowserTabsModel::BrowserTabMetadata> metadatas;
const base::DictionaryValue* browser_tab_one_metadata = nullptr; TryAddingMetadata("browserTabOneMetadata", browser_tab_status_dict,
if (browser_tab_status_dict->GetDictionary("browserTabOneMetadata", metadatas);
&browser_tab_one_metadata)) { TryAddingMetadata("browserTabTwoMetadata", browser_tab_status_dict,
metadata_one = DictToBrowserTabMetadataModel(browser_tab_one_metadata); metadatas);
} TryAddingMetadata("browserTabThreeMetadata", browser_tab_status_dict,
metadatas);
base::Optional<phonehub::BrowserTabsModel::BrowserTabMetadata> metadata_two; TryAddingMetadata("browserTabFourMetadata", browser_tab_status_dict,
const base::DictionaryValue* browser_tab_two_metadata = nullptr; metadatas);
if (browser_tab_status_dict->GetDictionary("browserTabTwoMetadata",
&browser_tab_two_metadata)) {
metadata_two = DictToBrowserTabMetadataModel(browser_tab_two_metadata);
}
// TODO(hsuregan): Add metadata_three and metadata_four.
std::vector<base::Optional<phonehub::BrowserTabsModel::BrowserTabMetadata>>
metadatas{{metadata_one, metadata_two}};
std::sort(metadatas.begin(), metadatas.end());
fake_phone_hub_manager_->mutable_phone_model()->SetBrowserTabsModel( fake_phone_hub_manager_->mutable_phone_model()->SetBrowserTabsModel(
phonehub::BrowserTabsModel(is_tab_sync_enabled, metadatas[1], phonehub::BrowserTabsModel(is_tab_sync_enabled, metadatas));
metadatas[0]));
if (metadatas[1].has_value()) auto browser_tabs_model =
PA_LOG(VERBOSE) << "Set most recent browser tab to" << *metadatas[1]; fake_phone_hub_manager_->mutable_phone_model()->browser_tabs_model();
CHECK(browser_tabs_model.has_value());
if (metadatas[0].has_value()) // Log the most recently visited browser tab (at index 0) last.
PA_LOG(VERBOSE) << "Set second most recent browser tab to" << *metadatas[0]; for (int i = metadatas.size() - 1; i > -1; --i) {
PA_LOG(VERBOSE) << "Set most recent browser tab number " << i
<< " to: " << browser_tabs_model->most_recent_tabs()[i];
}
} }
void MultidevicePhoneHubHandler::HandleSetNotification( void MultidevicePhoneHubHandler::HandleSetNotification(
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
namespace chromeos { namespace chromeos {
namespace phonehub { namespace phonehub {
const size_t BrowserTabsModel::kMaxMostRecentTabs = 4;
BrowserTabsModel::BrowserTabMetadata::BrowserTabMetadata( BrowserTabsModel::BrowserTabMetadata::BrowserTabMetadata(
GURL url, GURL url,
const base::string16& title, const base::string16& title,
...@@ -36,23 +38,31 @@ bool BrowserTabsModel::BrowserTabMetadata::operator!=( ...@@ -36,23 +38,31 @@ bool BrowserTabsModel::BrowserTabMetadata::operator!=(
bool BrowserTabsModel::BrowserTabMetadata::operator<( bool BrowserTabsModel::BrowserTabMetadata::operator<(
const BrowserTabMetadata& other) const { const BrowserTabMetadata& other) const {
return std::tie(last_accessed_timestamp) < // More recently visited tabs should come before earlier visited tabs.
return std::tie(last_accessed_timestamp) >
std::tie(other.last_accessed_timestamp); std::tie(other.last_accessed_timestamp);
} }
BrowserTabsModel::BrowserTabsModel( BrowserTabsModel::BrowserTabsModel(
bool is_tab_sync_enabled, bool is_tab_sync_enabled,
const base::Optional<BrowserTabMetadata>& most_recent_tab, const std::vector<BrowserTabMetadata>& most_recent_tabs)
const base::Optional<BrowserTabMetadata>& second_most_recent_tab)
: is_tab_sync_enabled_(is_tab_sync_enabled), : is_tab_sync_enabled_(is_tab_sync_enabled),
most_recent_tab_(most_recent_tab), most_recent_tabs_(most_recent_tabs) {
second_most_recent_tab_(second_most_recent_tab) { if (!is_tab_sync_enabled_ && !most_recent_tabs_.empty()) {
if (!is_tab_sync_enabled_ &&
(most_recent_tab_.has_value() || second_most_recent_tab_.has_value())) {
PA_LOG(WARNING) << "Tab sync is not enabled, but tab metadata was " PA_LOG(WARNING) << "Tab sync is not enabled, but tab metadata was "
<< "provided; clearing metadata."; << "provided; clearing metadata.";
most_recent_tab_.reset(); most_recent_tabs_.clear();
second_most_recent_tab_.reset(); return;
}
std::sort(most_recent_tabs_.begin(), most_recent_tabs_.end());
if (most_recent_tabs_.size() > kMaxMostRecentTabs) {
PA_LOG(WARNING) << "More than the max number of browser tab metadatas were "
"provided; truncating least recently visited browser "
"tabs' metadatas.";
most_recent_tabs_.erase(most_recent_tabs_.begin() + kMaxMostRecentTabs,
most_recent_tabs_.end());
return;
} }
} }
...@@ -62,8 +72,7 @@ BrowserTabsModel::~BrowserTabsModel() = default; ...@@ -62,8 +72,7 @@ BrowserTabsModel::~BrowserTabsModel() = default;
bool BrowserTabsModel::operator==(const BrowserTabsModel& other) const { bool BrowserTabsModel::operator==(const BrowserTabsModel& other) const {
return is_tab_sync_enabled_ == other.is_tab_sync_enabled_ && return is_tab_sync_enabled_ == other.is_tab_sync_enabled_ &&
most_recent_tab_ == other.most_recent_tab_ && most_recent_tabs_ == other.most_recent_tabs_;
second_most_recent_tab_ == other.second_most_recent_tab_;
} }
bool BrowserTabsModel::operator!=(const BrowserTabsModel& other) const { bool BrowserTabsModel::operator!=(const BrowserTabsModel& other) const {
......
...@@ -19,6 +19,8 @@ namespace phonehub { ...@@ -19,6 +19,8 @@ namespace phonehub {
// Contains metadata about browser tabs that are open on the user's phone. // Contains metadata about browser tabs that are open on the user's phone.
class BrowserTabsModel { class BrowserTabsModel {
public: public:
static const size_t kMaxMostRecentTabs;
struct BrowserTabMetadata { struct BrowserTabMetadata {
BrowserTabMetadata(GURL url, BrowserTabMetadata(GURL url,
const base::string16& title, const base::string16& title,
...@@ -37,14 +39,11 @@ class BrowserTabsModel { ...@@ -37,14 +39,11 @@ class BrowserTabsModel {
}; };
// |is_tab_sync_enabled| indicates whether the Chrome OS device is currently // |is_tab_sync_enabled| indicates whether the Chrome OS device is currently
// syncing tab metadata. If that parameter is false, the optional tab // syncing tab metadata. If that parameter is false, |most_recent_tabs_|
// parameters should be null. If it is true, one or both of the parameters may // should be empty. If it is true, |most_recent_tabs_| can contain up to four.
// still be null if the user does not have browser tabs open on their phone.
BrowserTabsModel( BrowserTabsModel(
bool is_tab_sync_enabled, bool is_tab_sync_enabled,
const base::Optional<BrowserTabMetadata>& most_recent_tab = base::nullopt, const std::vector<BrowserTabMetadata>& most_recent_tabs = {});
const base::Optional<BrowserTabMetadata>& second_most_recent_tab =
base::nullopt);
BrowserTabsModel(const BrowserTabsModel& other); BrowserTabsModel(const BrowserTabsModel& other);
~BrowserTabsModel(); ~BrowserTabsModel();
...@@ -52,17 +51,16 @@ class BrowserTabsModel { ...@@ -52,17 +51,16 @@ class BrowserTabsModel {
bool operator!=(const BrowserTabsModel& other) const; bool operator!=(const BrowserTabsModel& other) const;
bool is_tab_sync_enabled() const { return is_tab_sync_enabled_; } bool is_tab_sync_enabled() const { return is_tab_sync_enabled_; }
const base::Optional<BrowserTabMetadata>& most_recent_tab() const {
return most_recent_tab_; const std::vector<BrowserTabMetadata>& most_recent_tabs() const {
} return most_recent_tabs_;
const base::Optional<BrowserTabMetadata>& second_most_recent_tab() const {
return second_most_recent_tab_;
} }
private: private:
bool is_tab_sync_enabled_; bool is_tab_sync_enabled_;
base::Optional<BrowserTabMetadata> most_recent_tab_;
base::Optional<BrowserTabMetadata> second_most_recent_tab_; // Sorted from most recently visited to least recently visited.
std::vector<BrowserTabMetadata> most_recent_tabs_;
}; };
std::ostream& operator<<( std::ostream& operator<<(
......
...@@ -11,17 +11,28 @@ namespace chromeos { ...@@ -11,17 +11,28 @@ namespace chromeos {
namespace phonehub { namespace phonehub {
TEST(BrowserTabsModelTest, Initialization) { TEST(BrowserTabsModelTest, Initialization) {
BrowserTabsModel success(/*is_tab_sync_enabled=*/true, std::vector<BrowserTabsModel::BrowserTabMetadata> most_recent_tabs(
CreateFakeBrowserTabMetadata()); {CreateFakeBrowserTabMetadata()});
BrowserTabsModel success(/*is_tab_sync_enabled=*/true, most_recent_tabs);
EXPECT_TRUE(success.is_tab_sync_enabled()); EXPECT_TRUE(success.is_tab_sync_enabled());
EXPECT_EQ(CreateFakeBrowserTabMetadata(), *success.most_recent_tab()); EXPECT_EQ(most_recent_tabs, success.most_recent_tabs());
EXPECT_FALSE(success.second_most_recent_tab().has_value());
// If tab metadata is provided by tab sync is disabled, the data should be // If tab metadata is provided by tab sync is disabled, the data should be
// cleared. // cleared.
BrowserTabsModel invalid_metadata(/*is_tab_sync_enabled=*/false, BrowserTabsModel invalid_metadata(/*is_tab_sync_enabled=*/false,
CreateFakeBrowserTabMetadata()); most_recent_tabs);
EXPECT_FALSE(invalid_metadata.most_recent_tab().has_value()); EXPECT_TRUE(invalid_metadata.most_recent_tabs().empty());
// If the number of metadata is provided exceeds |kMaxMostRecentTabs|, the
// metadata vector will be truncated to be of size |kMaxMostRecentTabs|.
const int exceed_max_offset = BrowserTabsModel::kMaxMostRecentTabs + 1;
std::vector<BrowserTabsModel::BrowserTabMetadata> most_recent_tabs_exceeded(
exceed_max_offset, CreateFakeBrowserTabMetadata());
BrowserTabsModel truncated_metadata(/*is_tab_sync_enabled=*/true,
most_recent_tabs_exceeded);
EXPECT_EQ(BrowserTabsModel::kMaxMostRecentTabs,
truncated_metadata.most_recent_tabs().size());
} }
} // namespace phonehub } // namespace phonehub
......
...@@ -33,26 +33,35 @@ const PhoneStatusModel& CreateFakePhoneStatusModel() { ...@@ -33,26 +33,35 @@ const PhoneStatusModel& CreateFakePhoneStatusModel() {
const char kFakeBrowserTabUrl1[] = "https://www.example.com/tab1"; const char kFakeBrowserTabUrl1[] = "https://www.example.com/tab1";
const char kFakeBrowserTabName1[] = "Tab 1"; const char kFakeBrowserTabName1[] = "Tab 1";
const base::Time kFakeBrowserTabLastAccessedTimestamp1 =
base::Time::FromDoubleT(4);
const char kFakeBrowserTabUrl2[] = "https://www.example.com/tab2"; const char kFakeBrowserTabUrl2[] = "https://www.example.com/tab2";
const char kFakeBrowserTabName2[] = "Tab 2"; const char kFakeBrowserTabName2[] = "Tab 2";
const base::Time kFakeBrowserTabLastAccessedTimestamp2 =
base::Time::FromDoubleT(3);
const BrowserTabsModel::BrowserTabMetadata& CreateFakeBrowserTabMetadata() { const BrowserTabsModel::BrowserTabMetadata& CreateFakeBrowserTabMetadata() {
static const base::NoDestructor<BrowserTabsModel::BrowserTabMetadata> static const base::NoDestructor<BrowserTabsModel::BrowserTabMetadata>
fake_browser_tab_metadata{GURL(kFakeBrowserTabUrl1), fake_browser_tab_metadata{
base::UTF8ToUTF16(kFakeBrowserTabName1), GURL(kFakeBrowserTabUrl1), base::UTF8ToUTF16(kFakeBrowserTabName1),
base::Time(), gfx::Image()}; kFakeBrowserTabLastAccessedTimestamp1, gfx::Image()};
return *fake_browser_tab_metadata; return *fake_browser_tab_metadata;
} }
const BrowserTabsModel& CreateFakeBrowserTabsModel() { const BrowserTabsModel& CreateFakeBrowserTabsModel() {
static const base::NoDestructor<BrowserTabsModel::BrowserTabMetadata> static const base::NoDestructor<BrowserTabsModel::BrowserTabMetadata>
second_browser_tab_metadata{GURL(kFakeBrowserTabUrl2), second_browser_tab_metadata{
base::UTF8ToUTF16(kFakeBrowserTabName2), GURL(kFakeBrowserTabUrl2), base::UTF8ToUTF16(kFakeBrowserTabName2),
base::Time(), gfx::Image()}; kFakeBrowserTabLastAccessedTimestamp2, gfx::Image()};
static const base::NoDestructor<
std::vector<BrowserTabsModel::BrowserTabMetadata>>
most_recent_tabs(
{CreateFakeBrowserTabMetadata(), *second_browser_tab_metadata});
static const base::NoDestructor<BrowserTabsModel> fake_browser_tabs_model{ static const base::NoDestructor<BrowserTabsModel> fake_browser_tabs_model{
/*is_tab_sync_enabled=*/true, CreateFakeBrowserTabMetadata(), /*is_tab_sync_enabled=*/true, *most_recent_tabs};
*second_browser_tab_metadata};
return *fake_browser_tabs_model; return *fake_browser_tabs_model;
} }
......
...@@ -25,8 +25,10 @@ const PhoneStatusModel& CreateFakePhoneStatusModel(); ...@@ -25,8 +25,10 @@ const PhoneStatusModel& CreateFakePhoneStatusModel();
// Fake data for browser tabs. // Fake data for browser tabs.
extern const char kFakeBrowserTabUrl1[]; extern const char kFakeBrowserTabUrl1[];
extern const char kFakeBrowserTabName1[]; extern const char kFakeBrowserTabName1[];
extern const base::Time kFakeBrowserTabLastAccessedTimestamp1;
extern const char kFakeBrowserTabUrl2[]; extern const char kFakeBrowserTabUrl2[];
extern const char kFakeBrowserTabName2[]; extern const char kFakeBrowserTabName2[];
extern const base::Time kFakeBrowserTabLastAccessedTimestamp2;
// Creates fake browser tab data for use in tests. // Creates fake browser tab data for use in tests.
const BrowserTabsModel::BrowserTabMetadata& CreateFakeBrowserTabMetadata(); const BrowserTabsModel::BrowserTabMetadata& CreateFakeBrowserTabMetadata();
......
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