2014-09-26 2 views
2

Я хотел бы поделиться с моими коллегами распакованным расширением. Он использует метод chrome.runtime.sendMessage(string extensionId, any message, object options, function responseCallback) в инъецированном скрипте. Для этого мне нужно знать идентификатор расширения заранее.Как генерируется идентификатор расширения Chrome для распакованного расширения?

Будет ли идентификатор расширения неупакованного расширения будет отличаться в разных системах или я могу записать код, который я нашел в своем расширенном меню?

+1

Возможный дубликат [Получение идентификатора расширения Chrome для разработки] (http://stackoverflow.com/questions/23873623/obiving-chrome-extension-id-for-development) – Xan

+1

Тем не менее, вы даже это сделали? Вы имеете в виду, с помощью вложенного скрипта, введенного в содержание страницы? – Xan

+0

Я вставляю скрипт, выполняя следующий JavaScript: «var s = document.createElement (« script »); s.src = chrome.extension.getURL ("api.js"); 'потому что мне нужен сценарий для доступа к объекту' window' на любой странице, на которую он вводится. –

ответ

9

В то время как я связан с this question, который объясняет, как «прикрепить» идентификатор для распакованного расширения, что бы решить практические задачи OP-грани, сам вопрос (как указано в названии) интересен.

Если мы посмотрим на Chromium source, мы увидим, что идентификатор - это просто 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; 
} 

Как таковая, она должна зависеть только от абсолютной файловой системы путь к папке расширения.

Смежные вопросы