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

Unified Diff: chrome/browser/translate/translate_tab_helper.cc

Issue 187393005: Make it possible to read CLD data from a file (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase onto the CLD2 deps roll change, update readme Created 6 years, 9 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/translate/translate_tab_helper.cc
diff --git a/chrome/browser/translate/translate_tab_helper.cc b/chrome/browser/translate/translate_tab_helper.cc
index bae7a5984c1eafd9be8b712c9d2192326930bed0..86aeb0c561c8f4ba20ef67bf8f76766aa3f36edb 100644
--- a/chrome/browser/translate/translate_tab_helper.cc
+++ b/chrome/browser/translate/translate_tab_helper.cc
@@ -4,6 +4,8 @@
#include "chrome/browser/translate/translate_tab_helper.h"
+#include "base/path_service.h"
+#include "base/platform_file.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/translate/translate_accept_languages_factory.h"
@@ -15,6 +17,7 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/translate/translate_bubble_factory.h"
+#include "chrome/common/chrome_paths.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/render_messages.h"
#include "components/translate/core/browser/page_translated_details.h"
@@ -22,6 +25,8 @@
#include "components/translate/core/browser/translate_prefs.h"
#include "components/translate/core/common/language_detection_details.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
DEFINE_WEB_CONTENTS_USER_DATA_KEY(TranslateTabHelper);
@@ -112,6 +117,7 @@ bool TranslateTabHelper::OnMessageReceived(const IPC::Message& message) {
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_TranslateLanguageDetermined,
OnLanguageDetermined)
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_PageTranslated, OnPageTranslated)
+ IPC_MESSAGE_HANDLER(ChromeViewHostMsg_NeedCLDData, OnCLDDataRequested)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
@@ -133,6 +139,59 @@ void TranslateTabHelper::WebContentsDestroyed(
translate_manager_.reset();
}
+// TODO(andrewhayden): It's annoying that during download of the data file,
+// multiple renderers may be calling this method repeatedly, but there's not
+// an obviously-better choice from a complexity standpoint: we have no idea
+// if or when the file will become available, and the check is cheap.
+void TranslateTabHelper::OnCLDDataRequested() {
+ static base::PlatformFile cached_platform_file = 0;
+ const int routing_id = GetWebContents()->GetRenderViewHost()->GetRoutingID();
+
+ // If we have cached the platform file, we reuse it. Else, we cache it now.
+ if (cached_platform_file == 0) {
+ // First, grab a reference to the user data directory
+ base::FilePath path;
+ if (!PathService::Get(chrome::DIR_USER_DATA, &path)) {
+ NOTREACHED();
jochen (gone - plz use gerrit) 2014/03/12 13:08:27 i don't think this if () { NOTREACHED(); } adds mu
Andrew Hayden (chromium.org) 2014/03/13 16:39:48 Done.
+ }
+
+ // Now derive the name of the CLD data file that we are looking for.
+ path = path.Append(chrome::kCLDDataFilename);
+
+ // If the file exists, we can send an IPC-safe construct back to the
+ // renderer process immediately. If not (e.g., the file is being downloaded
+ // right now), then we will do nothing. It is up to the renderer process
+ // to call us again later.
+ if (!base::PathExists(path)) {
+ return;
jochen (gone - plz use gerrit) 2014/03/12 13:08:27 no { }
Andrew Hayden (chromium.org) 2014/03/13 16:39:48 Done.
+ }
+
+ // Attempt to open the file for reading.
+ int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ;
+ bool created = false;
+ base::PlatformFileError error;
+ cached_platform_file = base::CreatePlatformFile(
+ path, flags, &created, &error);
+ DCHECK(created == false);
jochen (gone - plz use gerrit) 2014/03/12 13:08:27 !created
Andrew Hayden (chromium.org) 2014/03/13 16:39:48 Done.
+ if (error != base::PLATFORM_FILE_OK) {
+ cached_platform_file = 0;
+ DCHECK(false) << "Failed to open CLD data file, error code=" << error;
jochen (gone - plz use gerrit) 2014/03/12 13:08:27 is it really necessary to crash here?
Andrew Hayden (chromium.org) 2014/03/13 16:39:48 No, it isn't. I just put a comment in the code ins
+ return;
+ }
+ }
+
+ // Get a handle to the renderer process for IPC.
+ base::ProcessHandle rendererProcessHandle =
+ GetWebContents()->GetRenderViewHost()->GetProcess()->GetHandle();
+ // Prepare a file handle for transit to that renderer process.
+ IPC::PlatformFileForTransit ipcPlatformFile = IPC::GetFileHandleForProcess(
+ cached_platform_file,
+ rendererProcessHandle,
+ false);
+ // Send the file handle to the renderer via IPC. We're done!
+ Send(new ChromeViewMsg_CLDDataAvailable(routing_id, ipcPlatformFile));
+}
+
void TranslateTabHelper::OnLanguageDetermined(
const LanguageDetectionDetails& details,
bool page_needs_translation) {

Powered by Google App Engine
This is Rietveld 408576698