Как создается идентификатор расширения Chrome для распакованного расширения?
Я хотел бы поделиться распакованным расширением с моими коллегами. Использует метод chrome.runtime.sendMessage(string extensionId, any message, object options, function responseCallback)
во введенном сценарии. Для этого мне нужно знать идентификатор расширения заранее.
Будут ли идентификаторы расширения распакованного расширения отличаться в разных системах, или я могу жестко написать код, найденный в моем меню расширений?
1 ответ
В то время как я ссылался на этот вопрос, который объясняет, как "закрепить" идентификатор распакованного расширения, что решило бы практическую проблему, с которой сталкивается OP, сам вопрос (как указано в заголовке) интересен.
Если мы посмотрим на источник Chromium, то увидим, что идентификатор - это просто хэш SHA (возможно, нормализованный, что бы это ни значило) абсолютного пути к расширению. Основные моменты из кода:
// Copyright 2014 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.
// chromium/src/chrome/browser/extensions/unpacked_installer.cc
int UnpackedInstaller::GetFlags() {
std::string id = crx_file::id_util::GenerateIdForPath(extension_path_);
/* ... */
}
// chromium/src/components/crx_file/id_util.cc
std::string GenerateIdForPath(const base::FilePath& path) {
base::FilePath new_path = MaybeNormalizePath(path);
std::string path_bytes =
std::string(reinterpret_cast<const char*>(new_path.value().data()),
new_path.value().size() * sizeof(base::FilePath::CharType));
return GenerateId(path_bytes);
}
std::string GenerateId(const std::string& input) {
uint8 hash[kIdSize];
crypto::SHA256HashString(input, hash, sizeof(hash));
std::string output =
base::StringToLowerASCII(base::HexEncode(hash, sizeof(hash)));
ConvertHexadecimalToIDAlphabet(&output);
return output;
}
Таким образом, он должен зависеть ТОЛЬКО от абсолютного пути файловой системы к папке расширения.
Ксан ответил правильно. Однако, чтобы расширить его для справки, основанной на приведенном выше коде Chromium, можно вычислить идентификатор расширения с помощью этого кода Python.
import hashlib
m = hashlib.sha256()
m.update(bytes(PATH.encode('utf-8')))
EXTID = ''.join([chr(int(i, base=16) + ord('a')) for i in m.hexdigest()][:32])
MaybeNormalizePath влияет на вариант использования Windows:
base::FilePath MaybeNormalizePath(const base::FilePath& path) {
#if defined(OS_WIN)
// Normalize any drive letter to upper-case. We do this for consistency with
// net_utils::FilePathToFileURL(), which does the same thing, to make string
// comparisons simpler.
base::FilePath::StringType path_str = path.value();
if (path_str.size() >= 2 && path_str[0] >= L'a' && path_str[0] <= L'z' &&
path_str[1] == L':')
path_str[0] = towupper(path_str[0]);
return base::FilePath(path_str);
#else
return path;
#endif
}
https://chromium.googlesource.com/chromium/chromium/+/refs/heads/trunk/extensions/common/id_util.cc