Commit cd521681 authored by rbpotter's avatar rbpotter Committed by Commit Bot

Bookmarks Web UI: Use browser proxy, update tests

Change the bookmarks Web UI to use a browser proxy for communication
with C++. Also update tests to use a test version of the proxy
instead of registering test message handlers in C++.

Bug: 1022213
Change-Id: I7a824d51e1fdaa02e57baa44c555c634f8e230b1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1906959
Commit-Queue: Rebekah Potter <rbpotter@chromium.org>
Reviewed-by: default avatarDemetrios Papadopoulos <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714368}
parent 25e68ddd
...@@ -55,6 +55,7 @@ js_type_check("closure_compile") { ...@@ -55,6 +55,7 @@ js_type_check("closure_compile") {
":actions", ":actions",
":api_listener", ":api_listener",
":app", ":app",
":browser_proxy",
":command_manager", ":command_manager",
":constants", ":constants",
":debouncer", ":debouncer",
...@@ -88,6 +89,7 @@ js_library("actions") { ...@@ -88,6 +89,7 @@ js_library("actions") {
js_library("api_listener") { js_library("api_listener") {
deps = [ deps = [
":actions", ":actions",
":browser_proxy",
":debouncer", ":debouncer",
":store", ":store",
":util", ":util",
...@@ -112,9 +114,17 @@ js_library("app") { ...@@ -112,9 +114,17 @@ js_library("app") {
externs_list = [ "$externs_path/chrome_extensions.js" ] externs_list = [ "$externs_path/chrome_extensions.js" ]
} }
js_library("browser_proxy") {
deps = [
":constants",
"//ui/webui/resources/js:cr",
]
}
js_library("command_manager") { js_library("command_manager") {
deps = [ deps = [
":api_listener", ":api_listener",
":browser_proxy",
":dialog_focus_manager", ":dialog_focus_manager",
":edit_dialog", ":edit_dialog",
":store_client", ":store_client",
...@@ -197,6 +207,7 @@ js_library("item") { ...@@ -197,6 +207,7 @@ js_library("item") {
js_library("list") { js_library("list") {
deps = [ deps = [
":actions", ":actions",
":browser_proxy",
":command_manager", ":command_manager",
":item", ":item",
":store_client", ":store_client",
......
<link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="chrome://resources/html/cr.html">
<link rel="import" href="actions.html"> <link rel="import" href="actions.html">
<link rel="import" href="browser_proxy.html">
<link rel="import" href="debouncer.html"> <link rel="import" href="debouncer.html">
<link rel="import" href="store.html"> <link rel="import" href="store.html">
<link rel="import" href="util.html"> <link rel="import" href="util.html">
......
...@@ -172,12 +172,13 @@ cr.define('bookmarks.ApiListener', function() { ...@@ -172,12 +172,13 @@ cr.define('bookmarks.ApiListener', function() {
function init() { function init() {
listeners.forEach((listener) => listener.api.addListener(listener.fn)); listeners.forEach((listener) => listener.api.addListener(listener.fn));
cr.sendWithPromise('getIncognitoAvailability') const browserProxy = bookmarks.BrowserProxy.getInstance();
.then(onIncognitoAvailabilityChanged); browserProxy.getIncognitoAvailability().then(
onIncognitoAvailabilityChanged);
cr.addWebUIListener( cr.addWebUIListener(
'incognito-availability-changed', onIncognitoAvailabilityChanged); 'incognito-availability-changed', onIncognitoAvailabilityChanged);
cr.sendWithPromise('getCanEditBookmarks').then(onCanEditBookmarksChanged); browserProxy.getCanEditBookmarks().then(onCanEditBookmarksChanged);
cr.addWebUIListener( cr.addWebUIListener(
'can-edit-bookmarks-changed', onCanEditBookmarksChanged); 'can-edit-bookmarks-changed', onCanEditBookmarksChanged);
} }
......
...@@ -34,6 +34,12 @@ ...@@ -34,6 +34,12 @@
<structure name="IDR_BOOKMARKS_BOOKMARKS_HTML" <structure name="IDR_BOOKMARKS_BOOKMARKS_HTML"
file="bookmarks.html" file="bookmarks.html"
type="chrome_html" /> type="chrome_html" />
<structure name="IDR_BOOKMARKS_BROWSER_PROXY_HTML"
file="browser_proxy.html"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_BROWSER_PROXY_JS"
file="browser_proxy.js"
type="chrome_html" />
<structure name="IDR_BOOKMARKS_COMMAND_MANAGER_HTML" <structure name="IDR_BOOKMARKS_COMMAND_MANAGER_HTML"
file="command_manager.html" file="command_manager.html"
type="chrome_html" /> type="chrome_html" />
......
<link rel="import" href="chrome://resources/html/cr.html">
<link rel="import" href="constants.html">
<script src="browser_proxy.js"></script>
// Copyright 2019 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.
cr.define('bookmarks', function() {
'use strict';
class BrowserProxy {
/**
* @return {!Promise<!IncognitoAvailability>} Promise resolved with the
* current incognito mode preference.
*/
getIncognitoAvailability() {
return cr.sendWithPromise('getIncognitoAvailability');
}
/**
* @return {!Promise<boolean>} Promise resolved with whether the bookmarks
* can be edited.
*/
getCanEditBookmarks() {
return cr.sendWithPromise('getCanEditBookmarks');
}
/**
* @return {!Promise<string>} Promise resolved with the appropriate plural
* string for |messageName| with |itemCount| items.
*/
getPluralString(messageName, itemCount) {
return cr.sendWithPromise('getPluralString', messageName, itemCount);
}
/**
* Notifies the metrics handler to record a histogram value.
* @param {string} histogram The name of the histogram to record
* @param {number} bucket The bucket to record
* @param {number} maxBucket The maximum bucket value in the histogram.
*/
recordInHistogram(histogram, bucket, maxBucket) {
chrome.send(
'metricsHandler:recordInHistogram', [histogram, bucket, maxBucket]);
}
}
cr.addSingletonGetter(BrowserProxy);
return {
BrowserProxy: BrowserProxy,
};
});
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/html/cr/ui/command.html"> <link rel="import" href="chrome://resources/html/cr/ui/command.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
<link rel="import" href="browser_proxy.html">
<link rel="import" href="dialog_focus_manager.html"> <link rel="import" href="dialog_focus_manager.html">
<link rel="import" href="edit_dialog.html"> <link rel="import" href="edit_dialog.html">
<link rel="import" href="shared_style.html"> <link rel="import" href="shared_style.html">
......
...@@ -56,6 +56,9 @@ cr.define('bookmarks', function() { ...@@ -56,6 +56,9 @@ cr.define('bookmarks', function() {
assert(CommandManager.instance_ == null); assert(CommandManager.instance_ == null);
CommandManager.instance_ = this; CommandManager.instance_ = this;
/** @private {!bookmarks.BrowserProxy} */
this.browserProxy_ = bookmarks.BrowserProxy.getInstance();
this.watch('globalCanEdit_', state => state.prefs.canEdit); this.watch('globalCanEdit_', state => state.prefs.canEdit);
this.updateFromStore(); this.updateFromStore();
...@@ -318,8 +321,8 @@ cr.define('bookmarks', function() { ...@@ -318,8 +321,8 @@ cr.define('bookmarks', function() {
labelPromise = labelPromise =
Promise.resolve(loadTimeData.getString('toastItemCopied')); Promise.resolve(loadTimeData.getString('toastItemCopied'));
} else { } else {
labelPromise = cr.sendWithPromise( labelPromise = this.browserProxy_.getPluralString(
'getPluralString', 'toastItemsCopied', idList.length); 'toastItemsCopied', idList.length);
} }
this.showTitleToast_( this.showTitleToast_(
...@@ -344,8 +347,8 @@ cr.define('bookmarks', function() { ...@@ -344,8 +347,8 @@ cr.define('bookmarks', function() {
labelPromise = labelPromise =
Promise.resolve(loadTimeData.getString('toastItemDeleted')); Promise.resolve(loadTimeData.getString('toastItemDeleted'));
} else { } else {
labelPromise = cr.sendWithPromise( labelPromise = this.browserProxy_.getPluralString(
'getPluralString', 'toastItemsDeleted', idList.length); 'toastItemsDeleted', idList.length);
} }
chrome.bookmarkManagerPrivate.removeTrees(idList, () => { chrome.bookmarkManagerPrivate.removeTrees(idList, () => {
...@@ -778,7 +781,8 @@ cr.define('bookmarks', function() { ...@@ -778,7 +781,8 @@ cr.define('bookmarks', function() {
Command.OPEN_BOOKMARK; Command.OPEN_BOOKMARK;
} }
bookmarks.util.recordEnumHistogram(histogram, command, Command.MAX_VALUE); this.browserProxy_.recordInHistogram(
histogram, command, Command.MAX_VALUE);
}, },
/** /**
...@@ -829,7 +833,7 @@ cr.define('bookmarks', function() { ...@@ -829,7 +833,7 @@ cr.define('bookmarks', function() {
} else { } else {
this.openCommandMenuAtPosition(e.detail.x, e.detail.y, e.detail.source); this.openCommandMenuAtPosition(e.detail.x, e.detail.y, e.detail.source);
} }
bookmarks.util.recordEnumHistogram( this.browserProxy_.recordInHistogram(
'BookmarkManager.CommandMenuOpened', e.detail.source, 'BookmarkManager.CommandMenuOpened', e.detail.source,
MenuSource.NUM_VALUES); MenuSource.NUM_VALUES);
}, },
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html">
<link rel="import" href="browser_proxy.html">
<link rel="import" href="command_manager.html"> <link rel="import" href="command_manager.html">
<link rel="import" href="item.html"> <link rel="import" href="item.html">
<link rel="import" href="shared_style.html"> <link rel="import" href="shared_style.html">
......
...@@ -119,8 +119,8 @@ Polymer({ ...@@ -119,8 +119,8 @@ Polymer({
// Trigger a layout of the iron list. Otherwise some elements may render // Trigger a layout of the iron list. Otherwise some elements may render
// as blank entries. See https://crbug.com/848683 // as blank entries. See https://crbug.com/848683
this.$.list.fire('iron-resize'); this.$.list.fire('iron-resize');
const label = await cr.sendWithPromise( const label = await bookmarks.BrowserProxy.getInstance().getPluralString(
'getPluralString', 'listChanged', this.displayedList_.length); 'listChanged', this.displayedList_.length);
this.fire('iron-announce', {text: label}); this.fire('iron-announce', {text: label});
if (!skipFocus && selectIndex > -1) { if (!skipFocus && selectIndex > -1) {
......
...@@ -171,15 +171,6 @@ cr.define('bookmarks.util', function() { ...@@ -171,15 +171,6 @@ cr.define('bookmarks.util', function() {
return descendants; return descendants;
} }
/**
* @param {string} name
* @param {number} value
* @param {number} maxValue
*/
function recordEnumHistogram(name, value, maxValue) {
chrome.send('metricsHandler:recordInHistogram', [name, value, maxValue]);
}
/** /**
* @param {!Object<string, T>} map * @param {!Object<string, T>} map
* @param {!Set<string>} ids * @param {!Set<string>} ids
...@@ -232,7 +223,6 @@ cr.define('bookmarks.util', function() { ...@@ -232,7 +223,6 @@ cr.define('bookmarks.util', function() {
isShowingSearch: isShowingSearch, isShowingSearch: isShowingSearch,
normalizeNode: normalizeNode, normalizeNode: normalizeNode,
normalizeNodes: normalizeNodes, normalizeNodes: normalizeNodes,
recordEnumHistogram: recordEnumHistogram,
removeIdsFromMap: removeIdsFromMap, removeIdsFromMap: removeIdsFromMap,
removeIdsFromObject: removeIdsFromObject, removeIdsFromObject: removeIdsFromObject,
removeIdsFromSet: removeIdsFromSet, removeIdsFromSet: removeIdsFromSet,
......
...@@ -4,11 +4,12 @@ ...@@ -4,11 +4,12 @@
#include "chrome/browser/ui/webui/bookmarks/bookmarks_browsertest.h" #include "chrome/browser/ui/webui/bookmarks/bookmarks_browsertest.h"
#include "base/bind.h" #include <memory>
#include <utility>
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
...@@ -23,29 +24,6 @@ BookmarksBrowserTest::BookmarksBrowserTest() {} ...@@ -23,29 +24,6 @@ BookmarksBrowserTest::BookmarksBrowserTest() {}
BookmarksBrowserTest::~BookmarksBrowserTest() {} BookmarksBrowserTest::~BookmarksBrowserTest() {}
void BookmarksBrowserTest::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"testSetIncognito",
base::BindRepeating(&BookmarksBrowserTest::HandleSetIncognitoAvailability,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"testSetCanEdit",
base::BindRepeating(&BookmarksBrowserTest::HandleSetCanEditBookmarks,
base::Unretained(this)));
}
void BookmarksBrowserTest::SetIncognitoAvailability(int availability) {
ASSERT_TRUE(availability >= 0 &&
availability < IncognitoModePrefs::AVAILABILITY_NUM_TYPES);
browser()->profile()->GetPrefs()->SetInteger(
prefs::kIncognitoModeAvailability, availability);
}
void BookmarksBrowserTest::SetCanEditBookmarks(bool canEdit) {
browser()->profile()->GetPrefs()->SetBoolean(
bookmarks::prefs::kEditBookmarksEnabled, canEdit);
}
void BookmarksBrowserTest::SetupExtensionAPITest() { void BookmarksBrowserTest::SetupExtensionAPITest() {
// Add managed bookmarks. // Add managed bookmarks.
Profile* profile = browser()->profile(); Profile* profile = browser()->profile();
...@@ -87,37 +65,3 @@ void BookmarksBrowserTest::SetupExtensionAPIEditDisabledTest() { ...@@ -87,37 +65,3 @@ void BookmarksBrowserTest::SetupExtensionAPIEditDisabledTest() {
PrefService* prefs = user_prefs::UserPrefs::Get(profile); PrefService* prefs = user_prefs::UserPrefs::Get(profile);
prefs->SetBoolean(bookmarks::prefs::kEditBookmarksEnabled, false); prefs->SetBoolean(bookmarks::prefs::kEditBookmarksEnabled, false);
} }
void BookmarksBrowserTest::HandleSetIncognitoAvailability(
const base::ListValue* args) {
AllowJavascript();
ASSERT_EQ(2U, args->GetSize());
const base::Value* callback_id;
ASSERT_TRUE(args->Get(0, &callback_id));
int pref_value;
ASSERT_TRUE(args->GetInteger(1, &pref_value));
SetIncognitoAvailability(pref_value);
ResolveJavascriptCallback(*callback_id, base::Value());
}
void BookmarksBrowserTest::HandleSetCanEditBookmarks(
const base::ListValue* args) {
AllowJavascript();
ASSERT_EQ(2U, args->GetSize());
const base::Value* callback_id;
ASSERT_TRUE(args->Get(0, &callback_id));
bool pref_value;
ASSERT_TRUE(args->GetBoolean(1, &pref_value));
SetCanEditBookmarks(pref_value);
ResolveJavascriptCallback(*callback_id, base::Value());
}
content::WebUIMessageHandler* BookmarksBrowserTest::GetMockMessageHandler() {
return this;
}
...@@ -6,30 +6,16 @@ ...@@ -6,30 +6,16 @@
#define CHROME_BROWSER_UI_WEBUI_BOOKMARKS_BOOKMARKS_BROWSERTEST_H_ #define CHROME_BROWSER_UI_WEBUI_BOOKMARKS_BOOKMARKS_BROWSERTEST_H_
#include "chrome/test/base/web_ui_browser_test.h" #include "chrome/test/base/web_ui_browser_test.h"
#include "content/public/browser/web_ui_message_handler.h"
class BookmarksBrowserTest : public WebUIBrowserTest, class BookmarksBrowserTest : public WebUIBrowserTest {
public content::WebUIMessageHandler {
public: public:
BookmarksBrowserTest(); BookmarksBrowserTest();
~BookmarksBrowserTest() override; ~BookmarksBrowserTest() override;
void SetIncognitoAvailability(int availability);
void SetCanEditBookmarks(bool canEdit);
void SetupExtensionAPITest(); void SetupExtensionAPITest();
void SetupExtensionAPIEditDisabledTest(); void SetupExtensionAPIEditDisabledTest();
private: private:
void HandleSetIncognitoAvailability(const base::ListValue* args);
void HandleSetCanEditBookmarks(const base::ListValue* args);
// content::WebUIMessageHandler:
void RegisterMessages() override;
// WebUIBrowserTest:
content::WebUIMessageHandler* GetMockMessageHandler() override;
DISALLOW_COPY_AND_ASSIGN(BookmarksBrowserTest); DISALLOW_COPY_AND_ASSIGN(BookmarksBrowserTest);
}; };
......
...@@ -129,6 +129,9 @@ content::WebUIDataSource* CreateBookmarksUIHTMLSource(Profile* profile) { ...@@ -129,6 +129,9 @@ content::WebUIDataSource* CreateBookmarksUIHTMLSource(Profile* profile) {
source->AddResourcePath("api_listener.js", IDR_BOOKMARKS_API_LISTENER_JS); source->AddResourcePath("api_listener.js", IDR_BOOKMARKS_API_LISTENER_JS);
source->AddResourcePath("app.html", IDR_BOOKMARKS_APP_HTML); source->AddResourcePath("app.html", IDR_BOOKMARKS_APP_HTML);
source->AddResourcePath("app.js", IDR_BOOKMARKS_APP_JS); source->AddResourcePath("app.js", IDR_BOOKMARKS_APP_JS);
source->AddResourcePath("browser_proxy.html",
IDR_BOOKMARKS_BROWSER_PROXY_HTML);
source->AddResourcePath("browser_proxy.js", IDR_BOOKMARKS_BROWSER_PROXY_JS);
source->AddResourcePath("command_manager.html", source->AddResourcePath("command_manager.html",
IDR_BOOKMARKS_COMMAND_MANAGER_HTML); IDR_BOOKMARKS_COMMAND_MANAGER_HTML);
source->AddResourcePath("command_manager.js", source->AddResourcePath("command_manager.js",
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
suite('Bookmarks policies', function() { suite('Bookmarks policies', function() {
let store; let store;
let app; let app;
/** @type {?bookmarks.BrowserProxy} */
let testBrowserProxy;
setup(function() { setup(function() {
const nodes = testTree(createFolder('1', [ const nodes = testTree(createFolder('1', [
...@@ -20,6 +22,8 @@ suite('Bookmarks policies', function() { ...@@ -20,6 +22,8 @@ suite('Bookmarks policies', function() {
store.expectAction('set-can-edit'); store.expectAction('set-can-edit');
store.replaceSingleton(); store.replaceSingleton();
testBrowserProxy = new bookmarks.TestBookmarksBrowserProxy();
bookmarks.BrowserProxy.instance_ = testBrowserProxy;
app = document.createElement('bookmarks-app'); app = document.createElement('bookmarks-app');
replaceBody(app); replaceBody(app);
}); });
...@@ -28,13 +32,18 @@ suite('Bookmarks policies', function() { ...@@ -28,13 +32,18 @@ suite('Bookmarks policies', function() {
const commandManager = bookmarks.CommandManager.getInstance(); const commandManager = bookmarks.CommandManager.getInstance();
// Incognito is disabled during testGenPreamble(). Wait for the front-end to // Incognito is disabled during testGenPreamble(). Wait for the front-end to
// load the config. // load the config.
const action = await store.waitForAction('set-incognito-availability'); const whenIncognitoSet = await Promise.all([
testBrowserProxy.whenCalled('getIncognitoAvailability'),
store.waitForAction('set-incognito-availability')
]);
assertEquals( assertEquals(
IncognitoAvailability.DISABLED, store.data.prefs.incognitoAvailability); IncognitoAvailability.DISABLED, store.data.prefs.incognitoAvailability);
assertFalse( assertFalse(
commandManager.canExecute(Command.OPEN_INCOGNITO, new Set(['11']))); commandManager.canExecute(Command.OPEN_INCOGNITO, new Set(['11'])));
await cr.sendWithPromise('testSetIncognito', IncognitoAvailability.ENABLED); cr.webUIListenerCallback(
'incognito-availability-changed', IncognitoAvailability.ENABLED);
assertEquals( assertEquals(
IncognitoAvailability.ENABLED, store.data.prefs.incognitoAvailability); IncognitoAvailability.ENABLED, store.data.prefs.incognitoAvailability);
assertTrue( assertTrue(
...@@ -43,11 +52,14 @@ suite('Bookmarks policies', function() { ...@@ -43,11 +52,14 @@ suite('Bookmarks policies', function() {
test('canEdit updates when changed', async function() { test('canEdit updates when changed', async function() {
const commandManager = bookmarks.CommandManager.getInstance(); const commandManager = bookmarks.CommandManager.getInstance();
const action = await store.waitForAction('set-can-edit'); const whenCanEditSet = await Promise.all([
testBrowserProxy.whenCalled('getCanEditBookmarks'),
store.waitForAction('set-can-edit')
]);
assertFalse(store.data.prefs.canEdit); assertFalse(store.data.prefs.canEdit);
assertFalse(commandManager.canExecute(Command.DELETE, new Set(['11']))); assertFalse(commandManager.canExecute(Command.DELETE, new Set(['11'])));
await cr.sendWithPromise('testSetCanEdit', true); cr.webUIListenerCallback('can-edit-bookmarks-changed', true);
assertTrue(store.data.prefs.canEdit); assertTrue(store.data.prefs.canEdit);
assertTrue(commandManager.canExecute(Command.DELETE, new Set(['11']))); assertTrue(commandManager.canExecute(Command.DELETE, new Set(['11'])));
}); });
......
// Copyright 2019 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.
cr.define('bookmarks', function() {
/**
* Test version of the bookmarks browser proxy.
*/
class TestBookmarksBrowserProxy extends TestBrowserProxy {
constructor() {
super(['getIncognitoAvailability', 'getCanEditBookmarks']);
}
getIncognitoAvailability() {
this.methodCalled('getIncognitoAvailability');
return Promise.resolve(IncognitoAvailability.DISABLED);
}
getCanEditBookmarks() {
this.methodCalled('getCanEditBookmarks');
return Promise.resolve(false);
}
getPluralString(messageName, itemCount) {
return Promise.resolve('test');
}
recordInHistogram(histogram, bucket, maxBucket) {}
}
return {
TestBookmarksBrowserProxy: TestBookmarksBrowserProxy,
};
});
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