Commit 06c27164 authored by Dan Beam's avatar Dan Beam Committed by Commit Bot

[MD Extensions] Fix toolbar flicker in dev mode

Track whether the page is being created (or refreshed) with dev mode on
by tracking the preference in C++ and changing the shim HTML/CSS via the
$i18n{...} mechanism.

Also set inDevMode in <extensions-manager> as soon as possible.

Bug: 788018
Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation
Change-Id: I131cb04024cbfbaf4159a110ee1112346ea59a8c
Reviewed-on: https://chromium-review.googlesource.com/786441
Commit-Queue: Dan Beam (no longer on Chrome) <dbeam@chromium.org>
Reviewed-by: default avatarDemetrios Papadopoulos <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#519589}
parent 4bb617ef
<!doctype html>
<html dir="$i18n{textdirection}" lang="$i18n{language}" class="loading">
<html dir="$i18n{textdirection}" lang="$i18n{language}"
class="loading $i18n{loadTimeClasses}">
<head>
<meta charset="utf8">
<title>$i18n{title}</title>
......@@ -18,6 +19,11 @@
border-top: 56px solid rgb(51, 103, 214);
}
/* Note: .in-dev-mode is applied by i18n{loadTimeClasses}. */
.loading.in-dev-mode {
border-top-width: 96px;
}
html,
body {
height: 100%;
......
......@@ -51,7 +51,7 @@ cr.define('extensions', function() {
inDevMode: {
type: Boolean,
value: false,
value: () => loadTimeData.getBoolean('inDevMode'),
},
filter: {
......
......@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/extensions/extensions_ui.h"
#include <memory>
#include <string>
#include <utility>
#include "base/memory/ptr_util.h"
......@@ -19,6 +20,7 @@
#include "chrome/browser/ui/webui/extensions/install_extension_handler.h"
#include "chrome/browser/ui/webui/metrics_handler.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/chromium_strings.h"
......@@ -27,6 +29,7 @@
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/theme_resources.h"
#include "components/google/core/browser/google_util.h"
#include "components/prefs/pref_service.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
......@@ -47,6 +50,9 @@ namespace extensions {
namespace {
constexpr char kInDevModeKey[] = "inDevMode";
constexpr char kLoadTimeClassesKey[] = "loadTimeClasses";
class ExtensionWebUiTimer : public content::WebContentsObserver {
public:
explicit ExtensionWebUiTimer(content::WebContents* web_contents, bool is_md)
......@@ -105,7 +111,11 @@ class ExtensionWebUiTimer : public content::WebContentsObserver {
DISALLOW_COPY_AND_ASSIGN(ExtensionWebUiTimer);
};
content::WebUIDataSource* CreateMdExtensionsSource() {
std::string GetLoadTimeClasses(bool in_dev_mode) {
return in_dev_mode ? "in-dev-mode" : std::string();
}
content::WebUIDataSource* CreateMdExtensionsSource(bool in_dev_mode) {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUIExtensionsHost);
......@@ -329,6 +339,9 @@ content::WebUIDataSource* CreateMdExtensionsSource() {
GURL(extension_urls::GetWebstoreExtensionsCategoryURL()),
g_browser_process->GetApplicationLocale()).spec()));
source->AddBoolean(kInDevModeKey, in_dev_mode);
source->AddString(kLoadTimeClassesKey, GetLoadTimeClasses(in_dev_mode));
#if BUILDFLAG(OPTIMIZE_WEBUI)
source->AddResourcePath("crisper.js", IDR_MD_EXTENSIONS_CRISPER_JS);
source->SetDefaultResource(IDR_MD_EXTENSIONS_VULCANIZED_HTML);
......@@ -369,7 +382,11 @@ ExtensionsUI::ExtensionsUI(content::WebUI* web_ui) : WebUIController(web_ui) {
base::FeatureList::IsEnabled(features::kMaterialDesignExtensions);
if (is_md) {
source = CreateMdExtensionsSource();
in_dev_mode_.Init(
prefs::kExtensionsUIDeveloperMode, profile->GetPrefs(),
base::Bind(&ExtensionsUI::OnDevModeChanged, base::Unretained(this)));
source = CreateMdExtensionsSource(*in_dev_mode_);
source->AddBoolean(
"isGuest",
......@@ -424,6 +441,7 @@ ExtensionsUI::ExtensionsUI(content::WebUI* web_ui) : WebUIController(web_ui) {
source->OverrideContentSecurityPolicyObjectSrc("object-src 'self';");
content::WebUIDataSource::Add(profile, source);
// Handles its own lifetime.
new ExtensionWebUiTimer(web_ui->GetWebContents(), is_md);
}
......@@ -437,4 +455,15 @@ base::RefCountedMemory* ExtensionsUI::GetFaviconResourceBytes(
return rb.LoadDataResourceBytesForScale(IDR_EXTENSIONS_FAVICON, scale_factor);
}
// Normally volatile data does not belong in loadTimeData, but in this case
// prevents flickering on a very prominent surface (top of the landing page).
void ExtensionsUI::OnDevModeChanged() {
auto update = std::make_unique<base::DictionaryValue>();
update->SetBoolean(kInDevModeKey, *in_dev_mode_);
update->SetString(kLoadTimeClassesKey, GetLoadTimeClasses(*in_dev_mode_));
content::WebUIDataSource::Update(Profile::FromWebUI(web_ui()),
chrome::kChromeUIExtensionsHost,
std::move(update));
}
} // namespace extensions
......@@ -6,6 +6,7 @@
#define CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSIONS_UI_H_
#include "base/macros.h"
#include "components/prefs/pref_member.h"
#include "content/public/browser/web_ui_controller.h"
#include "ui/base/layout.h"
......@@ -24,6 +25,12 @@ class ExtensionsUI : public content::WebUIController {
ui::ScaleFactor scale_factor);
private:
// Called when developer mode is toggled.
void OnDevModeChanged();
// Tracks whether developer mode is enabled.
BooleanPrefMember in_dev_mode_;
DISALLOW_COPY_AND_ASSIGN(ExtensionsUI);
};
......
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