Skip to content

Commit

Permalink
Factor out OmahaQueryParams
Browse files Browse the repository at this point in the history
Add chrome version information to extension update checks.

BUG=72262

Review URL: https://chromiumcodereview.appspot.com/12396002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187266 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
jackhou@chromium.org committed Mar 11, 2013
1 parent 3008de2 commit faae55a
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 88 deletions.
63 changes: 3 additions & 60 deletions chrome/browser/component_updater/component_updater_configurator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#include "base/win/windows_version.h"
#include "build/build_config.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/omaha_query_params.h"
#include "net/url_request/url_request_context_getter.h"

namespace {
Expand Down Expand Up @@ -44,63 +44,6 @@ bool HasDebugValue(const std::vector<std::string>& vec, const char* test) {
return (std::find(vec.begin(), vec.end(), test) != vec.end());
}

// The request extra information is the OS and architecture, this helps
// the server select the right package to be delivered.
const char kExtraInfo[] =
#if defined(OS_MACOSX)
#if defined(__amd64__)
"os=mac&arch=x64&prod=chrome&prodversion=";
#elif defined(__i386__)
"os=mac&arch=x86&prod=chrome&prodversion=";
#else
#error "unknown mac architecture"
#endif
#elif defined(OS_WIN)
#if defined(_WIN64)
"os=win&arch=x64&prod=chrome&prodversion=";
#elif defined(_WIN32)
"os=win&arch=x86&prod=chrome&prodversion=";
#else
#error "unknown windows architecture"
#endif
#elif defined(OS_ANDROID)
#if defined(__i386__)
"os=android&arch=x86&prod=chrome&prodversion=";
#elif defined(__arm__)
"os=android&arch=arm&prod=chrome&prodversion=";
#else
"os=android&arch=unknown&prod=chrome&prodversion=";
#endif
#elif defined(OS_CHROMEOS)
#if defined(__i386__)
"os=cros&arch=x86&prod=chrome&prodversion=";
#elif defined(__arm__)
"os=cros&arch=arm&prod=chrome&prodversion=";
#else
"os=cros&arch=unknown&prod=chrome&prodversion=";
#endif
#elif defined(OS_LINUX)
#if defined(__amd64__)
"os=linux&arch=x64&prod=chrome&prodversion=";
#elif defined(__i386__)
"os=linux&arch=x86&prod=chrome&prodversion=";
#elif defined(__arm__)
"os=linux&arch=arm&prod=chrome&prodversion=";
#else
"os=linux&arch=unknown&prod=chrome&prodversion=";
#endif
#elif defined(OS_OPENBSD)
#if defined(__amd64__)
"os=openbsd&arch=x64";
#elif defined(__i386__)
"os=openbsd&arch=x86";
#else
"os=openbsd&arch=unknown";
#endif
#else
#error "unknown os or architecture"
#endif

} // namespace

