| Index: chrome/browser/translate/translate_script.cc
|
| diff --git a/chrome/browser/translate/translate_script.cc b/chrome/browser/translate/translate_script.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..41ebdd68a337d28f3e4d8fca997cd3eb1a4cc7ff
|
| --- /dev/null
|
| +++ b/chrome/browser/translate/translate_script.cc
|
| @@ -0,0 +1,121 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/translate/translate_script.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/command_line.h"
|
| +#include "base/logging.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "chrome/browser/translate/translate_url_fetcher.h"
|
| +#include "chrome/browser/translate/translate_url_util.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "google_apis/google_api_keys.h"
|
| +#include "grit/browser_resources.h"
|
| +#include "net/base/escape.h"
|
| +#include "net/base/url_util.h"
|
| +#include "ui/base/resource/resource_bundle.h"
|
| +
|
| +namespace {
|
| +
|
| +const int kExpirationDelayDays = 1;
|
| +
|
| +const char kScriptURL[] =
|
| + "https://translate.google.com/translate_a/element.js";
|
| +const char kRequestHeader[] = "Google-Translate-Element-Mode: library";
|
| +const int kFetcherId = 0;
|
| +
|
| +// Used in kTranslateScriptURL to specify a callback function name.
|
| +const char kCallbackQueryName[] = "cb";
|
| +const char kCallbackQueryValue[] =
|
| + "cr.googleTranslate.onTranslateElementLoad";
|
| +
|
| +} // namespace
|
| +
|
| +TranslateScript::TranslateScript()
|
| + : weak_method_factory_(this),
|
| + expiration_delay_(base::TimeDelta::FromDays(kExpirationDelayDays)) {
|
| +}
|
| +
|
| +TranslateScript::~TranslateScript() {
|
| + weak_method_factory_.InvalidateWeakPtrs();
|
| +}
|
| +
|
| +void TranslateScript::Request(const Callback& callback) {
|
| + if (fetcher_.get() != NULL) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| +
|
| + callback_ = callback;
|
| +
|
| + GURL translate_script_url;
|
| + // Check if command-line contains an alternative URL for translate service.
|
| + const CommandLine& command_line = *CommandLine::ForCurrentProcess();
|
| + if (command_line.HasSwitch(switches::kTranslateScriptURL)) {
|
| + translate_script_url = GURL(
|
| + command_line.GetSwitchValueASCII(switches::kTranslateScriptURL));
|
| + if (!translate_script_url.is_valid() ||
|
| + !translate_script_url.query().empty()) {
|
| + LOG(WARNING) << "The following translate URL specified at the "
|
| + << "command-line is invalid: "
|
| + << translate_script_url.spec();
|
| + translate_script_url = GURL();
|
| + }
|
| + }
|
| +
|
| + // Use default URL when command-line argument is not specified, or specified
|
| + // URL is invalid.
|
| + if (translate_script_url.is_empty())
|
| + translate_script_url = GURL(kScriptURL);
|
| +
|
| + translate_script_url = net::AppendQueryParameter(
|
| + translate_script_url,
|
| + kCallbackQueryName,
|
| + kCallbackQueryValue);
|
| +
|
| + translate_script_url =
|
| + TranslateURLUtil::AddHostLocaleToUrl(translate_script_url);
|
| + translate_script_url =
|
| + TranslateURLUtil::AddApiKeyToUrl(translate_script_url);
|
| +
|
| + fetcher_.reset(new TranslateURLFetcher(kFetcherId));
|
| + fetcher_->set_extra_request_header(kRequestHeader);
|
| + fetcher_->Request(
|
| + translate_script_url,
|
| + base::Bind(&TranslateScript::OnScriptFetchComplete,
|
| + base::Unretained(this)));
|
| +}
|
| +
|
| +
|
| +void TranslateScript::OnScriptFetchComplete(
|
| + int id, bool success, const std::string& data) {
|
| + DCHECK_EQ(kFetcherId, id);
|
| +
|
| + scoped_ptr<const TranslateURLFetcher> delete_ptr(fetcher_.release());
|
| +
|
| + if (success) {
|
| + base::StringPiece str = ResourceBundle::GetSharedInstance().
|
| + GetRawDataResource(IDR_TRANSLATE_JS);
|
| + DCHECK(data_.empty());
|
| + str.CopyToString(&data_);
|
| + std::string argument = "('";
|
| + std::string api_key = google_apis::GetAPIKey();
|
| + argument += net::EscapeQueryParamValue(api_key, true);
|
| + argument += "');\n";
|
| + data_ += argument + data;
|
| +
|
| + // We'll expire the cached script after some time, to make sure long
|
| + // running browsers still get fixes that might get pushed with newer
|
| + // scripts.
|
| + base::MessageLoop::current()->PostDelayedTask(
|
| + FROM_HERE,
|
| + base::Bind(&TranslateScript::Clear,
|
| + weak_method_factory_.GetWeakPtr()),
|
| + expiration_delay_);
|
| + }
|
| +
|
| + callback_.Run(success, data);
|
| +}
|
|
|