Chrome extension的类型
发布于 2017-04-22
Chrome中的extension概念跟我们一般想的不一样,除了一般的extension,比如广告过过滤extension是属于extension,其实Chrome中的theme也是属于extension。另外随着extension系统的发展,类型的定义也会发生改变。
Extension类型的定义
我们可以在代码extensions\common\manifest.h中查看Manifest::Type的定义:
enum Type {
TYPE_UNKNOWN = 0,
TYPE_EXTENSION,
TYPE_THEME,
TYPE_USER_SCRIPT,
TYPE_HOSTED_APP,
// This is marked legacy because platform apps are preferred. For
// backwards compatibility, we can't remove support for packaged apps
TYPE_LEGACY_PACKAGED_APP,
TYPE_PLATFORM_APP,
TYPE_SHARED_MODULE,
// New enum values must go above here.
NUM_LOAD_TYPES
};
此外我们可也以从代码extensions\common\api\management.json中可以看到ExtensionType的定义:
{
"id": "ExtensionType",
"description": "The type of this extension, app, or theme.",
"type": "string",
"enum": ["extension", "hosted_app", "packaged_app", "legacy_packaged_app", "theme"]
},
这两处对于extension类型的定义有些差异,management.json定义渐渐废弃,以manifest.h中的定义为准。
Extension类型的判断
判断一个extension类型是看extensions\common\extension.h中的判断逻辑:
// Type-related queries.
bool is_app() const;
bool is_platform_app() const;
bool is_hosted_app() const;
bool is_legacy_packaged_app() const;
bool is_extension() const;
bool is_shared_module() const;
bool is_theme() const;
Extension最后还是调用Manifest中的逻辑:
bool is_theme() const { return type_ == TYPE_THEME; }
bool is_app() const {
return is_legacy_packaged_app() || is_hosted_app() || is_platform_app();
}
bool is_platform_app() const { return type_ == TYPE_PLATFORM_APP; }
bool is_hosted_app() const { return type_ == TYPE_HOSTED_APP; }
bool is_legacy_packaged_app() const {
return type_ == TYPE_LEGACY_PACKAGED_APP;
}
bool is_extension() const { return type_ == TYPE_EXTENSION; }
bool is_shared_module() const { return type_ == TYPE_SHARED_MODULE; }
在Manifest构造函数中:
if (value_->HasKey(keys::kTheme)) {
type_ = TYPE_THEME;
} else if (value_->HasKey(keys::kExport)) {
type_ = TYPE_SHARED_MODULE;
} else if (value_->HasKey(keys::kApp)) {
if (value_->Get(keys::kWebURLs, NULL) ||
value_->Get(keys::kLaunchWebURL, NULL)) {
type_ = TYPE_HOSTED_APP;
} else if (value_->Get(keys::kPlatformAppBackground, NULL)) {
type_ = TYPE_PLATFORM_APP;
} else {
type_ = TYPE_LEGACY_PACKAGED_APP;
}
} else {
type_ = TYPE_EXTENSION;
}
CHECK_NE(type_, TYPE_UNKNOWN);
可以看到extension类型的判断逻辑:
theme
类型为Manifest::Type::TYPE_THEME的extension就是一个theme(主题),它可以改变浏览器的外观。theme通常不会包含有html和js等代码。具体可以看看这里的介绍https://developer.chrome.com/extensions/themes。
shared_module
shared_module类型很少见。
app
app包含三种类型,platform_app、hosted_app、legacy_packaged_app。2016年Chrome宣布将不再支持app类型了。app与extension最大的差别是app可以具有独立于浏览器的窗口界面。app相比extension可以获取到更多的权限,能够实现更加强大的功能。
extension
我们在Chrome网上应用店里面下载到扩展程序都是属于extension,这也是最常见的,如下图: