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

Unified Diff: content/renderer/render_view.cc

Issue 7514013: Enforce the page title direction (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reup Created 9 years, 5 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
« no previous file with comments | « content/renderer/render_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_view.cc
diff --git a/content/renderer/render_view.cc b/content/renderer/render_view.cc
index d0f09c703dba14c6bb62ff57a311adcc066ab4d2..a51719e9c2c6642b6027d632fc561a1de7ec02e1 100644
--- a/content/renderer/render_view.cc
+++ b/content/renderer/render_view.cc
@@ -12,6 +12,7 @@
#include "base/callback.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
+#include "base/i18n/rtl.h"
#include "base/json/json_writer.h"
#include "base/lazy_instance.h"
#include "base/metrics/histogram.h"
@@ -242,6 +243,18 @@ using webkit_glue::WebAccessibility;
//-----------------------------------------------------------------------------
+namespace {
+
+// Return true if the character is known to be a strong LTR character.
+// A false return value can mean it's not an LTR character or just that
+// it's a strongly LTR character not in the set we test.
+// Used as a fast-path for the common case of LTR text.
+bool IsStronglyLTR(char16 ch) {
brettw 2011/07/29 17:14:00 If the check in rtl.h is slow, it seems like it mi
Evan Martin 2011/07/30 00:05:15 It's more that the function in rtl.h actually scan
+ return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
+}
+
+} // namespace
+
typedef std::map<WebKit::WebView*, RenderView*> ViewMap;
static base::LazyInstance<ViewMap> g_view_map(base::LINKER_INITIALIZED);
@@ -1177,15 +1190,27 @@ void RenderView::UpdateURL(WebFrame* frame) {
}
// Tell the embedding application that the title of the active page has changed
-void RenderView::UpdateTitle(WebFrame* frame, const string16& title) {
- // Ignore all but top level navigations...
- if (!frame->parent()) {
- Send(new ViewHostMsg_UpdateTitle(
- routing_id_,
- page_id_,
- title.length() > content::kMaxTitleChars ?
- title.substr(0, content::kMaxTitleChars) : title));
+void RenderView::UpdateTitle(WebFrame* frame, const string16& title,
+ WebTextDirection title_direction) {
+ // Ignore all but top level navigations.
+ if (frame->parent())
+ return;
+
+ string16 fixed_title = title.substr(0, content::kMaxTitleChars);
+
+ // Wrap with extra Unicode formatting to make the title strongly directional.
+ if (!fixed_title.empty()) {
+ if (title_direction == WebKit::WebTextDirectionLeftToRight) {
+ // To avoid needing to complicate tests that only use ASCII characters,
+ // special-case out some known strongly directional characters.
+ if (!IsStronglyLTR(title[0]))
+ base::i18n::WrapStringWithLTRFormatting(&fixed_title);
+ } else {
+ base::i18n::WrapStringWithRTLFormatting(&fixed_title);
+ }
}
+
+ Send(new ViewHostMsg_UpdateTitle(routing_id_, page_id_, fixed_title));
}
void RenderView::UpdateEncoding(WebFrame* frame,
@@ -2530,9 +2555,7 @@ void RenderView::didCreateDocumentElement(WebFrame* frame) {
void RenderView::didReceiveTitle(WebFrame* frame, const WebString& title,
WebTextDirection direction) {
- // TODO: pass direction through various APIs.
- // http://code.google.com/p/chromium/issues/detail?id=79903
- UpdateTitle(frame, title);
+ UpdateTitle(frame, title, direction);
// Also check whether we have new encoding name.
UpdateEncoding(frame, frame->view()->pageEncoding().utf8());
@@ -2597,7 +2620,11 @@ void RenderView::didNavigateWithinPage(
didCommitProvisionalLoad(frame, is_new_navigation);
- UpdateTitle(frame, frame->view()->mainFrame()->dataSource()->pageTitle());
+ // TODO(evan): update this to use ->pageTitleDirection() once we pull in new
+ // WebKit.
+ // http://code.google.com/p/chromium/issues/detail?id=27094
+ UpdateTitle(frame, frame->view()->mainFrame()->dataSource()->pageTitle(),
+ WebKit::WebTextDirectionLeftToRight);
}
void RenderView::didUpdateCurrentHistoryItem(WebFrame* frame) {
« no previous file with comments | « content/renderer/render_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698