class ChromeConfigurator : public ComponentUpdateService::Configurator {
Expand Down Expand Up @@ -132,7 +75,8 @@ class ChromeConfigurator : public ComponentUpdateService::Configurator {
ChromeConfigurator::ChromeConfigurator(const CommandLine* cmdline,
net::URLRequestContextGetter* url_request_getter)
: url_request_getter_(url_request_getter),
extra_info_(kExtraInfo) {
extra_info_(chrome::OmahaQueryParams::Get(
chrome::OmahaQueryParams::CHROME)) {
// Parse comma-delimited debug flags.
std::vector<std::string> debug_values;
Tokenize(cmdline->GetSwitchValueASCII(switches::kComponentUpdaterDebug),
Expand All @@ -142,7 +86,6 @@ ChromeConfigurator::ChromeConfigurator(const CommandLine* cmdline,

// Make the extra request params, they are necessary so omaha does
// not deliver components that are going to be rejected at install time.
extra_info_ += chrome::VersionInfo().Version();
#if defined(OS_WIN)
if (base::win::OSInfo::GetInstance()->wow64_status() ==
base::win::OSInfo::WOW64_ENABLED)
Expand Down
81 changes: 53 additions & 28 deletions chrome/browser/extensions/updater/extension_updater_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#include "chrome/common/extensions/extension_manifest_constants.h"
#include "chrome/common/extensions/manifest_handler.h"
#include "chrome/common/extensions/manifest_url_handler.h"
#include "chrome/common/omaha_query_params.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/browser/notification_details.h"
Expand Down Expand Up @@ -443,6 +444,33 @@ static void ExtractParameters(const std::string& params,
}
}

static void VerifyQueryAndExtractParameters(
const std::string& query,
std::map<std::string, std::string>* result) {
std::map<std::string, std::string> params;
ExtractParameters(query, &params);

chrome::OmahaQueryParams::ProdId prod =
#if defined(GOOGLE_CHROME_BUILD)
chrome::OmahaQueryParams::CHROMECRX;
#else
chrome::OmahaQueryParams::CHROMIUMCRX;
#endif
std::string omaha_params = chrome::OmahaQueryParams::Get(prod);
std::map<std::string, std::string> expected;
ExtractParameters(omaha_params, &expected);

for (std::map<std::string, std::string>::iterator it = expected.begin();
it != expected.end(); ++it) {
EXPECT_EQ(it->second, params[it->first]);
}

EXPECT_EQ(1U, params.count("x"));
std::string decoded = net::UnescapeURLComponent(
params["x"], net::UnescapeRule::URL_SPECIAL_CHARS);
ExtractParameters(decoded, result);
}

// All of our tests that need to use private APIs of ExtensionUpdater live
// inside this class (which is a friend to ExtensionUpdater).
class ExtensionUpdaterTest : public testing::Test {
Expand Down Expand Up @@ -554,16 +582,10 @@ class ExtensionUpdaterTest : public testing::Test {
EXPECT_EQ("/bar", url.path());

// Validate the extension request parameters in the query. It should
// look something like "?x=id%3D<id>%26v%3D<version>%26uc".
// look something like "x=id%3D<id>%26v%3D<version>%26uc".
EXPECT_TRUE(url.has_query());
std::vector<std::string> parts;
base::SplitString(url.query(), '=', &parts);
EXPECT_EQ(2u, parts.size());
EXPECT_EQ("x", parts[0]);
std::string decoded = net::UnescapeURLComponent(
parts[1], net::UnescapeRule::URL_SPECIAL_CHARS);
std::map<std::string, std::string> params;
ExtractParameters(decoded, &params);
VerifyQueryAndExtractParameters(url.query(), &params);
if (pending) {
EXPECT_TRUE(pending_extension_manager->IsIdPending(params["id"]));
EXPECT_EQ("0.0.0.0", params["v"]);
Expand Down Expand Up @@ -603,16 +625,10 @@ class ExtensionUpdaterTest : public testing::Test {
EXPECT_EQ("/service/update2/crx", url.path());

// Validate the extension request parameters in the query. It should
// look something like "?x=id%3D<id>%26v%3D<version>%26uc".
// look something like "x=id%3D<id>%26v%3D<version>%26uc".
EXPECT_TRUE(url.has_query());
std::vector<std::string> parts;
base::SplitString(url.query(), '=', &parts);
EXPECT_EQ(2u, parts.size());
EXPECT_EQ("x", parts[0]);
std::string decoded = net::UnescapeURLComponent(
parts[1], net::UnescapeRule::URL_SPECIAL_CHARS);
std::map<std::string, std::string> params;
ExtractParameters(decoded, &params);
VerifyQueryAndExtractParameters(url.query(), &params);
EXPECT_EQ("com.google.crx.blacklist", params["id"]);
EXPECT_EQ("0", params["v"]);
EXPECT_EQ("", params["uc"]);
Expand All @@ -627,9 +643,12 @@ class ExtensionUpdaterTest : public testing::Test {
// option to appear in the x= parameter.
ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0);
fetch_data.AddExtension(id, version, &kNeverPingedData, "", "");
EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"%26v%3D1.0%26uc",
fetch_data.full_url().spec());

std::map<std::string, std::string> params;
VerifyQueryAndExtractParameters(fetch_data.full_url().query(), &params);
EXPECT_EQ(id, params["id"]);
EXPECT_EQ(version, params["v"]);
EXPECT_EQ(0U, params.count("ap"));
}

void TestUpdateUrlDataSimple() {
Expand All @@ -640,9 +659,11 @@ class ExtensionUpdaterTest : public testing::Test {
// option to appear in the x= parameter.
ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0);
fetch_data.AddExtension(id, version, &kNeverPingedData, "bar", "");
EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"%26v%3D1.0%26uc%26ap%3Dbar",
fetch_data.full_url().spec());
std::map<std::string, std::string> params;
VerifyQueryAndExtractParameters(fetch_data.full_url().query(), &params);
EXPECT_EQ(id, params["id"]);
EXPECT_EQ(version, params["v"]);
EXPECT_EQ("bar", params["ap"]);
}

void TestUpdateUrlDataCompound() {
Expand All @@ -653,9 +674,11 @@ class ExtensionUpdaterTest : public testing::Test {
// option to appear in the x= parameter.
ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0);
fetch_data.AddExtension(id, version, &kNeverPingedData, "a=1&b=2&c", "");
EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"%26v%3D1.0%26uc%26ap%3Da%253D1%2526b%253D2%2526c",
fetch_data.full_url().spec());
std::map<std::string, std::string> params;
VerifyQueryAndExtractParameters(fetch_data.full_url().query(), &params);
EXPECT_EQ(id, params["id"]);
EXPECT_EQ(version, params["v"]);
EXPECT_EQ("a%3D1%26b%3D2%26c", params["ap"]);
}

void TestUpdateUrlDataFromGallery(const std::string& gallery_url) {
Expand Down Expand Up @@ -695,9 +718,11 @@ class ExtensionUpdaterTest : public testing::Test {
ManifestFetchData fetch_data(GURL("http://localhost/foo"), 0);
fetch_data.AddExtension(id, version, &kNeverPingedData,
kEmptyUpdateUrlData, install_source);
EXPECT_EQ("http://localhost/foo\?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"%26v%3D1.0%26installsource%3Dinstally%26uc",
fetch_data.full_url().spec());
std::map<std::string, std::string> params;
VerifyQueryAndExtractParameters(fetch_data.full_url().query(), &params);
EXPECT_EQ(id, params["id"]);
EXPECT_EQ(version, params["v"]);
EXPECT_EQ(install_source, params["installsource"]);
}

void TestDetermineUpdates() {
Expand Down
14 changes: 14 additions & 0 deletions chrome/browser/extensions/updater/manifest_fetch_data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/google/google_util.h"
#include "chrome/browser/metrics/metrics_service.h"
#include "chrome/common/omaha_query_params.h"
#include "net/base/escape.h"

namespace {
Expand All @@ -27,6 +28,19 @@ namespace extensions {
ManifestFetchData::ManifestFetchData(const GURL& update_url, int request_id)
: base_url_(update_url),
full_url_(update_url) {
chrome::OmahaQueryParams::ProdId prod =
#if defined(GOOGLE_CHROME_BUILD)
chrome::OmahaQueryParams::CHROMECRX;
#else
chrome::OmahaQueryParams::CHROMIUMCRX;
#endif
std::string query = full_url_.has_query() ?
full_url_.query() + "&" : std::string();
query += chrome::OmahaQueryParams::Get(prod);
GURL::Replacements replacements;
replacements.SetQueryStr(query);
full_url_ = full_url_.ReplaceComponents(replacements);

request_ids_.insert(request_id);
}

Expand Down
2 changes: 2 additions & 0 deletions chrome/chrome_common.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,8 @@
'common/nacl_messages.h',
'common/nacl_types.cc',
'common/nacl_types.h',
'common/omaha_query_params.cc',
'common/omaha_query_params.h',
'common/one_click_signin_messages.h',
'common/password_generation_util.cc',
'common/password_generation_util.h',
Expand Down
102 changes: 102 additions & 0 deletions chrome/common/omaha_query_params.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
// Copyright (c) 2012 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/common/omaha_query_params.h"

#include "base/stringprintf.h"
#include "chrome/common/chrome_version_info.h"

namespace {

const char kUnknown[] = "unknown";

// The request extra information is the OS and architecture, this helps
// the server select the right package to be delivered.
const char kOs[] =
#if defined(OS_MACOSX)
"mac";
#elif defined(OS_WIN)
"win";
#elif defined(OS_ANDROID)
"android";
#elif defined(OS_CHROMEOS)
"cros";
#elif defined(OS_LINUX)
"linux";
#elif defined(OS_OPENBSD)
"openbsd";
#else
#error "unknown os"
#endif

const char kArch[] =
#if defined(__amd64__) || defined(_WIN64)
"x64";
#elif defined(__i386__) || defined(_WIN32)
"x86";
#elif defined(__arm__)
"arm";
#else
#error "unknown arch"
#endif

const char kChrome[] = "chrome";
const char kChromeCrx[] = "chromecrx";
const char kChromiumCrx[] = "chromiumcrx";

const char* GetProdIdString(chrome::OmahaQueryParams::ProdId prod) {
switch (prod) {
case chrome::OmahaQueryParams::CHROME:
return kChrome;
break;
case chrome::OmahaQueryParams::CHROMECRX:
return kChromeCrx;
break;
case chrome::OmahaQueryParams::CHROMIUMCRX:
return kChromiumCrx;
break;
}
return kUnknown;
}

const char kStable[] = "stable";
const char kBeta[] = "beta";
const char kDev[] = "dev";
const char kCanary[] = "canary";

const char* GetChannelString() {
switch (chrome::VersionInfo::GetChannel()) {
case chrome::VersionInfo::CHANNEL_STABLE:
return kStable;
break;
case chrome::VersionInfo::CHANNEL_BETA:
return kBeta;
break;
case chrome::VersionInfo::CHANNEL_DEV:
return kDev;
break;
case chrome::VersionInfo::CHANNEL_CANARY:
return kCanary;
break;
case chrome::VersionInfo::CHANNEL_UNKNOWN:
return kUnknown;
break;
}
return kUnknown;
}

} // namespace

namespace chrome {

std::string OmahaQueryParams::Get(ProdId prod) {
return StringPrintf("os=%s&arch=%s&prod=%s&prodchannel=%s&prodversion=%s",
kOs,
kArch,
GetProdIdString(prod),
GetChannelString(),
chrome::VersionInfo().Version().c_str());
}

} // namespace chrome
Loading

0 comments on commit faae55a

Please sign in to comment.