- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经构建了一个 Chrome 扩展,我已经使用 Selenium 将它安装到 Chrome 中。
现在我想从源代码构建我自己的 Chromium,这样我的扩展就被预先捆绑到构建的分布式包中,这样我就不必担心需要 Selenium 为我的用例安装 CRX 文件。
我找到了几个论坛,人们建议他们尝试这个,但没有一个最终看起来像是成功的。
我发现了一些关于系统管理员如何为网络中的用户强制安装扩展到 Chrome 的提示:https://support.google.com/chrome/a/answer/6306504?hl=en
但那是针对 chrome 企业的,可能对我没有用。
Here is another post which talks about how to offline install chrome extensions .我也许可以使用其中的一些来实现我想要的。
有没有人成功地将 CRX 嵌入到 Chromium 中,以便 CRX 自动安装?
快速更新:
我只想注意:我正在使用 InnoSetup 安装程序安装我的自定义版本的 chrome。所以我确实有机会在安装我的 Chromium fork 后,在安装后执行一些自定义执行步骤。我的扩展程序托管在 chrome 网上商店并获得批准。
因此,如果有某种方法可以以编程方式将 chrome 扩展程序从网上商店安装到 Chromium 安装中,我会很容易地使用它。
最佳答案
这已经在我们的 Chromium fork 版本中进行了测试 66.0.3359.139 to 7x.x.x
在 Windows 10 上。 Linux 和 macOS 的扩展捆绑过程可能不同。我还试图使完成这项任务尽可能容易。要完成此操作,您必须执行以下操作:
src\chrome\browser\extensions\default_extensions\BUILD.gn
文件。假设
tab_capture.crx
是您的扩展名,那么它的内容应该是这样的:
if (is_win) {
copy("default_extensions") {
sources = [
"external_extensions.json",
"tab_capture.crx"
]
outputs = [
"$root_out_dir/extensions/{{source_file_part}}",
]
我刚刚添加了
tab_capture.crx
并且没有修改任何其他东西。
src\chrome\browser\extensions\default_extensions\tab_capture.crx
2:每个扩展都有一个由 Chromium 分配给它的唯一 ID,以标识该扩展。要查找您的分机 ID,您应该转到
chrome://extensions/
页面并拖放您的
crx
文件。应弹出一个确认对话框。点击
Add extension
按钮并确保
Developer mode
已启用,那么您的 ID 应该可见,但扩展程序将被禁用,如下所示:
src\extensions\common\extension.h
namespace extensions {
extern const int kOurNumExtensions;
extern const char* kOurExtensionIds[];
extern const char* kOurExtensionFilenames[];
我刚刚在
extensions
下声明了这些变量命名空间。请记住,我们在下面分配的扩展 ID 必须与 Chromium 分配的扩展 ID 匹配。
src\extensions\common\extension.cc
namespace extensions {
const char* kOurExtensionIds[] = {
"aaaaaaaaaaaaaaaaaaaaaaaaaaa"}; // Assumed extension ID of tab_capture
const char* kOurExtensionFilenames[] = {
"tab_capture.crx"};
const int kOurNumExtensions = 1;
Chromium 将在首次启动时创建一个配置文件。所以我们假设还没有配置文件存在,因为我们将在它第一次启动时在运行时安装我们的扩展。 Windows 机器上的配置文件通常应存在于此处:
C:\Users\Username\AppData\Local\CompanyName\ChromiumForkName
所以一定要删除
CompanyName
启动 Chromium 之前的文件夹。当然,我们也可以在创建配置文件后执行安装过程。为此,您必须检查我们的扩展是否已安装,以防止多次尝试安装。
src\chrome\browser\ui\startup\startup_browser_creator.cc
所以我们在配置文件初始化和浏览器启动后安装这个扩展。您还必须添加一些头文件。我们将在
LaunchBrowser
中这样做方法:
// Add these header files cause we we will be using them
#include "base/path_service.h"
#include "chrome/browser/extensions/crx_installer.h"
#include "chrome/browser/extensions/extension_install_prompt.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/common/chrome_paths.h"
#include "extensions/browser/extension_system.h"
bool StartupBrowserCreator::LaunchBrowser(
const base::CommandLine& command_line,
Profile* profile,
const base::FilePath& cur_dir,
chrome::startup::IsProcessStartup process_startup,
chrome::startup::IsFirstRun is_first_run) {
// Omitted Chromium code
in_synchronous_profile_launch_ = false;
}
// Install our extension
base::FilePath extension_dir;
if (first_run::IsChromeFirstRun() &&
base::PathService::Get(chrome::DIR_EXTERNAL_EXTENSIONS, &extension_dir))
{
for (int i = 0; i < extensions::kOurNumExtensions; ++i) {
base::FilePath file_to_install(extension_dir.AppendASCII(
extensions::kOurExtensionFilenames[i]));
std::unique_ptr<ExtensionInstallPrompt> prompt(
new ExtensionInstallPrompt(chrome::FindBrowserWithProfile(profile)->tab_strip_model()->GetActiveWebContents()));
scoped_refptr<extensions::CrxInstaller> crx_installer(extensions::CrxInstaller::Create(
extensions::ExtensionSystem::Get(profile)->extension_service(), std::move(prompt)));
crx_installer->set_error_on_unsupported_requirements(true);
crx_installer->set_off_store_install_allow_reason(
extensions::CrxInstaller::OffStoreInstallAllowedFromSettingsPage);
crx_installer->set_install_immediately(true);
crx_installer->InstallCrx(file_to_install);
}
}
// End of install our extension
// Chromium code
profile_launch_observer.Get().AddLaunched(profile);
这应该安装我们的扩展,但由于我们希望我们的扩展在没有任何用户交互的情况下被强制安装,让我们在这里做:
chrome/browser/extensions/extension_install_prompt.cc
void ExtensionInstallPrompt::ShowDialog(
const DoneCallback& done_callback,
const Extension* extension,
const SkBitmap* icon,
std::unique_ptr<Prompt> prompt,
std::unique_ptr<const PermissionSet> custom_permissions,
const ShowDialogCallback& show_dialog_callback) {
// Chromium code
return;
}
// Don't show add extension prompt for our extensions
for (int i = 0; i < extensions::kOurNumExtensions; ++i) {
if (extension->id() == extensions::kOurExtensionIds[i]) {
// Note: The line below won't work in recent versions of Chromium. So if you are using a recent version then use the code just below it instead of this one
base::ResetAndReturn(&done_callback_).Run(
Result::ACCEPTED);
// Note: For recent versions of Chromium. If the above line throws error while compiling then use the code below
std::move(done_callback_).Run(
DoneCallbackPayload(Result::ACCEPTED));
return;
}
}
// End of don't show add extension prompt for our extensions
// Chromium code
LoadImageIfNeeded();
4:即使我们自动执行安装过程,Chromium 也会禁用我们的扩展程序,因为它不是从 Chrome 网上应用店安装的。在这里处理:
src\chrome\browser\extensions\install_verifier.cc
在这种方法中:
bool InstallVerifier::MustRemainDisabled(const Extension* extension,
disable_reason::DisableReason* reason,
base::string16* error) const {
// Omitted Chromium code
// Chromium code
if (Manifest::IsUnpackedLocation(extension->location())) {
MustRemainDisabledHistogram(UNPACKED);
return false;
}
// Always enable our tab capture extension
// Use loop if you have more than one extension
if (extension->id() == extensions::kOurExtensionIds[0]) {
return false;
}
// End of always enable our tab capture extension
// Chromium code
if (extension->location() == Manifest::COMPONENT) {
MustRemainDisabledHistogram(COMPONENT);
return false;
}
这将确保在我们绕过 Chrome 网上应用店检查时启用我们的扩展程序。
chrome/browser/extensions/standard_management_policy_provider.cc
并修改这些方法:
MustRemainInstalled
和
MustRemainEnabled
5:现在您可以通过执行此命令来构建迷你安装程序
ninja -C out\BuildFolder mini_installer
上面的命令将构建
mini_installer.exe
.
备注 如果您通过
--system-level
论据
mini_installer.exe
那么它应该在
Program files
中安装你的 Chromium fork文件夹。安装完成后,您的 crx 文件应位于此处:
C:\Program Files (x86)\YourChromium\Application\66.0.3359.139\Extensions\tab_capture.crx
.
C:\Users\Username\AppData\Local\YourChromium\User Data\Default\Extensions
(假设默认配置文件)
关于c++ - 在 Chromium 中构建 Chrome 扩展的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50125821/
非常简单的问题 - 是否可以通过 Chromium 创建 google chrome 扩展,并让在不同操作系统上运行 Chrome 的人使用相同的扩展? 我正在Ubuntu上开发。 最佳答案 是的,完
我了解 chrome.bookmarks API(记录在 http://goo.gl/tIb6V6 )旨在用于开发访问/操作我的 Chrome 书签的 Chrome 扩展程序(当然要在 Chrome
在比较开源浏览器 Firefox 和 Chromium 的扩展、附加组件和列表时,我试图找到一些有趣的数据。 我感兴趣的是多宿主扩展(两个浏览器列表上都可用的扩展)。 但是当浏览 Chromium 扩
使用新的 chrome.notifications API,我无法从我的扩展程序中获取通知以显示。即使是最基本的通知也无法为我显示,但我没有收到任何错误,并且回调函数已正确执行。 list .json
我正在构建一个在 Chrome 上运行的信息亭媒体,可以播放带音频的视频。我知道默认情况下,chrome 只允许自动播放带有静音 Prop 的视频。 而且我知道我可以通过 chrome://flags
我从来没有真正写过 真实 Chrome 扩展程序。不久前我做了一个只是一个链接下拉列表,但这并不重要。无论如何,与其先回到关于编写 Chrome 扩展程序的大量教程中,不如先确保我的想法是可行的。 我
主要目的是在单个容器中运行多个 chrome 浏览器(9 个浏览器)。 我有一个集线器和节点设置,其中包含多个浏览器的容器,可在单个 chrome 节点容器中运行。我使用以下 docker 命令创建了
我想写一个小的 chrome 扩展程序,它应该从网页 A(当前网页)获取信息,将选项卡更新到网页 B,然后将代码注入(inject)网页 B。不幸的是,以下代码正在将网页更新到 B 但注入(injec
是否可以打开 Chrome 开发者工具来检查 Chrome 应用? 最佳答案 所有可调试目标都列在 chrome://inspect/ 下。请参阅“应用程序”标签。 关于google-chrome -
我正在为 Google Chrome 开发一个应用程序,我想知道如何收费。 问题是我住在巴西,在这个链接上它告诉我它不支持 Chrome 网上应用店付款。如果没有 Chrome 网上商店付款,我可以通
我刚刚更新到 Chrome 32.0.1700.76 m(在 Win7 上)并且开发人员工具已更改。 特别令人痛苦的是用于检查页面元素的放大镜图标消失了。也没有提到它的快捷方式列表。 任何人都知道这已
我在 chrome-extension API (chrome.webrequest) 中遇到问题。 我的 list .json { "name": "tesst", "version": "
我已经制作了 chrome 主机来在我的扩展程序和我的进程之间传递 native 消息,我的进程在 chrome 启动时启动,但在我关闭 chrome 时不关闭,我应该向主机的 list 添加参数还是
文档对此非常不清楚。我知道如果您自己托管您的扩展程序,您可以通过增加版本号来自动更新您的扩展程序。但是,我不知道您是否可以在仍发布到 chrome 网上商店的同时进行自托管。 我不敢相信 Google
我最近一直在使用 Selenium WebDriver。我还专门与 chromedriver 合作。每当我打开一个新的 chrome 窗口 (driver.get(url)) 时,Chrome 都会以
我指的是chrome://flags 我很想知道是否可以通过自定义 chrome 扩展启用或禁用特定的 chrome 标志? 例如-我想启用 Enable Media Source API on e
当我在 chrome 开发者仪表板上向我的扩展程序上传更新时, 它无法这样做,它显示, An error occurred: Failed to process your item. Chrome W
我正在尝试编写一个需要用户身份验证的 chrome 扩展。 Google's tutorial建议我需要先上传到网上商店才能获得 key : Login to the Google APIs Cons
我已经开发了一个 Chrome 扩展程序并且我已经打包了它。 我将我的扩展程序发送给一些人试用,但 Chrome 开始阻止它在商店中找不到的扩展程序。 有没有办法安装我的扩展程序而不会被 Chrome
某些 Chrome 扩展不适用于 Chromium。例如:http://code.google.com/chrome/extensions/samples.html#5d81304a17cf7ac28
我是一名优秀的程序员,十分优秀!