Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(433)

Unified Diff: chrome/browser/android/vr_shell/textures/url_bar_texture.cc

Issue 2902783002: VR: Add URL bar security-related coloring and emphasis. (Closed)
Patch Set: Another test case for HTTPS + not secure. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/android/vr_shell/textures/url_bar_texture.cc
diff --git a/chrome/browser/android/vr_shell/textures/url_bar_texture.cc b/chrome/browser/android/vr_shell/textures/url_bar_texture.cc
index 3c43bf06aca9c987d7b1bc24a3dbee721ffdea18..6e7426f2534c59a035a4a818a0847f63e80a5f87 100644
--- a/chrome/browser/android/vr_shell/textures/url_bar_texture.cc
+++ b/chrome/browser/android/vr_shell/textures/url_bar_texture.cc
@@ -6,8 +6,10 @@
#include "base/strings/utf_string_conversions.h"
#include "cc/paint/skia_paint_canvas.h"
-#include "components/security_state/core/security_state.h"
+#include "chrome/browser/android/vr_shell/textures/render_text_wrapper.h"
+#include "components/url_formatter/url_formatter.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/color_palette.h"
#include "ui/gfx/font.h"
#include "ui/gfx/font_list.h"
#include "ui/gfx/geometry/point_f.h"
@@ -29,15 +31,16 @@ static constexpr SkColor kBackgroundDown = 0x76F6F6F6;
static constexpr SkColor kForeground = 0xFF333333;
static constexpr SkColor kSeparatorColor = 0x33000000;
-static constexpr SkColor kInfoOutlineIconColor = 0xFF5A5A5A;
-static constexpr SkColor kLockIconColor = 0xFF0B8043;
-static constexpr SkColor kWarningIconColor = 0xFFC73821;
+static constexpr SkColor kUrlTextColor = 0xFF000000;
+static constexpr SkColor kUrlDeemphasizedTextColor = 0xFF5A5A5A;
+static const SkColor kSecureColor = gfx::kGoogleGreen700;
+static const SkColor kWarningColor = gfx::kGoogleRed700;
static constexpr float kWidth = 0.672;
static constexpr float kHeight = 0.088;
static constexpr float kFontHeight = 0.027;
static constexpr float kBackButtonWidth = kHeight;
-static constexpr float kBackIconHeight = 0.05;
+static constexpr float kBackIconHeight = 0.0375;
static constexpr float kBackIconOffset = 0.005;
static constexpr float kSecurityFieldWidth = 0.06;
static constexpr float kSecurityIconHeight = 0.03;
@@ -46,7 +49,7 @@ static constexpr float kSeparatorWidth = 0.002;
using security_state::SecurityLevel;
-const struct gfx::VectorIcon& getSecurityIcon(int level) {
+const struct gfx::VectorIcon& getSecurityIcon(SecurityLevel level) {
switch (level) {
case SecurityLevel::NONE:
case SecurityLevel::HTTP_SHOW_WARNING:
@@ -55,26 +58,42 @@ const struct gfx::VectorIcon& getSecurityIcon(int level) {
case SecurityLevel::SECURE:
case SecurityLevel::EV_SECURE:
return ui::kLockIcon;
- case SecurityLevel::SECURE_WITH_POLICY_INSTALLED_CERT:
case SecurityLevel::DANGEROUS:
+ return ui::kWarningIcon;
+ case SecurityLevel::SECURE_WITH_POLICY_INSTALLED_CERT: // ChromeOS only.
default:
+ NOTREACHED();
return ui::kWarningIcon;
}
}
-SkColor getSecurityIconColor(int level) {
+// See LocationBarView::GetSecureTextColor().
+SkColor getSchemeColor(SecurityLevel level) {
switch (level) {
case SecurityLevel::NONE:
case SecurityLevel::HTTP_SHOW_WARNING:
case SecurityLevel::SECURITY_WARNING:
- return kInfoOutlineIconColor;
+ return kUrlDeemphasizedTextColor;
case SecurityLevel::SECURE:
case SecurityLevel::EV_SECURE:
- return kLockIconColor;
- case SecurityLevel::SECURE_WITH_POLICY_INSTALLED_CERT:
+ return kSecureColor;
case SecurityLevel::DANGEROUS:
+ return kWarningColor;
+ case SecurityLevel::SECURE_WITH_POLICY_INSTALLED_CERT: // ChromeOS only.
default:
- return kWarningIconColor;
+ NOTREACHED();
+ return kWarningColor;
+ }
+}
+
+void setEmphasis(vr_shell::RenderTextWrapper* render_text,
+ bool emphasis,
+ const gfx::Range& range) {
+ SkColor color = emphasis ? kUrlTextColor : kUrlDeemphasizedTextColor;
+ if (range.IsValid()) {
Ian Vollick 2017/05/26 01:22:19 OOC, when is the range invalid?
cjgrant 2017/05/26 15:58:59 Check out the call sites below. An invalid range j
+ render_text->ApplyColor(color, range);
+ } else {
+ render_text->SetColor(color);
}
}
@@ -94,8 +113,8 @@ void UrlBarTexture::SetURL(const GURL& gurl) {
gurl_ = gurl;
}
-void UrlBarTexture::SetSecurityLevel(int level) {
- if (&getSecurityIcon(security_level_) != &getSecurityIcon(level))
+void UrlBarTexture::SetSecurityLevel(SecurityLevel level) {
+ if (security_level_ != level)
set_dirty();
security_level_ = level;
}
@@ -193,7 +212,7 @@ void UrlBarTexture::Draw(SkCanvas* canvas, const gfx::Size& texture_size) {
const gfx::VectorIcon& icon = getSecurityIcon(security_level_);
icon_default_height = GetDefaultSizeOfVectorIcon(icon);
icon_scale = kSecurityIconHeight / icon_default_height;
- SkColor icon_color = getSecurityIconColor(security_level_);
+ SkColor icon_color = getSchemeColor(security_level_);
canvas->scale(icon_scale, icon_scale);
PaintVectorIcon(&gfx_canvas, icon, icon_color);
canvas->restore();
@@ -202,22 +221,106 @@ void UrlBarTexture::Draw(SkCanvas* canvas, const gfx::Size& texture_size) {
canvas->restore();
if (!gurl_.is_empty()) {
- if (last_drawn_gurl_ != gurl_) {
- // Draw text based on pixel sizes rather than meters, for correct font
- // sizing.
- int pixel_font_height = texture_size.height() * kFontHeight / kHeight;
+ if (last_drawn_gurl_ != gurl_ ||
+ last_drawn_security_level_ != security_level_) {
float url_x = kBackButtonWidth + kSeparatorWidth + kSecurityFieldWidth;
float url_width = kWidth - url_x - kUrlRightMargin;
gfx::Rect text_bounds(ToPixels(url_x), 0, ToPixels(url_width),
ToPixels(kHeight));
- gurl_render_texts_ = PrepareDrawStringRect(
- base::UTF8ToUTF16(gurl_.spec()),
- GetDefaultFontList(pixel_font_height), SK_ColorBLACK, &text_bounds,
- kTextAlignmentLeft, kWrappingBehaviorNoWrap);
+ RenderUrl(texture_size, text_bounds);
last_drawn_gurl_ = gurl_;
+ last_drawn_security_level_ = security_level_;
+ }
+ url_render_text_->Draw(&gfx_canvas);
+ }
+}
+
+void UrlBarTexture::RenderUrl(const gfx::Size& texture_size,
+ const gfx::Rect& bounds) {
+ url::Parsed parsed;
+ const base::string16 text = url_formatter::FormatUrl(
+ gurl_, url_formatter::kFormatUrlOmitAll, net::UnescapeRule::NORMAL,
+ &parsed, nullptr, nullptr);
+
+ int pixel_font_height = texture_size.height() * kFontHeight / kHeight;
+ auto font_list = GetFontList(pixel_font_height, text);
+
+ std::unique_ptr<gfx::RenderText> render_text(
+ gfx::RenderText::CreateInstance());
+ render_text->SetText(text);
+ render_text->SetFontList(font_list);
+ render_text->SetColor(SK_ColorBLACK);
+ render_text->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+ render_text->SetDisplayRect(bounds);
+ render_text->SetElideBehavior(gfx::TRUNCATE);
+
+ vr_shell::RenderTextWrapper vr_render_text(render_text.get());
+ ApplyUrlStyling(text, parsed, security_level_, &vr_render_text);
+
+ url_render_text_ = std::move(render_text);
+}
+
+// This method replicates behavior in OmniboxView::UpdateTextStyle(), and
+// attempts to maintain similar code structure.
Ian Vollick 2017/05/26 01:22:19 As was discussed earlier, it'll be nice to use Omn
cjgrant 2017/05/26 15:58:59 Done. crbug/726745
+void UrlBarTexture::ApplyUrlStyling(
+ const base::string16& formatted_url,
+ const url::Parsed& parsed,
+ const security_state::SecurityLevel security_level,
+ vr_shell::RenderTextWrapper* render_text) {
+ const url::Component& scheme = parsed.scheme;
+ const url::Component& host = parsed.host;
+
+ enum DeemphasizeComponents {
+ EVERYTHING,
+ ALL_BUT_SCHEME,
+ ALL_BUT_HOST,
+ NOTHING,
+ } deemphasize = NOTHING;
+
+ const base::string16 url_scheme =
+ formatted_url.substr(scheme.begin, scheme.len);
+
+ // Data URLs are rarely human-readable and can be used for spoofing, so draw
+ // attention to the scheme to emphasize "this is just a bunch of data". For
+ // normal URLs, the host is the best proxy for "identity".
+ // TODO(cjgrant): Handle extensions, if required, for desktop.
+ if (url_scheme == base::UTF8ToUTF16(url::kDataScheme))
+ deemphasize = ALL_BUT_SCHEME;
+ else if (host.is_nonempty())
+ deemphasize = ALL_BUT_HOST;
+
+ gfx::Range scheme_range = scheme.is_nonempty()
+ ? gfx::Range(scheme.begin, scheme.end())
+ : gfx::Range::InvalidRange();
+ switch (deemphasize) {
+ case EVERYTHING:
+ setEmphasis(render_text, false, gfx::Range::InvalidRange());
+ break;
+ case NOTHING:
+ setEmphasis(render_text, true, gfx::Range::InvalidRange());
+ break;
+ case ALL_BUT_SCHEME:
+ DCHECK(scheme_range.IsValid());
+ setEmphasis(render_text, false, gfx::Range::InvalidRange());
+ setEmphasis(render_text, true, scheme_range);
+ break;
+ case ALL_BUT_HOST:
+ setEmphasis(render_text, false, gfx::Range::InvalidRange());
+ setEmphasis(render_text, true, gfx::Range(host.begin, host.end()));
+ break;
+ }
+
+ // Only SECURE and DANGEROUS levels (pages served over HTTPS or flagged by
+ // SafeBrowsing) get a special scheme color treatment. If the security level
+ // is NONE or HTTP_SHOW_WARNING, we do not override the text style previously
+ // applied to the scheme text range by setEmphasis().
+ if (scheme_range.IsValid() && security_level != security_state::NONE &&
+ security_level != security_state::HTTP_SHOW_WARNING) {
+ render_text->ApplyColor(getSchemeColor(security_level), scheme_range);
+ if (security_level == SecurityLevel::DANGEROUS) {
+ render_text->ApplyStyle(gfx::TextStyle::DIAGONAL_STRIKE, true,
+ scheme_range);
}
- for (auto& render_text : gurl_render_texts_)
- render_text->Draw(&gfx_canvas);
}
}

Powered by Google App Engine
This is Rietveld 408576698