summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/browser.cc4
-rw-r--r--chrome/browser/browser_browsertest.cc33
-rw-r--r--chrome/browser/extensions/extension_tabs_module.cc43
-rw-r--r--chrome/browser/extensions/extension_tabs_module.h1
-rw-r--r--chrome/browser/renderer_host/browser_render_process_host.cc13
-rw-r--r--chrome/browser/renderer_host/browser_render_process_host.h2
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc27
-rw-r--r--chrome/browser/renderer_host/render_view_host.h21
-rw-r--r--chrome/browser/renderer_host/render_view_host_delegate.h7
-rw-r--r--chrome/browser/tab_contents/navigation_entry.h10
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc37
-rw-r--r--chrome/browser/tab_contents/tab_contents.h8
-rwxr-xr-xchrome/chrome_browser.gypi2
-rw-r--r--chrome/common/notification_type.h5
-rw-r--r--chrome/common/render_messages_internal.h18
-rw-r--r--chrome/renderer/render_view.cc53
-rw-r--r--chrome/renderer/render_view.h3
-rw-r--r--chrome/test/data/english_page.html6
-rw-r--r--chrome/test/data/french_page.html6
-rw-r--r--chrome/test/ui_test_utils.cc32
-rw-r--r--chrome/test/ui_test_utils.h4
21 files changed, 108 insertions, 227 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc
index a3c4ab5..0cfbe13 100644
--- a/chrome/browser/browser.cc
+++ b/chrome/browser/browser.cc
@@ -1210,8 +1210,8 @@ void Browser::OpenCreateShortcutsDialog() {
DCHECK(pending_web_app_action_ == NONE);
pending_web_app_action_ = CREATE_SHORTCUT;
- // Start fetching web app info for CreateApplicationShortcut dialog and show
- // the dialog when the data is available in OnDidGetApplicationInfo.
+ // Start fetching web app info for CreateApplicatoinShortcut dialog and
+ // show the dialog when the data is available in OnDidGetApplicationInfo.
current_tab->render_view_host()->GetApplicationInfo(entry->page_id());
#else
NOTIMPLEMENTED();
diff --git a/chrome/browser/browser_browsertest.cc b/chrome/browser/browser_browsertest.cc
index a948947..756b7dc 100644
--- a/chrome/browser/browser_browsertest.cc
+++ b/chrome/browser/browser_browsertest.cc
@@ -288,36 +288,3 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, FaviconOfOnloadRedirectToAnchorPage) {
controller().GetActiveEntry();
EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
}
-
-// The CLD library only works on Windows at this point.
-#if defined(OS_WIN)
-// Tests that the CLD (Compact Language Detection) works properly.
-IN_PROC_BROWSER_TEST_F(BrowserTest, PageLanguageDetection) {
- static const wchar_t kDocRoot[] = L"chrome/test/data";
- scoped_refptr<HTTPTestServer> server(
- HTTPTestServer::CreateServer(kDocRoot, NULL));
- ASSERT_TRUE(NULL != server.get());
-
- TabContents* current_tab = browser()->GetSelectedTabContents();
-
- // Navigate to a page in English.
- ui_test_utils::NavigateToURL(
- browser(), GURL(server->TestServerPage("files/english_page.html")));
- NavigationEntry* entry = current_tab->controller().GetActiveEntry();
- ASSERT_TRUE(NULL != entry);
- EXPECT_TRUE(entry->language().empty());
- std::string lang = ui_test_utils::WaitForLanguageDetection(current_tab);
- EXPECT_EQ("en", lang);
- EXPECT_EQ("en", entry->language());
-
- // Now navigate to a page in French.
- ui_test_utils::NavigateToURL(
- browser(), GURL(server->TestServerPage("files/french_page.html")));
- entry = current_tab->controller().GetActiveEntry();
- ASSERT_TRUE(NULL != entry);
- EXPECT_TRUE(entry->language().empty());
- lang = ui_test_utils::WaitForLanguageDetection(current_tab);
- EXPECT_EQ("fr", lang);
- EXPECT_EQ("fr", entry->language());
-}
-#endif
diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc
index fca5820..19d2687 100644
--- a/chrome/browser/extensions/extension_tabs_module.cc
+++ b/chrome/browser/extensions/extension_tabs_module.cc
@@ -860,49 +860,26 @@ bool DetectTabLanguageFunction::RunImpl() {
return false;
}
- AddRef(); // Balanced in GotLanguage()
-
- NavigationEntry* entry = contents->controller().GetActiveEntry();
- if (entry) {
- std::string language = entry->language();
- if (!language.empty()) {
- // Delay the callback invocation until after the current JS call has
- // returned.
- MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(
- this, &DetectTabLanguageFunction::GotLanguage, language));
- return true;
- }
- }
- // The tab contents does not know its language yet. Let's wait until it
- // receives it, or until the tab is closed/navigates to some other page.
+ // Figure out what language |contents| contains. This sends an async call via
+ // the browser to the renderer to determine the language of the tab the
+ // renderer has. The renderer sends back the language of the tab after the
+ // tab loads (it may be delayed) to the browser, which in turn notifies this
+ // object that the language has been received.
+ contents->GetPageLanguage();
registrar_.Add(this, NotificationType::TAB_LANGUAGE_DETERMINED,
Source<RenderViewHost>(contents->render_view_host()));
- registrar_.Add(this, NotificationType::TAB_CLOSING,
- Source<NavigationController>(&(contents->controller())));
- registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED,
- Source<NavigationController>(&(contents->controller())));
+ AddRef(); // balanced in Observe()
return true;
}
void DetectTabLanguageFunction::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
- std::string language;
- if (type == NotificationType::TAB_LANGUAGE_DETERMINED)
- language = *Details<std::string>(details).ptr();
-
- registrar_.RemoveAll();
-
- // Call GotLanguage in all cases as we want to guarantee the callback is
- // called for every API call the extension made.
- GotLanguage(language);
-}
-
-void DetectTabLanguageFunction::GotLanguage(const std::string& language) {
+ DCHECK(type == NotificationType::TAB_LANGUAGE_DETERMINED);
+ std::string language(*Details<std::string>(details).ptr());
result_.reset(Value::CreateStringValue(language.c_str()));
SendResponse(true);
-
- Release(); // Balanced in Run()
+ Release(); // balanced in Run()
}
// static helpers
diff --git a/chrome/browser/extensions/extension_tabs_module.h b/chrome/browser/extensions/extension_tabs_module.h
index 5282a17..a4d6f5d 100644
--- a/chrome/browser/extensions/extension_tabs_module.h
+++ b/chrome/browser/extensions/extension_tabs_module.h
@@ -133,7 +133,6 @@ class DetectTabLanguageFunction : public AsyncExtensionFunction,
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
- void GotLanguage(const std::string& language);
NotificationRegistrar registrar_;
DECLARE_EXTENSION_FUNCTION_NAME("tabs.detectLanguage")
};
diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc
index dadeb53..32c141c 100644
--- a/chrome/browser/renderer_host/browser_render_process_host.cc
+++ b/chrome/browser/renderer_host/browser_render_process_host.cc
@@ -738,6 +738,7 @@ void BrowserRenderProcessHost::OnMessageReceived(const IPC::Message& msg) {
// Dispatch control messages.
bool msg_is_ok = true;
IPC_BEGIN_MESSAGE_MAP_EX(BrowserRenderProcessHost, msg, msg_is_ok)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_PageContents, OnPageContents)
IPC_MESSAGE_HANDLER(ViewHostMsg_UpdatedCacheStats,
OnUpdatedCacheStats)
IPC_MESSAGE_HANDLER(ViewHostMsg_SuddenTerminationChanged,
@@ -835,6 +836,18 @@ void BrowserRenderProcessHost::OnChannelError() {
// TODO(darin): clean this up
}
+void BrowserRenderProcessHost::OnPageContents(const GURL& url,
+ int32 page_id,
+ const std::wstring& contents) {
+ Profile* p = profile();
+ if (!p || p->IsOffTheRecord())
+ return;
+
+ HistoryService* hs = p->GetHistoryService(Profile::IMPLICIT_ACCESS);
+ if (hs)
+ hs->SetPageContents(url, contents);
+}
+
void BrowserRenderProcessHost::OnUpdatedCacheStats(
const WebCache::UsageStats& stats) {
WebCacheManager::GetInstance()->ObserveStats(id(), stats);
diff --git a/chrome/browser/renderer_host/browser_render_process_host.h b/chrome/browser/renderer_host/browser_render_process_host.h
index 0fd51ea..3a6e83b 100644
--- a/chrome/browser/renderer_host/browser_render_process_host.h
+++ b/chrome/browser/renderer_host/browser_render_process_host.h
@@ -104,6 +104,8 @@ class BrowserRenderProcessHost : public RenderProcessHost,
friend class VisitRelayingRenderProcessHost;
// Control message handlers.
+ void OnPageContents(const GURL& url, int32 page_id,
+ const std::wstring& contents);
void OnUpdatedCacheStats(const WebKit::WebCache::UsageStats& stats);
void SuddenTerminationChanged(bool enabled);
void OnExtensionAddListener(const std::string& event_name);
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index 0af786b..842e7b4 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -428,6 +428,10 @@ void RenderViewHost::StopFinding(bool clear_selection) {
Send(new ViewMsg_StopFinding(routing_id(), clear_selection));
}
+void RenderViewHost::GetPageLanguage() {
+ Send(new ViewMsg_DeterminePageLanguage(routing_id()));
+}
+
void RenderViewHost::Zoom(PageZoom::Function function) {
Send(new ViewMsg_Zoom(routing_id(), function));
}
@@ -765,6 +769,8 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(ViewHostMsg_DidFailProvisionalLoadWithError,
OnMsgDidFailProvisionalLoadWithError)
IPC_MESSAGE_HANDLER(ViewHostMsg_Find_Reply, OnMsgFindReply)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_PageLanguageDetermined,
+ OnPageLanguageDetermined)
IPC_MESSAGE_HANDLER(ViewMsg_ExecuteCodeFinished,
OnExecuteCodeFinished)
IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFavIconURL, OnMsgUpdateFavIconURL)
@@ -848,7 +854,6 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityFocusChange,
OnAccessibilityFocusChange)
IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted)
- IPC_MESSAGE_HANDLER(ViewHostMsg_PageContents, OnPageContents)
// Have the super handle all other messages.
IPC_MESSAGE_UNHANDLED(RenderWidgetHost::OnMessageReceived(msg))
IPC_END_MESSAGE_MAP_EX()
@@ -1162,6 +1167,14 @@ void RenderViewHost::OnMsgFindReply(int request_id,
Send(new ViewMsg_FindReplyACK(routing_id()));
}
+void RenderViewHost::OnPageLanguageDetermined(const std::string& language) {
+ std::string lang(language);
+ NotificationService::current()->Notify(
+ NotificationType::TAB_LANGUAGE_DETERMINED,
+ Source<RenderViewHost>(this),
+ Details<std::string>(&lang));
+}
+
void RenderViewHost::OnExecuteCodeFinished(int request_id, bool success) {
std::pair<int, bool> result_details(request_id, success);
NotificationService::current()->Notify(
@@ -1782,15 +1795,3 @@ void RenderViewHost::OnAccessibilityFocusChange(int acc_obj_id) {
void RenderViewHost::OnCSSInserted() {
delegate_->DidInsertCSS();
}
-
-void RenderViewHost::OnPageContents(const GURL& url,
- int32 page_id,
- const std::wstring& contents,
- const std::string& language) {
- RenderViewHostDelegate::BrowserIntegration* integration_delegate =
- delegate_->GetBrowserIntegrationDelegate();
- if (!integration_delegate)
- return;
- integration_delegate->OnPageContents(url, process()->id(), page_id, contents,
- language);
-}
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index 3eca11d..831bd80 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -213,6 +213,12 @@ class RenderViewHost : public RenderWidgetHost,
// clear the selection on the focused frame.
void StopFinding(bool clear_selection);
+ // Gets the most probable language of the text content in the tab. (This sends
+ // a message to the render view.) The caller gets the language via the
+ // NotificationService by registering to the
+ // NotificationType TAB_LANGUAGE_DETERMINED.
+ void GetPageLanguage();
+
// Change the zoom level of a page.
void Zoom(PageZoom::Function function);
@@ -421,22 +427,22 @@ class RenderViewHost : public RenderWidgetHost,
// Creates a new RenderWidget with the given route id.
void CreateNewWidget(int route_id, bool activatable);
- // Sends the response to an extension api call.
+ // Send the response to an extension api call.
void SendExtensionResponse(int request_id, bool success,
const std::string& response,
const std::string& error);
- // Sends a response to an extension api call that it was blocked for lack of
+ // Send a response to an extension api call that it was blocked for lack of
// permission.
void BlockExtensionRequest(int request_id);
- // Notifies the renderer that its view type has changed.
+ // Notify the renderer that its view type has changed.
void ViewTypeChanged(ViewType::Type type);
- // Tells the renderer which browser window it is being attached to.
+ // Tell renderer which browser window it is being attached to.
void UpdateBrowserWindowId(int window_id);
- // Tells the render view that a custom context action has been selected.
+ // Tell render view that custom context action has been selected.
void PerformCustomContextMenuAction(unsigned action);
protected:
@@ -494,6 +500,7 @@ class RenderViewHost : public RenderWidgetHost,
const gfx::Rect& selection_rect,
int active_match_ordinal,
bool final_update);
+ void OnPageLanguageDetermined(const std::string& language);
void OnExecuteCodeFinished(int request_id, bool success);
void OnMsgUpdateFavIconURL(int32 page_id, const GURL& icon_url);
void OnMsgDidDownloadFavIcon(int id,
@@ -591,10 +598,6 @@ class RenderViewHost : public RenderWidgetHost,
void OnExtensionPostMessage(int port_id, const std::string& message);
void OnAccessibilityFocusChange(int acc_obj_id);
void OnCSSInserted();
- void OnPageContents(const GURL& url,
- int32 page_id,
- const std::wstring& contents,
- const std::string& language);
private:
friend class TestRenderViewHost;
diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h
index eecc54f..c3df62d 100644
--- a/chrome/browser/renderer_host/render_view_host_delegate.h
+++ b/chrome/browser/renderer_host/render_view_host_delegate.h
@@ -217,13 +217,6 @@ class RenderViewHostDelegate {
virtual void OnDidGetApplicationInfo(
int32 page_id,
const webkit_glue::WebApplicationInfo& app_info) = 0;
-
- // Notification that the contents of the page has been loaded.
- virtual void OnPageContents(const GURL& url,
- int renderer_process_id,
- int32 page_id,
- const std::wstring& contents,
- const std::string& language) = 0;
};
// Resource ------------------------------------------------------------------
diff --git a/chrome/browser/tab_contents/navigation_entry.h b/chrome/browser/tab_contents/navigation_entry.h
index df6ad06..e679c10 100644
--- a/chrome/browser/tab_contents/navigation_entry.h
+++ b/chrome/browser/tab_contents/navigation_entry.h
@@ -389,15 +389,6 @@ class NavigationEntry {
return restore_type_;
}
- // The ISO 639-1 language code (ex: en, fr, zh...) for the page.
- // Can be empty if the language was not detected yet or is unknown.
- void set_language(const std::string& language) {
- language_ = language;
- }
- std::string language() const {
- return language_;
- }
-
private:
// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
// Session/Tab restore save portions of this class so that it can be recreated
@@ -422,7 +413,6 @@ class NavigationEntry {
GURL user_typed_url_;
bool has_post_data_;
RestoreType restore_type_;
- std::string language_; // ISO 639-1 language code.
// This is a cached version of the result of GetTitleForDisplay. It prevents
// us from having to do URL formatting on the URL evey time the title is
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index bf0bd56..10efa22 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -1076,6 +1076,10 @@ void TabContents::StopFinding(bool clear_selection) {
render_view_host()->StopFinding(clear_selection);
}
+void TabContents::GetPageLanguage() {
+ render_view_host()->GetPageLanguage();
+}
+
void TabContents::OnSavePage() {
// If we can not save the page, try to download it.
if (!SavePackage::IsSavableContents(contents_mime_type())) {
@@ -1731,39 +1735,6 @@ void TabContents::OnDidGetApplicationInfo(
delegate()->OnDidGetApplicationInfo(this, page_id);
}
-void TabContents::OnPageContents(const GURL& url,
- int renderer_process_id,
- int32 page_id,
- const std::wstring& contents,
- const std::string& language) {
- // Don't index any https pages. People generally don't want their bank
- // accounts, etc. indexed on their computer, especially since some of these
- // things are not marked cachable.
- // TODO(brettw) we may want to consider more elaborate heuristics such as
- // the cachability of the page. We may also want to consider subframes (this
- // test will still index subframes if the subframe is SSL).
- if (!url.SchemeIsSecure()) {
- Profile* p = profile();
- if (p && !p->IsOffTheRecord()) {
- HistoryService* hs = p->GetHistoryService(Profile::IMPLICIT_ACCESS);
- if (hs)
- hs->SetPageContents(url, contents);
- }
- }
-
- NavigationEntry* entry = controller_.GetActiveEntry();
- if (process()->id() == renderer_process_id &&
- entry && entry->page_id() == page_id) {
- entry->set_language(language);
- }
-
- std::string lang = language;
- NotificationService::current()->Notify(
- NotificationType::TAB_LANGUAGE_DETERMINED,
- Source<RenderViewHost>(render_view_host()),
- Details<std::string>(&lang));
-}
-
void TabContents::DidStartProvisionalLoadForFrame(
RenderViewHost* render_view_host,
bool is_main_frame,
diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h
index 6333b59..112675d 100644
--- a/chrome/browser/tab_contents/tab_contents.h
+++ b/chrome/browser/tab_contents/tab_contents.h
@@ -538,6 +538,9 @@ class TabContents : public PageNavigator,
return last_search_result_;
}
+ // Get the most probable language of the text content in the tab.
+ void GetPageLanguage();
+
// Misc state & callbacks ----------------------------------------------------
// Set whether the contents should block javascript message boxes or not.
@@ -811,11 +814,6 @@ class TabContents : public PageNavigator,
virtual void OnDidGetApplicationInfo(
int32 page_id,
const webkit_glue::WebApplicationInfo& info);
- virtual void OnPageContents(const GURL& url,
- int renderer_process_id,
- int32 page_id,
- const std::wstring& contents,
- const std::string& language);
// RenderViewHostDelegate::Resource implementation.
virtual void DidStartProvisionalLoadForFrame(RenderViewHost* render_view_host,
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index d5357e7..c4769b6 100755
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2113,10 +2113,12 @@
],
'include_dirs': [
'third_party/wtl/include',
+ '../third_party/cld',
],
'dependencies': [
'../gears/gears.gyp:gears',
'../google_update/google_update.gyp:google_update',
+ '../third_party/cld/cld.gyp:cld',
'../views/views.gyp:views',
'installer/installer.gyp:installer_util',
'<(allocator_target)',
diff --git a/chrome/common/notification_type.h b/chrome/common/notification_type.h
index d3f5640..d021059 100644
--- a/chrome/common/notification_type.h
+++ b/chrome/common/notification_type.h
@@ -223,9 +223,8 @@ class NotificationType {
// is the InfoBubble.
INFO_BUBBLE_CREATED,
- // Sent when the language (English, French...) for a page has been detected.
- // The details Details<std::string> contain the ISO 639-1 language code and
- // the source is Source<RenderViewHost>.
+ // Sent after a call to RenderViewHost::DeterminePageLanguage. The details
+ // are Details<std::string> and the source is Source<RenderViewHost>.
TAB_LANGUAGE_DETERMINED,
// Sent after the renderer returns a snapshot of tab contents.
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index a45310d..2003c9d 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -255,6 +255,9 @@ IPC_BEGIN_MESSAGES(View)
string16 /* search_text */,
WebKit::WebFindOptions)
+ // Asks the renderer for the language of the current page.
+ IPC_MESSAGE_ROUTED0(ViewMsg_DeterminePageLanguage)
+
// Send from the renderer to the browser to return the script running result.
IPC_MESSAGE_ROUTED2(ViewMsg_ExecuteCodeFinished,
int, /* request id */
@@ -1115,7 +1118,7 @@ IPC_BEGIN_MESSAGES(ViewHost)
IPC_MESSAGE_ROUTED1(ViewHostMsg_UpdateSpellingPanelWithMisspelledWord,
string16 /* the word to update the panel with */)
- // Initiates a download based on user actions like 'ALT+click'.
+ // Initiate a download based on user actions like 'ALT+click'.
IPC_MESSAGE_ROUTED2(ViewHostMsg_DownloadUrl,
GURL /* url */,
GURL /* referrer */)
@@ -1133,12 +1136,9 @@ IPC_BEGIN_MESSAGES(ViewHost)
bool /* out - success */,
std::wstring /* out - prompt field */)
- // Provides the contents for the given page that was loaded recently.
- IPC_MESSAGE_ROUTED4(ViewHostMsg_PageContents,
- GURL /* URL of the page */,
- int32 /* page id */,
- std::wstring /* page contents */,
- std::string /* page ISO639_1 language code */)
+ // Sets the contents for the given page (URL and page ID are the first two
+ // arguments) given the contents that is the 3rd.
+ IPC_MESSAGE_CONTROL3(ViewHostMsg_PageContents, GURL, int32, std::wstring)
// Used to get the extension message bundle.
IPC_SYNC_MESSAGE_CONTROL1_1(ViewHostMsg_GetExtensionMessageBundle,
@@ -1167,13 +1167,13 @@ IPC_BEGIN_MESSAGES(ViewHost)
// user right clicked.
IPC_MESSAGE_ROUTED1(ViewHostMsg_ContextMenu, ContextMenuParams)
- // Requests that the given URL be opened in the specified manner.
+ // Request that the given URL be opened in the specified manner.
IPC_MESSAGE_ROUTED3(ViewHostMsg_OpenURL,
GURL /* url */,
GURL /* referrer */,
WindowOpenDisposition /* disposition */)
- // Notifies that the preferred size of the content changed.
+ // Notify that the preferred size of the content changed.
IPC_MESSAGE_ROUTED1(ViewHostMsg_DidContentsPreferredSizeChange,
gfx::Size /* pref_size */)
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 040fc4c..b901a7e 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -304,6 +304,7 @@ RenderView::RenderView(RenderThreadBase* render_thread,
send_preferred_size_changes_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(
notification_provider_(new NotificationProvider(this))),
+ determine_page_text_after_loading_stops_(false),
view_type_(ViewType::INVALID),
browser_window_id_(-1),
last_top_level_navigation_page_id_(-1),
@@ -494,6 +495,7 @@ void RenderView::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ViewMsg_CopyImageAt, OnCopyImageAt)
IPC_MESSAGE_HANDLER(ViewMsg_ExecuteEditCommand, OnExecuteEditCommand)
IPC_MESSAGE_HANDLER(ViewMsg_Find, OnFind)
+ IPC_MESSAGE_HANDLER(ViewMsg_DeterminePageLanguage, OnDeterminePageLanguage)
IPC_MESSAGE_HANDLER(ViewMsg_Zoom, OnZoom)
IPC_MESSAGE_HANDLER(ViewMsg_SetZoomLevelForLoadingHost,
OnSetZoomLevelForLoadingHost)
@@ -664,35 +666,24 @@ void RenderView::CapturePageInfo(int load_id, bool preliminary_capture) {
if (!preliminary_capture)
last_indexed_page_id_ = load_id;
- // Get the URL for this page.
+ // get the URL for this page
GURL url(main_frame->url());
if (url.is_empty())
return;
- // Retrieve the frame's full text.
+ // full text
std::wstring contents;
CaptureText(main_frame, &contents);
if (contents.size()) {
- std::string language = "unknown";
-#if defined(OS_WIN)
- int num_languages = 0;
- bool is_reliable = false;
- base::TimeTicks begin_time = base::TimeTicks::Now();
- Language cld_lang =
- DetectLanguageOfUnicodeText(NULL, contents.c_str(), true,
- &is_reliable, &num_languages, NULL);
- if (cld_lang != NUM_LANGUAGES && cld_lang != UNKNOWN_LANGUAGE &&
- cld_lang != TG_UNKNOWN_LANGUAGE) {
- language = LanguageCodeISO639_1(cld_lang);
- }
- UMA_HISTOGRAM_MEDIUM_TIMES("Renderer4.LanguageDetection",
- base::TimeTicks::Now() - begin_time);
-#endif
+ // Send the text to the browser for indexing.
+ Send(new ViewHostMsg_PageContents(url, load_id, contents));
+ }
- // Send the text to the browser for indexing (the browser might decide not
- // to index, if the URL is HTTPS for instance) and language discovery.
- Send(new ViewHostMsg_PageContents(routing_id_, url, load_id, contents,
- language));
+ // Now that we have the contents, we can determine the language if necessary.
+ if (determine_page_text_after_loading_stops_) {
+ determine_page_text_after_loading_stops_ = false;
+ Send(new ViewHostMsg_PageLanguageDetermined(
+ routing_id_, DetermineTextLanguage(contents)));
}
// thumbnail
@@ -704,6 +695,15 @@ void RenderView::CaptureText(WebFrame* frame, std::wstring* contents) {
if (!frame)
return;
+ // Don't index any https pages. People generally don't want their bank
+ // accounts, etc. indexed on their computer, especially since some of these
+ // things are not marked cachable.
+ // TODO(brettw) we may want to consider more elaborate heuristics such as
+ // the cachability of the page. We may also want to consider subframes (this
+ // test will still index subframes if the subframe is SSL).
+ if (GURL(frame->url()).SchemeIsSecure())
+ return;
+
#ifdef TIME_TEXT_RETRIEVAL
double begin = time_util::GetHighResolutionTimeNow();
#endif
@@ -3079,6 +3079,17 @@ void RenderView::OnFind(int request_id, const string16& search_text,
}
}
+void RenderView::OnDeterminePageLanguage() {
+ if (is_loading_) {
+ // Wait for the page to finish loading before trying to determine the
+ // language.
+ determine_page_text_after_loading_stops_ = true;
+ return;
+ }
+
+ Send(new ViewHostMsg_PageLanguageDetermined(routing_id_, DetectLanguage()));
+}
+
std::string RenderView::DetectLanguage() {
if (!webview() || is_loading_)
return kUnknownLanguageCode;
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 3e178ce..4d3a4e9 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -956,6 +956,9 @@ class RenderView : public RenderWidget,
// Hopds a reference to the service which provides desktop notifications.
scoped_ptr<NotificationProvider> notification_provider_;
+ // Set to true if request for capturing page text has been made.
+ bool determine_page_text_after_loading_stops_;
+
// Holds state pertaining to a navigation that we initiated. This is held by
// the WebDataSource::ExtraData attribute. We use pending_navigation_state_
// as a temporary holder for the state until the WebDataSource corresponding
diff --git a/chrome/test/data/english_page.html b/chrome/test/data/english_page.html
deleted file mode 100644
index 539920d..0000000
--- a/chrome/test/data/english_page.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-<head><title>This page is in English</title></head>
-<body>
-No joke! This is a page written in English. Awesome don't you think?
-</body>
-</html>
diff --git a/chrome/test/data/french_page.html b/chrome/test/data/french_page.html
deleted file mode 100644
index 7fcf684..0000000
--- a/chrome/test/data/french_page.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-<head><title>Cette page est en Français</title></head>
-<body>
-Cette page a été rédigée en français. Saviez-vous que le Français est la langue officielle des jeux olympiques? Ça vous en bouche un coin, pas vrai?
-</body>
-</html>
diff --git a/chrome/test/ui_test_utils.cc b/chrome/test/ui_test_utils.cc
index e4b5818..6723084 100644
--- a/chrome/test/ui_test_utils.cc
+++ b/chrome/test/ui_test_utils.cc
@@ -254,33 +254,6 @@ class SimpleNotificationObserver : public NotificationObserver {
DISALLOW_COPY_AND_ASSIGN(SimpleNotificationObserver);
};
-class LanguageDetectionNotificationObserver : public NotificationObserver {
- public:
- explicit LanguageDetectionNotificationObserver(
- RenderViewHost* render_view_host) {
- registrar_.Add(this, NotificationType::TAB_LANGUAGE_DETERMINED,
- Source<RenderViewHost>(render_view_host));
- ui_test_utils::RunMessageLoop();
- }
-
- virtual void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- language_ = *(Details<std::string>(details).ptr());
- MessageLoopForUI::current()->Quit();
- }
-
- std::string language() const {
- return language_;
- }
-
- private:
- NotificationRegistrar registrar_;
- std::string language_;
-
- DISALLOW_COPY_AND_ASSIGN(LanguageDetectionNotificationObserver);
-};
-
class FindInPageNotificationObserver : public NotificationObserver {
public:
explicit FindInPageNotificationObserver(TabContents* parent_tab)
@@ -511,11 +484,6 @@ void WaitForFocusInBrowser(Browser* browser) {
browser);
}
-std::string WaitForLanguageDetection(TabContents* tab) {
- LanguageDetectionNotificationObserver observer(tab->render_view_host());
- return observer.language();
-}
-
int FindInPage(TabContents* tab_contents, const string16& search_string,
bool forward, bool match_case, int* ordinal) {
tab_contents->StartFinding(search_string, forward, match_case);
diff --git a/chrome/test/ui_test_utils.h b/chrome/test/ui_test_utils.h
index 2c4cd95..89dc8fc 100644
--- a/chrome/test/ui_test_utils.h
+++ b/chrome/test/ui_test_utils.h
@@ -115,10 +115,6 @@ void WaitForFocusChange(RenderViewHost* rvh);
// traversal).
void WaitForFocusInBrowser(Browser* browser);
-// Waits for the language of the page to have been detected and returns it.
-// This should be called right after a navigation notification was received.
-std::string WaitForLanguageDetection(TabContents* tab_contents);
-
// Performs a find in the page of the specified tab. Returns the number of
// matches found. |ordinal| is an optional parameter which is set to the index
// of the current match.