| Index: chrome/browser/extensions/extension.cc
 | 
| diff --git a/chrome/browser/extensions/extension.cc b/chrome/browser/extensions/extension.cc
 | 
| index d8ab40379d0c0fde26f59ff8b724fc6bde4ea053..1aeaeaab67229608fc479c79caf011ac1a3cb298 100644
 | 
| --- a/chrome/browser/extensions/extension.cc
 | 
| +++ b/chrome/browser/extensions/extension.cc
 | 
| @@ -103,21 +103,6 @@ Extension::Extension(const Extension& rhs)
 | 
|        theme_paths_(rhs.theme_paths_) {
 | 
|  }
 | 
|  
 | 
| -const GURL& Extension::url() {
 | 
| -  if (!extension_url_.is_valid())
 | 
| -    extension_url_ = GURL(std::string(chrome::kExtensionScheme) +
 | 
| -                          chrome::kStandardSchemeSeparator + id_ + "/");
 | 
| -
 | 
| -  return extension_url_;
 | 
| -}
 | 
| -
 | 
| -void Extension::set_id(const std::string& id) {
 | 
| -  id_ = id;
 | 
| -
 | 
| -  // Reset url_ so that it gets reinitialized next time.
 | 
| -  extension_url_ = GURL();
 | 
| -}
 | 
| -
 | 
|  const std::string Extension::VersionString() const {
 | 
|    return version_->GetString();
 | 
|  }
 | 
| @@ -335,10 +320,9 @@ bool Extension::LoadUserScriptHelper(const DictionaryValue* content_script,
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| -bool Extension::InitFromValue(const DictionaryValue& source,
 | 
| +bool Extension::InitFromValue(const DictionaryValue& source, bool require_id,
 | 
|                                std::string* error) {
 | 
| -  // Initialize id. The ID is not required here because we don't require IDs for
 | 
| -  // extensions used with --load-extension.
 | 
| +  // Initialize id.
 | 
|    if (source.HasKey(kIdKey)) {
 | 
|      if (!source.GetString(kIdKey, &id_)) {
 | 
|        *error = kInvalidIdError;
 | 
| @@ -356,8 +340,23 @@ bool Extension::InitFromValue(const DictionaryValue& source,
 | 
|        *error = kInvalidIdError;
 | 
|        return false;
 | 
|      }
 | 
| +  } else if (require_id) {
 | 
| +    *error = kInvalidIdError;
 | 
| +    return false;
 | 
| +  } else {
 | 
| +    // Generate a random ID
 | 
| +    static int counter = 0;
 | 
| +    id_ = StringPrintf("%x", counter);
 | 
| +    ++counter;
 | 
| +
 | 
| +    // pad the string out to 40 chars with zeroes.
 | 
| +    id_.insert(0, 40 - id_.length(), '0');
 | 
|    }
 | 
|  
 | 
| +  // Initialize the URL.
 | 
| +  extension_url_ = GURL(std::string(chrome::kExtensionScheme) +
 | 
| +                        chrome::kStandardSchemeSeparator + id_ + "/");
 | 
| +
 | 
|    // Initialize version.
 | 
|    std::string version_str;
 | 
|    if (!source.GetString(kVersionKey, &version_str)) {
 | 
| @@ -457,6 +456,7 @@ bool Extension::InitFromValue(const DictionaryValue& source,
 | 
|        UserScript script;
 | 
|        if (!LoadUserScriptHelper(content_script, i, error, &script))
 | 
|          return false;  // Failed to parse script context definition
 | 
| +      script.set_extension_id(id());
 | 
|        content_scripts_.push_back(script);
 | 
|      }
 | 
|    }
 | 
| 
 |