feat: enable native extensions support (#21814)
This commit is contained in:
parent
bdf65a75d0
commit
a061c87e56
61 changed files with 1054 additions and 941 deletions
|
@ -23,3 +23,5 @@ is_cfi = false
|
||||||
|
|
||||||
# TODO: disabled due to crashes. re-enable.
|
# TODO: disabled due to crashes. re-enable.
|
||||||
enable_osr = false
|
enable_osr = false
|
||||||
|
|
||||||
|
enable_electron_extensions = true
|
||||||
|
|
|
@ -677,7 +677,7 @@ Returns `BrowserWindow | null` - The window that owns the given `browserView`. I
|
||||||
|
|
||||||
Returns `BrowserWindow` - The window with the given `id`.
|
Returns `BrowserWindow` - The window with the given `id`.
|
||||||
|
|
||||||
#### `BrowserWindow.addExtension(path)`
|
#### `BrowserWindow.addExtension(path)` _Deprecated_
|
||||||
|
|
||||||
* `path` String
|
* `path` String
|
||||||
|
|
||||||
|
@ -688,7 +688,10 @@ The method will also not return if the extension's manifest is missing or incomp
|
||||||
**Note:** This API cannot be called before the `ready` event of the `app` module
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
#### `BrowserWindow.removeExtension(name)`
|
**Note:** This method is deprecated. Instead, use
|
||||||
|
[`ses.loadExtension(path)`](session.md#sesloadextensionpath).
|
||||||
|
|
||||||
|
#### `BrowserWindow.removeExtension(name)` _Deprecated_
|
||||||
|
|
||||||
* `name` String
|
* `name` String
|
||||||
|
|
||||||
|
@ -697,7 +700,10 @@ Remove a Chrome extension by name.
|
||||||
**Note:** This API cannot be called before the `ready` event of the `app` module
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
#### `BrowserWindow.getExtensions()`
|
**Note:** This method is deprecated. Instead, use
|
||||||
|
[`ses.removeExtension(extension_id)`](session.md#sesremoveextensionextensionid).
|
||||||
|
|
||||||
|
#### `BrowserWindow.getExtensions()` _Deprecated_
|
||||||
|
|
||||||
Returns `Record<String, ExtensionInfo>` - The keys are the extension names and each value is
|
Returns `Record<String, ExtensionInfo>` - The keys are the extension names and each value is
|
||||||
an Object containing `name` and `version` properties.
|
an Object containing `name` and `version` properties.
|
||||||
|
@ -705,7 +711,10 @@ an Object containing `name` and `version` properties.
|
||||||
**Note:** This API cannot be called before the `ready` event of the `app` module
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
#### `BrowserWindow.addDevToolsExtension(path)`
|
**Note:** This method is deprecated. Instead, use
|
||||||
|
[`ses.getAllExtensions()`](session.md#sesgetallextensions).
|
||||||
|
|
||||||
|
#### `BrowserWindow.addDevToolsExtension(path)` _Deprecated_
|
||||||
|
|
||||||
* `path` String
|
* `path` String
|
||||||
|
|
||||||
|
@ -721,7 +730,10 @@ The method will also not return if the extension's manifest is missing or incomp
|
||||||
**Note:** This API cannot be called before the `ready` event of the `app` module
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
#### `BrowserWindow.removeDevToolsExtension(name)`
|
**Note:** This method is deprecated. Instead, use
|
||||||
|
[`ses.loadExtension(path)`](session.md#sesloadextensionpath).
|
||||||
|
|
||||||
|
#### `BrowserWindow.removeDevToolsExtension(name)` _Deprecated_
|
||||||
|
|
||||||
* `name` String
|
* `name` String
|
||||||
|
|
||||||
|
@ -730,7 +742,10 @@ Remove a DevTools extension by name.
|
||||||
**Note:** This API cannot be called before the `ready` event of the `app` module
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
#### `BrowserWindow.getDevToolsExtensions()`
|
**Note:** This method is deprecated. Instead, use
|
||||||
|
[`ses.removeExtension(extension_id)`](session.md#sesremoveextensionextensionid).
|
||||||
|
|
||||||
|
#### `BrowserWindow.getDevToolsExtensions()` _Deprecated_
|
||||||
|
|
||||||
Returns `Record<string, ExtensionInfo>` - The keys are the extension names and each value is
|
Returns `Record<string, ExtensionInfo>` - The keys are the extension names and each value is
|
||||||
an Object containing `name` and `version` properties.
|
an Object containing `name` and `version` properties.
|
||||||
|
@ -747,6 +762,9 @@ console.log(installed)
|
||||||
**Note:** This API cannot be called before the `ready` event of the `app` module
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
|
**Note:** This method is deprecated. Instead, use
|
||||||
|
[`ses.getAllExtensions()`](session.md#sesgetallextensions).
|
||||||
|
|
||||||
### Instance Properties
|
### Instance Properties
|
||||||
|
|
||||||
Objects created with `new BrowserWindow` have the following properties:
|
Objects created with `new BrowserWindow` have the following properties:
|
||||||
|
|
|
@ -495,6 +495,65 @@ Returns `Boolean` - Whether the word was successfully written to the custom dict
|
||||||
|
|
||||||
**Note:** On macOS and Windows 10 this word will be written to the OS custom dictionary as well
|
**Note:** On macOS and Windows 10 this word will be written to the OS custom dictionary as well
|
||||||
|
|
||||||
|
#### `ses.loadExtension(path)`
|
||||||
|
|
||||||
|
* `path` String - Path to a directory containing an unpacked Chrome extension
|
||||||
|
|
||||||
|
Returns `Promise<Extension>` - resolves when the extension is loaded.
|
||||||
|
|
||||||
|
This method will raise an exception if the extension could not be loaded. If
|
||||||
|
there are warnings when installing the extension (e.g. if the extension
|
||||||
|
requests an API that Electron does not support) then they will be logged to the
|
||||||
|
console.
|
||||||
|
|
||||||
|
Note that Electron does not support the full range of Chrome extensions APIs.
|
||||||
|
|
||||||
|
Note that in previous versions of Electron, extensions that were loaded would
|
||||||
|
be remembered for future runs of the application. This is no longer the case:
|
||||||
|
`loadExtension` must be called on every boot of your app if you want the
|
||||||
|
extension to be loaded.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { app, session } = require('electron')
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
app.on('ready', async () => {
|
||||||
|
await session.defaultSession.loadExtension(path.join(__dirname, 'react-devtools'))
|
||||||
|
// Note that in order to use the React DevTools extension, you'll need to
|
||||||
|
// download and unzip a copy of the extension.
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
This API does not support loading packed (.crx) extensions.
|
||||||
|
|
||||||
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
|
is emitted.
|
||||||
|
|
||||||
|
#### `ses.removeExtension(extensionId)`
|
||||||
|
|
||||||
|
* `extensionId` String - ID of extension to remove
|
||||||
|
|
||||||
|
Unloads an extension.
|
||||||
|
|
||||||
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
|
is emitted.
|
||||||
|
|
||||||
|
#### `ses.getExtension(extensionId)`
|
||||||
|
|
||||||
|
* `extensionId` String - ID of extension to query
|
||||||
|
|
||||||
|
Returns `Extension` | `null` - The loaded extension with the given ID.
|
||||||
|
|
||||||
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
|
is emitted.
|
||||||
|
|
||||||
|
#### `ses.getAllExtensions()`
|
||||||
|
|
||||||
|
Returns `Extension[]` - A list of all loaded extensions.
|
||||||
|
|
||||||
|
**Note:** This API cannot be called before the `ready` event of the `app` module
|
||||||
|
is emitted.
|
||||||
|
|
||||||
### Instance Properties
|
### Instance Properties
|
||||||
|
|
||||||
The following properties are available on instances of `Session`:
|
The following properties are available on instances of `Session`:
|
||||||
|
|
5
docs/api/structures/extension.md
Normal file
5
docs/api/structures/extension.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Extension Object
|
||||||
|
|
||||||
|
* `id` String
|
||||||
|
* `name` String
|
||||||
|
* `version` String
|
|
@ -77,6 +77,7 @@ auto_filenames = {
|
||||||
"docs/api/structures/display.md",
|
"docs/api/structures/display.md",
|
||||||
"docs/api/structures/event.md",
|
"docs/api/structures/event.md",
|
||||||
"docs/api/structures/extension-info.md",
|
"docs/api/structures/extension-info.md",
|
||||||
|
"docs/api/structures/extension.md",
|
||||||
"docs/api/structures/file-filter.md",
|
"docs/api/structures/file-filter.md",
|
||||||
"docs/api/structures/file-path-with-headers.md",
|
"docs/api/structures/file-path-with-headers.md",
|
||||||
"docs/api/structures/gpu-feature-status.md",
|
"docs/api/structures/gpu-feature-status.md",
|
||||||
|
|
|
@ -465,8 +465,6 @@ filenames = {
|
||||||
"shell/common/crash_reporter/linux/crash_dump_handler.h",
|
"shell/common/crash_reporter/linux/crash_dump_handler.h",
|
||||||
"shell/common/crash_reporter/win/crash_service_main.cc",
|
"shell/common/crash_reporter/win/crash_service_main.cc",
|
||||||
"shell/common/crash_reporter/win/crash_service_main.h",
|
"shell/common/crash_reporter/win/crash_service_main.h",
|
||||||
"shell/common/deprecate_util.cc",
|
|
||||||
"shell/common/deprecate_util.h",
|
|
||||||
"shell/common/gin_converters/accelerator_converter.cc",
|
"shell/common/gin_converters/accelerator_converter.cc",
|
||||||
"shell/common/gin_converters/accelerator_converter.h",
|
"shell/common/gin_converters/accelerator_converter.h",
|
||||||
"shell/common/gin_converters/blink_converter.cc",
|
"shell/common/gin_converters/blink_converter.cc",
|
||||||
|
@ -547,6 +545,8 @@ filenames = {
|
||||||
"shell/common/platform_util_linux.cc",
|
"shell/common/platform_util_linux.cc",
|
||||||
"shell/common/platform_util_mac.mm",
|
"shell/common/platform_util_mac.mm",
|
||||||
"shell/common/platform_util_win.cc",
|
"shell/common/platform_util_win.cc",
|
||||||
|
"shell/common/process_util.cc",
|
||||||
|
"shell/common/process_util.h",
|
||||||
"shell/common/skia_util.cc",
|
"shell/common/skia_util.cc",
|
||||||
"shell/common/skia_util.h",
|
"shell/common/skia_util.h",
|
||||||
"shell/common/v8_value_converter.cc",
|
"shell/common/v8_value_converter.cc",
|
||||||
|
@ -591,28 +591,28 @@ filenames = {
|
||||||
]
|
]
|
||||||
|
|
||||||
lib_sources_extensions = [
|
lib_sources_extensions = [
|
||||||
"shell/browser/extensions/api/runtime/atom_runtime_api_delegate.cc",
|
"shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc",
|
||||||
"shell/browser/extensions/api/runtime/atom_runtime_api_delegate.h",
|
"shell/browser/extensions/api/runtime/electron_runtime_api_delegate.h",
|
||||||
"shell/browser/extensions/api/tabs/tabs_api.cc",
|
"shell/browser/extensions/api/tabs/tabs_api.cc",
|
||||||
"shell/browser/extensions/api/tabs/tabs_api.h",
|
"shell/browser/extensions/api/tabs/tabs_api.h",
|
||||||
"shell/browser/extensions/atom_extensions_browser_client.cc",
|
"shell/browser/extensions/electron_extensions_browser_client.cc",
|
||||||
"shell/browser/extensions/atom_extensions_browser_client.h",
|
"shell/browser/extensions/electron_extensions_browser_client.h",
|
||||||
"shell/browser/extensions/atom_browser_context_keyed_service_factories.cc",
|
"shell/browser/extensions/electron_browser_context_keyed_service_factories.cc",
|
||||||
"shell/browser/extensions/atom_browser_context_keyed_service_factories.h",
|
"shell/browser/extensions/electron_browser_context_keyed_service_factories.h",
|
||||||
"shell/browser/extensions/atom_display_info_provider.cc",
|
"shell/browser/extensions/electron_display_info_provider.cc",
|
||||||
"shell/browser/extensions/atom_display_info_provider.h",
|
"shell/browser/extensions/electron_display_info_provider.h",
|
||||||
"shell/browser/extensions/atom_extension_host_delegate.cc",
|
"shell/browser/extensions/electron_extension_host_delegate.cc",
|
||||||
"shell/browser/extensions/atom_extension_host_delegate.h",
|
"shell/browser/extensions/electron_extension_host_delegate.h",
|
||||||
"shell/browser/extensions/atom_extension_loader.cc",
|
"shell/browser/extensions/electron_extension_loader.cc",
|
||||||
"shell/browser/extensions/atom_extension_loader.h",
|
"shell/browser/extensions/electron_extension_loader.h",
|
||||||
"shell/browser/extensions/atom_extension_system.cc",
|
"shell/browser/extensions/electron_extension_system.cc",
|
||||||
"shell/browser/extensions/atom_extension_system.h",
|
"shell/browser/extensions/electron_extension_system.h",
|
||||||
"shell/browser/extensions/atom_extension_system_factory.cc",
|
"shell/browser/extensions/electron_extension_system_factory.cc",
|
||||||
"shell/browser/extensions/atom_extension_system_factory.h",
|
"shell/browser/extensions/electron_extension_system_factory.h",
|
||||||
"shell/browser/extensions/atom_extension_web_contents_observer.cc",
|
"shell/browser/extensions/electron_extension_web_contents_observer.cc",
|
||||||
"shell/browser/extensions/atom_extension_web_contents_observer.h",
|
"shell/browser/extensions/electron_extension_web_contents_observer.h",
|
||||||
"shell/browser/extensions/atom_navigation_ui_data.cc",
|
"shell/browser/extensions/electron_navigation_ui_data.cc",
|
||||||
"shell/browser/extensions/atom_navigation_ui_data.h",
|
"shell/browser/extensions/electron_navigation_ui_data.h",
|
||||||
"shell/browser/extensions/electron_process_manager_delegate.cc",
|
"shell/browser/extensions/electron_process_manager_delegate.cc",
|
||||||
"shell/browser/extensions/electron_process_manager_delegate.h",
|
"shell/browser/extensions/electron_process_manager_delegate.h",
|
||||||
"shell/browser/extensions/electron_extensions_api_client.cc",
|
"shell/browser/extensions/electron_extensions_api_client.cc",
|
||||||
|
@ -621,12 +621,12 @@ filenames = {
|
||||||
"shell/browser/extensions/electron_extensions_browser_api_provider.h",
|
"shell/browser/extensions/electron_extensions_browser_api_provider.h",
|
||||||
"shell/browser/extensions/electron_messaging_delegate.cc",
|
"shell/browser/extensions/electron_messaging_delegate.cc",
|
||||||
"shell/browser/extensions/electron_messaging_delegate.h",
|
"shell/browser/extensions/electron_messaging_delegate.h",
|
||||||
"shell/common/extensions/atom_extensions_api_provider.cc",
|
"shell/common/extensions/electron_extensions_api_provider.cc",
|
||||||
"shell/common/extensions/atom_extensions_api_provider.h",
|
"shell/common/extensions/electron_extensions_api_provider.h",
|
||||||
"shell/common/extensions/atom_extensions_client.cc",
|
"shell/common/extensions/electron_extensions_client.cc",
|
||||||
"shell/common/extensions/atom_extensions_client.h",
|
"shell/common/extensions/electron_extensions_client.h",
|
||||||
"shell/renderer/extensions/atom_extensions_renderer_client.cc",
|
"shell/renderer/extensions/electron_extensions_renderer_client.cc",
|
||||||
"shell/renderer/extensions/atom_extensions_renderer_client.h",
|
"shell/renderer/extensions/electron_extensions_renderer_client.h",
|
||||||
"shell/renderer/extensions/electron_extensions_dispatcher_delegate.cc",
|
"shell/renderer/extensions/electron_extensions_dispatcher_delegate.cc",
|
||||||
"shell/renderer/extensions/electron_extensions_dispatcher_delegate.h",
|
"shell/renderer/extensions/electron_extensions_dispatcher_delegate.h",
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,13 +12,13 @@
|
||||||
#include "content/public/browser/child_process_security_policy.h"
|
#include "content/public/browser/child_process_security_policy.h"
|
||||||
#include "shell/browser/atom_browser_context.h"
|
#include "shell/browser/atom_browser_context.h"
|
||||||
#include "shell/browser/browser.h"
|
#include "shell/browser/browser.h"
|
||||||
#include "shell/common/deprecate_util.h"
|
|
||||||
#include "shell/common/gin_converters/callback_converter.h"
|
#include "shell/common/gin_converters/callback_converter.h"
|
||||||
#include "shell/common/gin_converters/net_converter.h"
|
#include "shell/common/gin_converters/net_converter.h"
|
||||||
#include "shell/common/gin_helper/dictionary.h"
|
#include "shell/common/gin_helper/dictionary.h"
|
||||||
#include "shell/common/gin_helper/object_template_builder.h"
|
#include "shell/common/gin_helper/object_template_builder.h"
|
||||||
#include "shell/common/gin_helper/promise.h"
|
#include "shell/common/gin_helper/promise.h"
|
||||||
#include "shell/common/options_switches.h"
|
#include "shell/common/options_switches.h"
|
||||||
|
#include "shell/common/process_util.h"
|
||||||
#include "url/url_util.h"
|
#include "url/url_util.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -217,12 +217,11 @@ bool Protocol::IsProtocolIntercepted(const std::string& scheme) {
|
||||||
v8::Local<v8::Promise> Protocol::IsProtocolHandled(const std::string& scheme,
|
v8::Local<v8::Promise> Protocol::IsProtocolHandled(const std::string& scheme,
|
||||||
gin::Arguments* args) {
|
gin::Arguments* args) {
|
||||||
node::Environment* env = node::Environment::GetCurrent(args->isolate());
|
node::Environment* env = node::Environment::GetCurrent(args->isolate());
|
||||||
EmitDeprecationWarning(
|
EmitWarning(env,
|
||||||
env,
|
"The protocol.isProtocolHandled API is deprecated, use "
|
||||||
"The protocol.isProtocolHandled API is deprecated, use "
|
"protocol.isProtocolRegistered or protocol.isProtocolIntercepted "
|
||||||
"protocol.isProtocolRegistered or protocol.isProtocolIntercepted "
|
"instead.",
|
||||||
"instead.",
|
"ProtocolDeprecateIsProtocolHandled");
|
||||||
"ProtocolDeprecateIsProtocolHandled");
|
|
||||||
return gin_helper::Promise<bool>::ResolvedPromise(
|
return gin_helper::Promise<bool>::ResolvedPromise(
|
||||||
isolate(), IsProtocolRegistered(scheme) ||
|
isolate(), IsProtocolRegistered(scheme) ||
|
||||||
IsProtocolIntercepted(scheme) ||
|
IsProtocolIntercepted(scheme) ||
|
||||||
|
@ -241,7 +240,7 @@ void Protocol::HandleOptionalCallback(gin::Arguments* args,
|
||||||
CompletionCallback callback;
|
CompletionCallback callback;
|
||||||
if (args->GetNext(&callback)) {
|
if (args->GetNext(&callback)) {
|
||||||
node::Environment* env = node::Environment::GetCurrent(args->isolate());
|
node::Environment* env = node::Environment::GetCurrent(args->isolate());
|
||||||
EmitDeprecationWarning(
|
EmitWarning(
|
||||||
env,
|
env,
|
||||||
"The callback argument of protocol module APIs is no longer needed.",
|
"The callback argument of protocol module APIs is no longer needed.",
|
||||||
"ProtocolDeprecateCallback");
|
"ProtocolDeprecateCallback");
|
||||||
|
|
|
@ -63,11 +63,12 @@
|
||||||
#include "shell/common/gin_helper/object_template_builder.h"
|
#include "shell/common/gin_helper/object_template_builder.h"
|
||||||
#include "shell/common/node_includes.h"
|
#include "shell/common/node_includes.h"
|
||||||
#include "shell/common/options_switches.h"
|
#include "shell/common/options_switches.h"
|
||||||
|
#include "shell/common/process_util.h"
|
||||||
#include "ui/base/l10n/l10n_util.h"
|
#include "ui/base/l10n/l10n_util.h"
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
#include "extensions/browser/extension_registry.h"
|
#include "extensions/browser/extension_registry.h"
|
||||||
#include "shell/browser/extensions/atom_extension_system.h"
|
#include "shell/browser/extensions/electron_extension_system.h"
|
||||||
#include "shell/common/gin_converters/extension_converter.h"
|
#include "shell/common/gin_converters/extension_converter.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -613,19 +614,23 @@ v8::Local<v8::Promise> Session::LoadExtension(
|
||||||
gin_helper::Promise<const extensions::Extension*> promise(isolate());
|
gin_helper::Promise<const extensions::Extension*> promise(isolate());
|
||||||
v8::Local<v8::Promise> handle = promise.GetHandle();
|
v8::Local<v8::Promise> handle = promise.GetHandle();
|
||||||
|
|
||||||
auto* extension_system = static_cast<extensions::AtomExtensionSystem*>(
|
auto* extension_system = static_cast<extensions::ElectronExtensionSystem*>(
|
||||||
extensions::ExtensionSystem::Get(browser_context()));
|
extensions::ExtensionSystem::Get(browser_context()));
|
||||||
extension_system->LoadExtension(
|
extension_system->LoadExtension(
|
||||||
extension_path,
|
extension_path,
|
||||||
base::BindOnce(
|
base::BindOnce(
|
||||||
[](gin_helper::Promise<const extensions::Extension*> promise,
|
[](gin_helper::Promise<const extensions::Extension*> promise,
|
||||||
const extensions::Extension* extension) {
|
const extensions::Extension* extension,
|
||||||
|
const std::string& error_msg) {
|
||||||
if (extension) {
|
if (extension) {
|
||||||
|
if (!error_msg.empty()) {
|
||||||
|
node::Environment* env =
|
||||||
|
node::Environment::GetCurrent(v8::Isolate::GetCurrent());
|
||||||
|
EmitWarning(env, error_msg, "ExtensionLoadWarning");
|
||||||
|
}
|
||||||
promise.Resolve(extension);
|
promise.Resolve(extension);
|
||||||
} else {
|
} else {
|
||||||
// TODO(nornagon): plumb through error message from extension
|
promise.RejectWithErrorMessage(error_msg);
|
||||||
// loader.
|
|
||||||
promise.RejectWithErrorMessage("Failed to load extension");
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
std::move(promise)));
|
std::move(promise)));
|
||||||
|
@ -634,7 +639,7 @@ v8::Local<v8::Promise> Session::LoadExtension(
|
||||||
}
|
}
|
||||||
|
|
||||||
void Session::RemoveExtension(const std::string& extension_id) {
|
void Session::RemoveExtension(const std::string& extension_id) {
|
||||||
auto* extension_system = static_cast<extensions::AtomExtensionSystem*>(
|
auto* extension_system = static_cast<extensions::ElectronExtensionSystem*>(
|
||||||
extensions::ExtensionSystem::Get(browser_context()));
|
extensions::ExtensionSystem::Get(browser_context()));
|
||||||
extension_system->RemoveExtension(extension_id);
|
extension_system->RemoveExtension(extension_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,9 @@
|
||||||
#include "shell/browser/mac/atom_application.h"
|
#include "shell/browser/mac/atom_application.h"
|
||||||
#include "shell/browser/mac/dict_util.h"
|
#include "shell/browser/mac/dict_util.h"
|
||||||
#include "shell/browser/ui/cocoa/NSColor+Hex.h"
|
#include "shell/browser/ui/cocoa/NSColor+Hex.h"
|
||||||
#include "shell/common/deprecate_util.h"
|
|
||||||
#include "shell/common/gin_converters/gurl_converter.h"
|
#include "shell/common/gin_converters/gurl_converter.h"
|
||||||
#include "shell/common/gin_converters/value_converter.h"
|
#include "shell/common/gin_converters/value_converter.h"
|
||||||
|
#include "shell/common/process_util.h"
|
||||||
#include "ui/native_theme/native_theme.h"
|
#include "ui/native_theme/native_theme.h"
|
||||||
|
|
||||||
namespace gin {
|
namespace gin {
|
||||||
|
@ -504,7 +504,7 @@ std::string SystemPreferences::GetColor(gin_helper::ErrorThrower thrower,
|
||||||
NSColor* sysColor = nil;
|
NSColor* sysColor = nil;
|
||||||
if (color == "alternate-selected-control-text") {
|
if (color == "alternate-selected-control-text") {
|
||||||
sysColor = [NSColor alternateSelectedControlTextColor];
|
sysColor = [NSColor alternateSelectedControlTextColor];
|
||||||
EmitDeprecationWarning(
|
EmitWarning(
|
||||||
node::Environment::GetCurrent(thrower.isolate()),
|
node::Environment::GetCurrent(thrower.isolate()),
|
||||||
"'alternate-selected-control-text' is deprecated as an input to "
|
"'alternate-selected-control-text' is deprecated as an input to "
|
||||||
"getColor. Use 'selected-content-background' instead.",
|
"getColor. Use 'selected-content-background' instead.",
|
||||||
|
|
|
@ -114,7 +114,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
#include "shell/browser/extensions/atom_extension_web_contents_observer.h"
|
#include "shell/browser/extensions/electron_extension_web_contents_observer.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace gin {
|
namespace gin {
|
||||||
|
@ -385,7 +385,7 @@ WebContents::WebContents(v8::Isolate* isolate,
|
||||||
AttachAsUserData(web_contents);
|
AttachAsUserData(web_contents);
|
||||||
InitZoomController(web_contents, gin::Dictionary::CreateEmpty(isolate));
|
InitZoomController(web_contents, gin::Dictionary::CreateEmpty(isolate));
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
extensions::AtomExtensionWebContentsObserver::CreateForWebContents(
|
extensions::ElectronExtensionWebContentsObserver::CreateForWebContents(
|
||||||
web_contents);
|
web_contents);
|
||||||
script_executor_.reset(new extensions::ScriptExecutor(web_contents));
|
script_executor_.reset(new extensions::ScriptExecutor(web_contents));
|
||||||
#endif
|
#endif
|
||||||
|
@ -546,7 +546,7 @@ void WebContents::InitWithSessionAndOptions(
|
||||||
SecurityStateTabHelper::CreateForWebContents(web_contents());
|
SecurityStateTabHelper::CreateForWebContents(web_contents());
|
||||||
InitZoomController(web_contents(), options);
|
InitZoomController(web_contents(), options);
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
extensions::AtomExtensionWebContentsObserver::CreateForWebContents(
|
extensions::ElectronExtensionWebContentsObserver::CreateForWebContents(
|
||||||
web_contents());
|
web_contents());
|
||||||
script_executor_.reset(new extensions::ScriptExecutor(web_contents()));
|
script_executor_.reset(new extensions::ScriptExecutor(web_contents()));
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -134,7 +134,7 @@
|
||||||
#include "extensions/browser/info_map.h"
|
#include "extensions/browser/info_map.h"
|
||||||
#include "extensions/browser/process_map.h"
|
#include "extensions/browser/process_map.h"
|
||||||
#include "extensions/common/extension.h"
|
#include "extensions/common/extension.h"
|
||||||
#include "shell/browser/extensions/atom_extension_system.h"
|
#include "shell/browser/extensions/electron_extension_system.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
|
|
|
@ -56,11 +56,11 @@
|
||||||
#include "extensions/browser/extension_prefs.h"
|
#include "extensions/browser/extension_prefs.h"
|
||||||
#include "extensions/browser/pref_names.h"
|
#include "extensions/browser/pref_names.h"
|
||||||
#include "extensions/common/extension_api.h"
|
#include "extensions/common/extension_api.h"
|
||||||
#include "shell/browser/extensions/atom_browser_context_keyed_service_factories.h"
|
#include "shell/browser/extensions/electron_browser_context_keyed_service_factories.h"
|
||||||
#include "shell/browser/extensions/atom_extension_system.h"
|
#include "shell/browser/extensions/electron_extension_system.h"
|
||||||
#include "shell/browser/extensions/atom_extension_system_factory.h"
|
#include "shell/browser/extensions/electron_extension_system_factory.h"
|
||||||
#include "shell/browser/extensions/atom_extensions_browser_client.h"
|
#include "shell/browser/extensions/electron_extensions_browser_client.h"
|
||||||
#include "shell/common/extensions/atom_extensions_client.h"
|
#include "shell/common/extensions/electron_extensions_client.h"
|
||||||
#endif // BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#endif // BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS) || \
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS) || \
|
||||||
|
@ -136,7 +136,7 @@ AtomBrowserContext::AtomBrowserContext(const std::string& partition,
|
||||||
BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
|
BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
|
||||||
this);
|
this);
|
||||||
|
|
||||||
extension_system_ = static_cast<extensions::AtomExtensionSystem*>(
|
extension_system_ = static_cast<extensions::ElectronExtensionSystem*>(
|
||||||
extensions::ExtensionSystem::Get(this));
|
extensions::ExtensionSystem::Get(this));
|
||||||
extension_system_->InitForRegularProfile(true /* extensions_enabled */);
|
extension_system_->InitForRegularProfile(true /* extensions_enabled */);
|
||||||
extension_system_->FinishInitialization();
|
extension_system_->FinishInitialization();
|
||||||
|
|
|
@ -35,7 +35,7 @@ class SpecialStoragePolicy;
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
class AtomExtensionSystem;
|
class ElectronExtensionSystem;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ class AtomBrowserContext
|
||||||
}
|
}
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
extensions::AtomExtensionSystem* extension_system() {
|
extensions::ElectronExtensionSystem* extension_system() {
|
||||||
return extension_system_;
|
return extension_system_;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -192,7 +192,7 @@ class AtomBrowserContext
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
// Owned by the KeyedService system.
|
// Owned by the KeyedService system.
|
||||||
extensions::AtomExtensionSystem* extension_system_;
|
extensions::ElectronExtensionSystem* extension_system_;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Shared URLLoaderFactory.
|
// Shared URLLoaderFactory.
|
||||||
|
|
|
@ -97,9 +97,9 @@
|
||||||
#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
||||||
#include "extensions/browser/browser_context_keyed_service_factories.h"
|
#include "extensions/browser/browser_context_keyed_service_factories.h"
|
||||||
#include "extensions/common/extension_api.h"
|
#include "extensions/common/extension_api.h"
|
||||||
#include "shell/browser/extensions/atom_browser_context_keyed_service_factories.h"
|
#include "shell/browser/extensions/electron_browser_context_keyed_service_factories.h"
|
||||||
#include "shell/browser/extensions/atom_extensions_browser_client.h"
|
#include "shell/browser/extensions/electron_extensions_browser_client.h"
|
||||||
#include "shell/common/extensions/atom_extensions_client.h"
|
#include "shell/common/extensions/electron_extensions_client.h"
|
||||||
#endif // BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#endif // BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_BUILTIN_SPELLCHECKER)
|
#if BUILDFLAG(ENABLE_BUILTIN_SPELLCHECKER)
|
||||||
|
@ -437,11 +437,12 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
|
||||||
node_bindings_->RunMessageLoop();
|
node_bindings_->RunMessageLoop();
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
extensions_client_ = std::make_unique<AtomExtensionsClient>();
|
extensions_client_ = std::make_unique<ElectronExtensionsClient>();
|
||||||
extensions::ExtensionsClient::Set(extensions_client_.get());
|
extensions::ExtensionsClient::Set(extensions_client_.get());
|
||||||
|
|
||||||
// BrowserContextKeyedAPIServiceFactories require an ExtensionsBrowserClient.
|
// BrowserContextKeyedAPIServiceFactories require an ExtensionsBrowserClient.
|
||||||
extensions_browser_client_ = std::make_unique<AtomExtensionsBrowserClient>();
|
extensions_browser_client_ =
|
||||||
|
std::make_unique<ElectronExtensionsBrowserClient>();
|
||||||
extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
|
extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
|
||||||
|
|
||||||
extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt();
|
extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt();
|
||||||
|
|
|
@ -41,8 +41,8 @@ class NodeEnvironment;
|
||||||
class BridgeTaskRunner;
|
class BridgeTaskRunner;
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
class AtomExtensionsClient;
|
class ElectronExtensionsClient;
|
||||||
class AtomExtensionsBrowserClient;
|
class ElectronExtensionsBrowserClient;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TOOLKIT_VIEWS)
|
#if defined(TOOLKIT_VIEWS)
|
||||||
|
@ -139,8 +139,8 @@ class AtomBrowserMainParts : public content::BrowserMainParts {
|
||||||
std::unique_ptr<base::FieldTrialList> field_trial_list_;
|
std::unique_ptr<base::FieldTrialList> field_trial_list_;
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
std::unique_ptr<AtomExtensionsClient> extensions_client_;
|
std::unique_ptr<ElectronExtensionsClient> extensions_client_;
|
||||||
std::unique_ptr<AtomExtensionsBrowserClient> extensions_browser_client_;
|
std::unique_ptr<ElectronExtensionsBrowserClient> extensions_browser_client_;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
base::RepeatingTimer gc_timer_;
|
base::RepeatingTimer gc_timer_;
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
#include "shell/browser/extensions/api/runtime/atom_runtime_api_delegate.h"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "build/build_config.h"
|
|
||||||
#include "extensions/common/api/runtime.h"
|
|
||||||
#include "shell/browser/extensions/atom_extension_system.h"
|
|
||||||
|
|
||||||
using extensions::api::runtime::PlatformInfo;
|
|
||||||
|
|
||||||
namespace extensions {
|
|
||||||
|
|
||||||
AtomRuntimeAPIDelegate::AtomRuntimeAPIDelegate(
|
|
||||||
content::BrowserContext* browser_context)
|
|
||||||
: browser_context_(browser_context) {
|
|
||||||
DCHECK(browser_context_);
|
|
||||||
}
|
|
||||||
|
|
||||||
AtomRuntimeAPIDelegate::~AtomRuntimeAPIDelegate() = default;
|
|
||||||
|
|
||||||
void AtomRuntimeAPIDelegate::AddUpdateObserver(UpdateObserver* observer) {}
|
|
||||||
|
|
||||||
void AtomRuntimeAPIDelegate::RemoveUpdateObserver(UpdateObserver* observer) {}
|
|
||||||
|
|
||||||
void AtomRuntimeAPIDelegate::ReloadExtension(const std::string& extension_id) {
|
|
||||||
static_cast<AtomExtensionSystem*>(ExtensionSystem::Get(browser_context_))
|
|
||||||
->ReloadExtension(extension_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AtomRuntimeAPIDelegate::CheckForUpdates(
|
|
||||||
const std::string& extension_id,
|
|
||||||
const UpdateCheckCallback& callback) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AtomRuntimeAPIDelegate::OpenURL(const GURL& uninstall_url) {}
|
|
||||||
|
|
||||||
bool AtomRuntimeAPIDelegate::GetPlatformInfo(PlatformInfo* info) {
|
|
||||||
// TODO(nornagon): put useful information here.
|
|
||||||
#if defined(OS_LINUX)
|
|
||||||
info->os = api::runtime::PLATFORM_OS_LINUX;
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
} // namespace extensions
|
|
||||||
|
|
||||||
bool AtomRuntimeAPIDelegate::RestartDevice(std::string* error_message) {
|
|
||||||
*error_message = "Restart is not supported in Electron";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace extensions
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
#include "shell/browser/extensions/api/runtime/electron_runtime_api_delegate.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "build/build_config.h"
|
||||||
|
#include "extensions/common/api/runtime.h"
|
||||||
|
#include "shell/browser/extensions/electron_extension_system.h"
|
||||||
|
|
||||||
|
using extensions::api::runtime::PlatformInfo;
|
||||||
|
|
||||||
|
namespace extensions {
|
||||||
|
|
||||||
|
ElectronRuntimeAPIDelegate::ElectronRuntimeAPIDelegate(
|
||||||
|
content::BrowserContext* browser_context)
|
||||||
|
: browser_context_(browser_context) {
|
||||||
|
DCHECK(browser_context_);
|
||||||
|
}
|
||||||
|
|
||||||
|
ElectronRuntimeAPIDelegate::~ElectronRuntimeAPIDelegate() = default;
|
||||||
|
|
||||||
|
void ElectronRuntimeAPIDelegate::AddUpdateObserver(UpdateObserver* observer) {}
|
||||||
|
|
||||||
|
void ElectronRuntimeAPIDelegate::RemoveUpdateObserver(
|
||||||
|
UpdateObserver* observer) {}
|
||||||
|
|
||||||
|
void ElectronRuntimeAPIDelegate::ReloadExtension(
|
||||||
|
const std::string& extension_id) {
|
||||||
|
static_cast<ElectronExtensionSystem*>(ExtensionSystem::Get(browser_context_))
|
||||||
|
->ReloadExtension(extension_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ElectronRuntimeAPIDelegate::CheckForUpdates(
|
||||||
|
const std::string& extension_id,
|
||||||
|
const UpdateCheckCallback& callback) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ElectronRuntimeAPIDelegate::OpenURL(const GURL& uninstall_url) {}
|
||||||
|
|
||||||
|
bool ElectronRuntimeAPIDelegate::GetPlatformInfo(PlatformInfo* info) {
|
||||||
|
// TODO(nornagon): put useful information here.
|
||||||
|
#if defined(OS_LINUX)
|
||||||
|
info->os = api::runtime::PLATFORM_OS_LINUX;
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
} // namespace extensions
|
||||||
|
|
||||||
|
bool ElectronRuntimeAPIDelegate::RestartDevice(std::string* error_message) {
|
||||||
|
*error_message = "Restart is not supported in Electron";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace extensions
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_API_RUNTIME_ATOM_RUNTIME_API_DELEGATE_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_API_RUNTIME_ELECTRON_RUNTIME_API_DELEGATE_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_API_RUNTIME_ATOM_RUNTIME_API_DELEGATE_H_
|
#define SHELL_BROWSER_EXTENSIONS_API_RUNTIME_ELECTRON_RUNTIME_API_DELEGATE_H_
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -16,10 +16,10 @@ class BrowserContext;
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
class AtomRuntimeAPIDelegate : public RuntimeAPIDelegate {
|
class ElectronRuntimeAPIDelegate : public RuntimeAPIDelegate {
|
||||||
public:
|
public:
|
||||||
explicit AtomRuntimeAPIDelegate(content::BrowserContext* browser_context);
|
explicit ElectronRuntimeAPIDelegate(content::BrowserContext* browser_context);
|
||||||
~AtomRuntimeAPIDelegate() override;
|
~ElectronRuntimeAPIDelegate() override;
|
||||||
|
|
||||||
// RuntimeAPIDelegate implementation.
|
// RuntimeAPIDelegate implementation.
|
||||||
void AddUpdateObserver(UpdateObserver* observer) override;
|
void AddUpdateObserver(UpdateObserver* observer) override;
|
||||||
|
@ -34,9 +34,9 @@ class AtomRuntimeAPIDelegate : public RuntimeAPIDelegate {
|
||||||
private:
|
private:
|
||||||
content::BrowserContext* browser_context_;
|
content::BrowserContext* browser_context_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomRuntimeAPIDelegate);
|
DISALLOW_COPY_AND_ASSIGN(ElectronRuntimeAPIDelegate);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_API_RUNTIME_ATOM_RUNTIME_API_DELEGATE_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_API_RUNTIME_ELECTRON_RUNTIME_API_DELEGATE_H_
|
|
@ -1,23 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_DISPLAY_INFO_PROVIDER_H_
|
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_DISPLAY_INFO_PROVIDER_H_
|
|
||||||
|
|
||||||
#include "base/macros.h"
|
|
||||||
#include "extensions/browser/api/system_display/display_info_provider.h"
|
|
||||||
|
|
||||||
namespace extensions {
|
|
||||||
|
|
||||||
class AtomDisplayInfoProvider : public DisplayInfoProvider {
|
|
||||||
public:
|
|
||||||
AtomDisplayInfoProvider();
|
|
||||||
|
|
||||||
private:
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomDisplayInfoProvider);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace extensions
|
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_DISPLAY_INFO_PROVIDER_H_
|
|
|
@ -2,11 +2,11 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_browser_context_keyed_service_factories.h"
|
#include "shell/browser/extensions/electron_browser_context_keyed_service_factories.h"
|
||||||
|
|
||||||
#include "extensions/browser/updater/update_service_factory.h"
|
#include "extensions/browser/updater/update_service_factory.h"
|
||||||
// #include "extensions/shell/browser/api/identity/identity_api.h"
|
// #include "extensions/shell/browser/api/identity/identity_api.h"
|
||||||
#include "shell/browser/extensions/atom_extension_system_factory.h"
|
#include "shell/browser/extensions/electron_extension_system_factory.h"
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
@ -18,7 +18,7 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
|
||||||
// extensions embedders (and namely chrome.)
|
// extensions embedders (and namely chrome.)
|
||||||
UpdateServiceFactory::GetInstance();
|
UpdateServiceFactory::GetInstance();
|
||||||
|
|
||||||
AtomExtensionSystemFactory::GetInstance();
|
ElectronExtensionSystemFactory::GetInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace electron
|
} // namespace electron
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
@ -15,4 +15,4 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt();
|
||||||
} // namespace electron
|
} // namespace electron
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
|
|
@ -2,10 +2,10 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_display_info_provider.h"
|
#include "shell/browser/extensions/electron_display_info_provider.h"
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
AtomDisplayInfoProvider::AtomDisplayInfoProvider() = default;
|
ElectronDisplayInfoProvider::ElectronDisplayInfoProvider() = default;
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
23
shell/browser/extensions/electron_display_info_provider.h
Normal file
23
shell/browser/extensions/electron_display_info_provider.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_DISPLAY_INFO_PROVIDER_H_
|
||||||
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_DISPLAY_INFO_PROVIDER_H_
|
||||||
|
|
||||||
|
#include "base/macros.h"
|
||||||
|
#include "extensions/browser/api/system_display/display_info_provider.h"
|
||||||
|
|
||||||
|
namespace extensions {
|
||||||
|
|
||||||
|
class ElectronDisplayInfoProvider : public DisplayInfoProvider {
|
||||||
|
public:
|
||||||
|
ElectronDisplayInfoProvider();
|
||||||
|
|
||||||
|
private:
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(ElectronDisplayInfoProvider);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace extensions
|
||||||
|
|
||||||
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_DISPLAY_INFO_PROVIDER_H_
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_extension_host_delegate.h"
|
#include "shell/browser/extensions/electron_extension_host_delegate.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -11,31 +11,31 @@
|
||||||
#include "base/lazy_instance.h"
|
#include "base/lazy_instance.h"
|
||||||
#include "base/logging.h"
|
#include "base/logging.h"
|
||||||
#include "extensions/browser/media_capture_util.h"
|
#include "extensions/browser/media_capture_util.h"
|
||||||
#include "shell/browser/extensions/atom_extension_web_contents_observer.h"
|
#include "shell/browser/extensions/electron_extension_web_contents_observer.h"
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
AtomExtensionHostDelegate::AtomExtensionHostDelegate() {}
|
ElectronExtensionHostDelegate::ElectronExtensionHostDelegate() {}
|
||||||
|
|
||||||
AtomExtensionHostDelegate::~AtomExtensionHostDelegate() {}
|
ElectronExtensionHostDelegate::~ElectronExtensionHostDelegate() {}
|
||||||
|
|
||||||
void AtomExtensionHostDelegate::OnExtensionHostCreated(
|
void ElectronExtensionHostDelegate::OnExtensionHostCreated(
|
||||||
content::WebContents* web_contents) {
|
content::WebContents* web_contents) {
|
||||||
AtomExtensionWebContentsObserver::CreateForWebContents(web_contents);
|
ElectronExtensionWebContentsObserver::CreateForWebContents(web_contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionHostDelegate::OnRenderViewCreatedForBackgroundPage(
|
void ElectronExtensionHostDelegate::OnRenderViewCreatedForBackgroundPage(
|
||||||
ExtensionHost* host) {}
|
ExtensionHost* host) {}
|
||||||
|
|
||||||
content::JavaScriptDialogManager*
|
content::JavaScriptDialogManager*
|
||||||
AtomExtensionHostDelegate::GetJavaScriptDialogManager() {
|
ElectronExtensionHostDelegate::GetJavaScriptDialogManager() {
|
||||||
// TODO(jamescook): Create a JavaScriptDialogManager or reuse the one from
|
// TODO(jamescook): Create a JavaScriptDialogManager or reuse the one from
|
||||||
// content_shell.
|
// content_shell.
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionHostDelegate::CreateTab(
|
void ElectronExtensionHostDelegate::CreateTab(
|
||||||
std::unique_ptr<content::WebContents> web_contents,
|
std::unique_ptr<content::WebContents> web_contents,
|
||||||
const std::string& extension_id,
|
const std::string& extension_id,
|
||||||
WindowOpenDisposition disposition,
|
WindowOpenDisposition disposition,
|
||||||
|
@ -45,7 +45,7 @@ void AtomExtensionHostDelegate::CreateTab(
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionHostDelegate::ProcessMediaAccessRequest(
|
void ElectronExtensionHostDelegate::ProcessMediaAccessRequest(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
const content::MediaStreamRequest& request,
|
const content::MediaStreamRequest& request,
|
||||||
content::MediaResponseCallback callback,
|
content::MediaResponseCallback callback,
|
||||||
|
@ -55,7 +55,7 @@ void AtomExtensionHostDelegate::ProcessMediaAccessRequest(
|
||||||
std::move(callback), extension);
|
std::move(callback), extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionHostDelegate::CheckMediaAccessPermission(
|
bool ElectronExtensionHostDelegate::CheckMediaAccessPermission(
|
||||||
content::RenderFrameHost* render_frame_host,
|
content::RenderFrameHost* render_frame_host,
|
||||||
const GURL& security_origin,
|
const GURL& security_origin,
|
||||||
blink::mojom::MediaStreamType type,
|
blink::mojom::MediaStreamType type,
|
||||||
|
@ -65,7 +65,7 @@ bool AtomExtensionHostDelegate::CheckMediaAccessPermission(
|
||||||
}
|
}
|
||||||
|
|
||||||
content::PictureInPictureResult
|
content::PictureInPictureResult
|
||||||
AtomExtensionHostDelegate::EnterPictureInPicture(
|
ElectronExtensionHostDelegate::EnterPictureInPicture(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
const viz::SurfaceId& surface_id,
|
const viz::SurfaceId& surface_id,
|
||||||
const gfx::Size& natural_size) {
|
const gfx::Size& natural_size) {
|
||||||
|
@ -73,7 +73,7 @@ AtomExtensionHostDelegate::EnterPictureInPicture(
|
||||||
return content::PictureInPictureResult();
|
return content::PictureInPictureResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionHostDelegate::ExitPictureInPicture() {
|
void ElectronExtensionHostDelegate::ExitPictureInPicture() {
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_HOST_DELEGATE_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_HOST_DELEGATE_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_HOST_DELEGATE_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_HOST_DELEGATE_H_
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -14,10 +14,10 @@
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
// A minimal ExtensionHostDelegate.
|
// A minimal ExtensionHostDelegate.
|
||||||
class AtomExtensionHostDelegate : public ExtensionHostDelegate {
|
class ElectronExtensionHostDelegate : public ExtensionHostDelegate {
|
||||||
public:
|
public:
|
||||||
AtomExtensionHostDelegate();
|
ElectronExtensionHostDelegate();
|
||||||
~AtomExtensionHostDelegate() override;
|
~ElectronExtensionHostDelegate() override;
|
||||||
|
|
||||||
// ExtensionHostDelegate implementation.
|
// ExtensionHostDelegate implementation.
|
||||||
void OnExtensionHostCreated(content::WebContents* web_contents) override;
|
void OnExtensionHostCreated(content::WebContents* web_contents) override;
|
||||||
|
@ -43,9 +43,9 @@ class AtomExtensionHostDelegate : public ExtensionHostDelegate {
|
||||||
void ExitPictureInPicture() override;
|
void ExitPictureInPicture() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionHostDelegate);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionHostDelegate);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_HOST_DELEGATE_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_HOST_DELEGATE_H_
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_extension_loader.h"
|
#include "shell/browser/extensions/electron_extension_loader.h"
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
||||||
#include "base/files/file_util.h"
|
#include "base/files/file_util.h"
|
||||||
#include "base/logging.h"
|
#include "base/logging.h"
|
||||||
#include "base/sequenced_task_runner.h"
|
#include "base/sequenced_task_runner.h"
|
||||||
|
#include "base/strings/utf_string_conversions.h"
|
||||||
#include "base/task_runner_util.h"
|
#include "base/task_runner_util.h"
|
||||||
#include "base/threading/thread_restrictions.h"
|
#include "base/threading/thread_restrictions.h"
|
||||||
#include "extensions/browser/extension_file_task_runner.h"
|
#include "extensions/browser/extension_file_task_runner.h"
|
||||||
|
@ -25,16 +26,15 @@ using LoadErrorBehavior = ExtensionRegistrar::LoadErrorBehavior;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
scoped_refptr<const Extension> LoadUnpacked(
|
std::pair<scoped_refptr<const Extension>, std::string> LoadUnpacked(
|
||||||
const base::FilePath& extension_dir) {
|
const base::FilePath& extension_dir) {
|
||||||
// app_shell only supports unpacked extensions.
|
// app_shell only supports unpacked extensions.
|
||||||
// NOTE: If you add packed extension support consider removing the flag
|
// NOTE: If you add packed extension support consider removing the flag
|
||||||
// FOLLOW_SYMLINKS_ANYWHERE below. Packed extensions should not have symlinks.
|
// FOLLOW_SYMLINKS_ANYWHERE below. Packed extensions should not have symlinks.
|
||||||
// TODO(nornagon): these LOG()s should surface as JS exceptions
|
|
||||||
if (!base::DirectoryExists(extension_dir)) {
|
if (!base::DirectoryExists(extension_dir)) {
|
||||||
LOG(ERROR) << "Extension directory not found: "
|
std::string err = "Extension directory not found: " +
|
||||||
<< extension_dir.AsUTF8Unsafe();
|
base::UTF16ToUTF8(extension_dir.LossyDisplayName());
|
||||||
return nullptr;
|
return std::make_pair(nullptr, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_flags = Extension::FOLLOW_SYMLINKS_ANYWHERE;
|
int load_flags = Extension::FOLLOW_SYMLINKS_ANYWHERE;
|
||||||
|
@ -42,43 +42,46 @@ scoped_refptr<const Extension> LoadUnpacked(
|
||||||
scoped_refptr<Extension> extension = file_util::LoadExtension(
|
scoped_refptr<Extension> extension = file_util::LoadExtension(
|
||||||
extension_dir, Manifest::COMMAND_LINE, load_flags, &load_error);
|
extension_dir, Manifest::COMMAND_LINE, load_flags, &load_error);
|
||||||
if (!extension.get()) {
|
if (!extension.get()) {
|
||||||
LOG(ERROR) << "Loading extension at " << extension_dir.value()
|
std::string err = "Loading extension at " +
|
||||||
<< " failed with: " << load_error;
|
base::UTF16ToUTF8(extension_dir.LossyDisplayName()) +
|
||||||
return nullptr;
|
" failed with: " + load_error;
|
||||||
|
return std::make_pair(nullptr, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string warnings;
|
||||||
// Log warnings.
|
// Log warnings.
|
||||||
if (extension->install_warnings().size()) {
|
if (extension->install_warnings().size()) {
|
||||||
LOG(WARNING) << "Warnings loading extension at " << extension_dir.value()
|
warnings += "Warnings loading extension at " +
|
||||||
<< ":";
|
base::UTF16ToUTF8(extension_dir.LossyDisplayName()) + ": ";
|
||||||
for (const auto& warning : extension->install_warnings())
|
for (const auto& warning : extension->install_warnings()) {
|
||||||
LOG(WARNING) << warning.message;
|
warnings += warning.message + " ";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return extension;
|
return std::make_pair(extension, warnings);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
AtomExtensionLoader::AtomExtensionLoader(
|
ElectronExtensionLoader::ElectronExtensionLoader(
|
||||||
content::BrowserContext* browser_context)
|
content::BrowserContext* browser_context)
|
||||||
: browser_context_(browser_context),
|
: browser_context_(browser_context),
|
||||||
extension_registrar_(browser_context, this),
|
extension_registrar_(browser_context, this),
|
||||||
weak_factory_(this) {}
|
weak_factory_(this) {}
|
||||||
|
|
||||||
AtomExtensionLoader::~AtomExtensionLoader() = default;
|
ElectronExtensionLoader::~ElectronExtensionLoader() = default;
|
||||||
|
|
||||||
void AtomExtensionLoader::LoadExtension(
|
void ElectronExtensionLoader::LoadExtension(
|
||||||
const base::FilePath& extension_dir,
|
const base::FilePath& extension_dir,
|
||||||
base::OnceCallback<void(const Extension*)> loaded) {
|
base::OnceCallback<void(const Extension*, const std::string&)> cb) {
|
||||||
base::PostTaskAndReplyWithResult(
|
base::PostTaskAndReplyWithResult(
|
||||||
GetExtensionFileTaskRunner().get(), FROM_HERE,
|
GetExtensionFileTaskRunner().get(), FROM_HERE,
|
||||||
base::BindOnce(&LoadUnpacked, extension_dir),
|
base::BindOnce(&LoadUnpacked, extension_dir),
|
||||||
base::BindOnce(&AtomExtensionLoader::FinishExtensionLoad,
|
base::BindOnce(&ElectronExtensionLoader::FinishExtensionLoad,
|
||||||
weak_factory_.GetWeakPtr(), std::move(loaded)));
|
weak_factory_.GetWeakPtr(), std::move(cb)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionLoader::ReloadExtension(const ExtensionId& extension_id) {
|
void ElectronExtensionLoader::ReloadExtension(const ExtensionId& extension_id) {
|
||||||
const Extension* extension = ExtensionRegistry::Get(browser_context_)
|
const Extension* extension = ExtensionRegistry::Get(browser_context_)
|
||||||
->GetInstalledExtension(extension_id);
|
->GetInstalledExtension(extension_id);
|
||||||
// We shouldn't be trying to reload extensions that haven't been added.
|
// We shouldn't be trying to reload extensions that haven't been added.
|
||||||
|
@ -94,31 +97,33 @@ void AtomExtensionLoader::ReloadExtension(const ExtensionId& extension_id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionLoader::UnloadExtension(
|
void ElectronExtensionLoader::UnloadExtension(
|
||||||
const ExtensionId& extension_id,
|
const ExtensionId& extension_id,
|
||||||
extensions::UnloadedExtensionReason reason) {
|
extensions::UnloadedExtensionReason reason) {
|
||||||
extension_registrar_.RemoveExtension(extension_id, reason);
|
extension_registrar_.RemoveExtension(extension_id, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionLoader::FinishExtensionLoad(
|
void ElectronExtensionLoader::FinishExtensionLoad(
|
||||||
base::OnceCallback<void(const Extension*)> done,
|
base::OnceCallback<void(const Extension*, const std::string&)> cb,
|
||||||
scoped_refptr<const Extension> extension) {
|
std::pair<scoped_refptr<const Extension>, std::string> result) {
|
||||||
|
scoped_refptr<const Extension> extension = result.first;
|
||||||
if (extension) {
|
if (extension) {
|
||||||
extension_registrar_.AddExtension(extension);
|
extension_registrar_.AddExtension(extension);
|
||||||
}
|
}
|
||||||
std::move(done).Run(extension.get());
|
std::move(cb).Run(extension.get(), result.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionLoader::FinishExtensionReload(
|
void ElectronExtensionLoader::FinishExtensionReload(
|
||||||
const ExtensionId& old_extension_id,
|
const ExtensionId& old_extension_id,
|
||||||
scoped_refptr<const Extension> extension) {
|
std::pair<scoped_refptr<const Extension>, std::string> result) {
|
||||||
|
scoped_refptr<const Extension> extension = result.first;
|
||||||
if (extension) {
|
if (extension) {
|
||||||
extension_registrar_.AddExtension(extension);
|
extension_registrar_.AddExtension(extension);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionLoader::PreAddExtension(const Extension* extension,
|
void ElectronExtensionLoader::PreAddExtension(const Extension* extension,
|
||||||
const Extension* old_extension) {
|
const Extension* old_extension) {
|
||||||
if (old_extension)
|
if (old_extension)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -138,13 +143,13 @@ void AtomExtensionLoader::PreAddExtension(const Extension* extension,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionLoader::PostActivateExtension(
|
void ElectronExtensionLoader::PostActivateExtension(
|
||||||
scoped_refptr<const Extension> extension) {}
|
scoped_refptr<const Extension> extension) {}
|
||||||
|
|
||||||
void AtomExtensionLoader::PostDeactivateExtension(
|
void ElectronExtensionLoader::PostDeactivateExtension(
|
||||||
scoped_refptr<const Extension> extension) {}
|
scoped_refptr<const Extension> extension) {}
|
||||||
|
|
||||||
void AtomExtensionLoader::LoadExtensionForReload(
|
void ElectronExtensionLoader::LoadExtensionForReload(
|
||||||
const ExtensionId& extension_id,
|
const ExtensionId& extension_id,
|
||||||
const base::FilePath& path,
|
const base::FilePath& path,
|
||||||
LoadErrorBehavior load_error_behavior) {
|
LoadErrorBehavior load_error_behavior) {
|
||||||
|
@ -153,21 +158,21 @@ void AtomExtensionLoader::LoadExtensionForReload(
|
||||||
base::PostTaskAndReplyWithResult(
|
base::PostTaskAndReplyWithResult(
|
||||||
GetExtensionFileTaskRunner().get(), FROM_HERE,
|
GetExtensionFileTaskRunner().get(), FROM_HERE,
|
||||||
base::BindOnce(&LoadUnpacked, path),
|
base::BindOnce(&LoadUnpacked, path),
|
||||||
base::BindOnce(&AtomExtensionLoader::FinishExtensionReload,
|
base::BindOnce(&ElectronExtensionLoader::FinishExtensionReload,
|
||||||
weak_factory_.GetWeakPtr(), extension_id));
|
weak_factory_.GetWeakPtr(), extension_id));
|
||||||
did_schedule_reload_ = true;
|
did_schedule_reload_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionLoader::CanEnableExtension(const Extension* extension) {
|
bool ElectronExtensionLoader::CanEnableExtension(const Extension* extension) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionLoader::CanDisableExtension(const Extension* extension) {
|
bool ElectronExtensionLoader::CanDisableExtension(const Extension* extension) {
|
||||||
// Extensions cannot be disabled by the user.
|
// Extensions cannot be disabled by the user.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionLoader::ShouldBlockExtension(const Extension* extension) {
|
bool ElectronExtensionLoader::ShouldBlockExtension(const Extension* extension) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,11 +2,12 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_LOADER_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_LOADER_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_LOADER_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_LOADER_H_
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "base/macros.h"
|
#include "base/macros.h"
|
||||||
#include "base/memory/ref_counted.h"
|
#include "base/memory/ref_counted.h"
|
||||||
|
@ -27,16 +28,16 @@ namespace extensions {
|
||||||
class Extension;
|
class Extension;
|
||||||
|
|
||||||
// Handles extension loading and reloading using ExtensionRegistrar.
|
// Handles extension loading and reloading using ExtensionRegistrar.
|
||||||
class AtomExtensionLoader : public ExtensionRegistrar::Delegate {
|
class ElectronExtensionLoader : public ExtensionRegistrar::Delegate {
|
||||||
public:
|
public:
|
||||||
explicit AtomExtensionLoader(content::BrowserContext* browser_context);
|
explicit ElectronExtensionLoader(content::BrowserContext* browser_context);
|
||||||
~AtomExtensionLoader() override;
|
~ElectronExtensionLoader() override;
|
||||||
|
|
||||||
// Loads an unpacked extension from a directory synchronously. Returns the
|
// Loads an unpacked extension from a directory synchronously. Returns the
|
||||||
// extension on success, or nullptr otherwise.
|
// extension on success, or nullptr otherwise.
|
||||||
void LoadExtension(
|
void LoadExtension(const base::FilePath& extension_dir,
|
||||||
const base::FilePath& extension_dir,
|
base::OnceCallback<void(const Extension* extension,
|
||||||
base::OnceCallback<void(const Extension* extension)> loaded);
|
const std::string&)> cb);
|
||||||
|
|
||||||
// Starts reloading the extension. A keep-alive is maintained until the
|
// Starts reloading the extension. A keep-alive is maintained until the
|
||||||
// reload succeeds/fails. If the extension is an app, it will be launched upon
|
// reload succeeds/fails. If the extension is an app, it will be launched upon
|
||||||
|
@ -51,11 +52,13 @@ class AtomExtensionLoader : public ExtensionRegistrar::Delegate {
|
||||||
private:
|
private:
|
||||||
// If the extension loaded successfully, enables it. If it's an app, launches
|
// If the extension loaded successfully, enables it. If it's an app, launches
|
||||||
// it. If the load failed, updates ShellKeepAliveRequester.
|
// it. If the load failed, updates ShellKeepAliveRequester.
|
||||||
void FinishExtensionReload(const ExtensionId& old_extension_id,
|
void FinishExtensionReload(
|
||||||
scoped_refptr<const Extension> extension);
|
const ExtensionId& old_extension_id,
|
||||||
|
std::pair<scoped_refptr<const Extension>, std::string> result);
|
||||||
|
|
||||||
void FinishExtensionLoad(base::OnceCallback<void(const Extension*)> loaded,
|
void FinishExtensionLoad(
|
||||||
scoped_refptr<const Extension> extension);
|
base::OnceCallback<void(const Extension*, const std::string&)> cb,
|
||||||
|
std::pair<scoped_refptr<const Extension>, std::string> result);
|
||||||
|
|
||||||
// ExtensionRegistrar::Delegate:
|
// ExtensionRegistrar::Delegate:
|
||||||
void PreAddExtension(const Extension* extension,
|
void PreAddExtension(const Extension* extension,
|
||||||
|
@ -84,11 +87,11 @@ class AtomExtensionLoader : public ExtensionRegistrar::Delegate {
|
||||||
// LoadExtensionForReload().
|
// LoadExtensionForReload().
|
||||||
bool did_schedule_reload_ = false;
|
bool did_schedule_reload_ = false;
|
||||||
|
|
||||||
base::WeakPtrFactory<AtomExtensionLoader> weak_factory_;
|
base::WeakPtrFactory<ElectronExtensionLoader> weak_factory_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionLoader);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionLoader);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_LOADER_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_LOADER_H_
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_extension_system.h"
|
#include "shell/browser/extensions/electron_extension_system.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -30,27 +30,28 @@
|
||||||
#include "extensions/browser/value_store/value_store_factory_impl.h"
|
#include "extensions/browser/value_store/value_store_factory_impl.h"
|
||||||
#include "extensions/common/constants.h"
|
#include "extensions/common/constants.h"
|
||||||
#include "extensions/common/file_util.h"
|
#include "extensions/common/file_util.h"
|
||||||
#include "shell/browser/extensions/atom_extension_loader.h"
|
#include "shell/browser/extensions/electron_extension_loader.h"
|
||||||
|
|
||||||
using content::BrowserContext;
|
using content::BrowserContext;
|
||||||
using content::BrowserThread;
|
using content::BrowserThread;
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
AtomExtensionSystem::AtomExtensionSystem(BrowserContext* browser_context)
|
ElectronExtensionSystem::ElectronExtensionSystem(
|
||||||
|
BrowserContext* browser_context)
|
||||||
: browser_context_(browser_context),
|
: browser_context_(browser_context),
|
||||||
store_factory_(new ValueStoreFactoryImpl(browser_context->GetPath())),
|
store_factory_(new ValueStoreFactoryImpl(browser_context->GetPath())),
|
||||||
weak_factory_(this) {}
|
weak_factory_(this) {}
|
||||||
|
|
||||||
AtomExtensionSystem::~AtomExtensionSystem() = default;
|
ElectronExtensionSystem::~ElectronExtensionSystem() = default;
|
||||||
|
|
||||||
void AtomExtensionSystem::LoadExtension(
|
void ElectronExtensionSystem::LoadExtension(
|
||||||
const base::FilePath& extension_dir,
|
const base::FilePath& extension_dir,
|
||||||
base::OnceCallback<void(const Extension*)> loaded) {
|
base::OnceCallback<void(const Extension*, const std::string&)> cb) {
|
||||||
extension_loader_->LoadExtension(extension_dir, std::move(loaded));
|
extension_loader_->LoadExtension(extension_dir, std::move(cb));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::FinishInitialization() {
|
void ElectronExtensionSystem::FinishInitialization() {
|
||||||
// Inform the rest of the extensions system to start.
|
// Inform the rest of the extensions system to start.
|
||||||
ready_.Signal();
|
ready_.Signal();
|
||||||
content::NotificationService::current()->Notify(
|
content::NotificationService::current()->Notify(
|
||||||
|
@ -59,20 +60,20 @@ void AtomExtensionSystem::FinishInitialization() {
|
||||||
content::NotificationService::NoDetails());
|
content::NotificationService::NoDetails());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::ReloadExtension(const ExtensionId& extension_id) {
|
void ElectronExtensionSystem::ReloadExtension(const ExtensionId& extension_id) {
|
||||||
extension_loader_->ReloadExtension(extension_id);
|
extension_loader_->ReloadExtension(extension_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::RemoveExtension(const ExtensionId& extension_id) {
|
void ElectronExtensionSystem::RemoveExtension(const ExtensionId& extension_id) {
|
||||||
extension_loader_->UnloadExtension(
|
extension_loader_->UnloadExtension(
|
||||||
extension_id, extensions::UnloadedExtensionReason::UNINSTALL);
|
extension_id, extensions::UnloadedExtensionReason::UNINSTALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::Shutdown() {
|
void ElectronExtensionSystem::Shutdown() {
|
||||||
extension_loader_.reset();
|
extension_loader_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::InitForRegularProfile(bool extensions_enabled) {
|
void ElectronExtensionSystem::InitForRegularProfile(bool extensions_enabled) {
|
||||||
service_worker_manager_ =
|
service_worker_manager_ =
|
||||||
std::make_unique<ServiceWorkerManager>(browser_context_);
|
std::make_unique<ServiceWorkerManager>(browser_context_);
|
||||||
runtime_data_ =
|
runtime_data_ =
|
||||||
|
@ -81,56 +82,57 @@ void AtomExtensionSystem::InitForRegularProfile(bool extensions_enabled) {
|
||||||
shared_user_script_master_ =
|
shared_user_script_master_ =
|
||||||
std::make_unique<SharedUserScriptMaster>(browser_context_);
|
std::make_unique<SharedUserScriptMaster>(browser_context_);
|
||||||
app_sorting_ = std::make_unique<NullAppSorting>();
|
app_sorting_ = std::make_unique<NullAppSorting>();
|
||||||
extension_loader_ = std::make_unique<AtomExtensionLoader>(browser_context_);
|
extension_loader_ =
|
||||||
|
std::make_unique<ElectronExtensionLoader>(browser_context_);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtensionService* AtomExtensionSystem::extension_service() {
|
ExtensionService* ElectronExtensionSystem::extension_service() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
RuntimeData* AtomExtensionSystem::runtime_data() {
|
RuntimeData* ElectronExtensionSystem::runtime_data() {
|
||||||
return runtime_data_.get();
|
return runtime_data_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
ManagementPolicy* AtomExtensionSystem::management_policy() {
|
ManagementPolicy* ElectronExtensionSystem::management_policy() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServiceWorkerManager* AtomExtensionSystem::service_worker_manager() {
|
ServiceWorkerManager* ElectronExtensionSystem::service_worker_manager() {
|
||||||
return service_worker_manager_.get();
|
return service_worker_manager_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedUserScriptMaster* AtomExtensionSystem::shared_user_script_master() {
|
SharedUserScriptMaster* ElectronExtensionSystem::shared_user_script_master() {
|
||||||
return new SharedUserScriptMaster(browser_context_);
|
return new SharedUserScriptMaster(browser_context_);
|
||||||
}
|
}
|
||||||
|
|
||||||
StateStore* AtomExtensionSystem::state_store() {
|
StateStore* ElectronExtensionSystem::state_store() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
StateStore* AtomExtensionSystem::rules_store() {
|
StateStore* ElectronExtensionSystem::rules_store() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_refptr<ValueStoreFactory> AtomExtensionSystem::store_factory() {
|
scoped_refptr<ValueStoreFactory> ElectronExtensionSystem::store_factory() {
|
||||||
return store_factory_;
|
return store_factory_;
|
||||||
}
|
}
|
||||||
|
|
||||||
InfoMap* AtomExtensionSystem::info_map() {
|
InfoMap* ElectronExtensionSystem::info_map() {
|
||||||
if (!info_map_.get())
|
if (!info_map_.get())
|
||||||
info_map_ = new InfoMap;
|
info_map_ = new InfoMap;
|
||||||
return info_map_.get();
|
return info_map_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
QuotaService* AtomExtensionSystem::quota_service() {
|
QuotaService* ElectronExtensionSystem::quota_service() {
|
||||||
return quota_service_.get();
|
return quota_service_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
AppSorting* AtomExtensionSystem::app_sorting() {
|
AppSorting* ElectronExtensionSystem::app_sorting() {
|
||||||
return app_sorting_.get();
|
return app_sorting_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::RegisterExtensionWithRequestContexts(
|
void ElectronExtensionSystem::RegisterExtensionWithRequestContexts(
|
||||||
const Extension* extension,
|
const Extension* extension,
|
||||||
base::OnceClosure callback) {
|
base::OnceClosure callback) {
|
||||||
base::PostTaskAndReply(
|
base::PostTaskAndReply(
|
||||||
|
@ -140,24 +142,24 @@ void AtomExtensionSystem::RegisterExtensionWithRequestContexts(
|
||||||
std::move(callback));
|
std::move(callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::UnregisterExtensionWithRequestContexts(
|
void ElectronExtensionSystem::UnregisterExtensionWithRequestContexts(
|
||||||
const std::string& extension_id,
|
const std::string& extension_id,
|
||||||
const UnloadedExtensionReason reason) {}
|
const UnloadedExtensionReason reason) {}
|
||||||
|
|
||||||
const base::OneShotEvent& AtomExtensionSystem::ready() const {
|
const base::OneShotEvent& ElectronExtensionSystem::ready() const {
|
||||||
return ready_;
|
return ready_;
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentVerifier* AtomExtensionSystem::content_verifier() {
|
ContentVerifier* ElectronExtensionSystem::content_verifier() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<ExtensionSet> AtomExtensionSystem::GetDependentExtensions(
|
std::unique_ptr<ExtensionSet> ElectronExtensionSystem::GetDependentExtensions(
|
||||||
const Extension* extension) {
|
const Extension* extension) {
|
||||||
return std::make_unique<ExtensionSet>();
|
return std::make_unique<ExtensionSet>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::InstallUpdate(
|
void ElectronExtensionSystem::InstallUpdate(
|
||||||
const std::string& extension_id,
|
const std::string& extension_id,
|
||||||
const std::string& public_key,
|
const std::string& public_key,
|
||||||
const base::FilePath& temp_dir,
|
const base::FilePath& temp_dir,
|
||||||
|
@ -167,14 +169,14 @@ void AtomExtensionSystem::InstallUpdate(
|
||||||
base::DeleteFile(temp_dir, true /* recursive */);
|
base::DeleteFile(temp_dir, true /* recursive */);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionSystem::FinishDelayedInstallationIfReady(
|
bool ElectronExtensionSystem::FinishDelayedInstallationIfReady(
|
||||||
const std::string& extension_id,
|
const std::string& extension_id,
|
||||||
bool install_immediately) {
|
bool install_immediately) {
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionSystem::OnExtensionRegisteredWithRequestContexts(
|
void ElectronExtensionSystem::OnExtensionRegisteredWithRequestContexts(
|
||||||
scoped_refptr<Extension> extension) {
|
scoped_refptr<Extension> extension) {
|
||||||
ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_);
|
ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_);
|
||||||
registry->AddReady(extension);
|
registry->AddReady(extension);
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_SYSTEM_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_SYSTEM_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_SYSTEM_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_SYSTEM_H_
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -26,21 +26,22 @@ class BrowserContext;
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
class AtomExtensionLoader;
|
class ElectronExtensionLoader;
|
||||||
class ValueStoreFactory;
|
class ValueStoreFactory;
|
||||||
|
|
||||||
// A simplified version of ExtensionSystem for app_shell. Allows
|
// A simplified version of ExtensionSystem for app_shell. Allows
|
||||||
// app_shell to skip initialization of services it doesn't need.
|
// app_shell to skip initialization of services it doesn't need.
|
||||||
class AtomExtensionSystem : public ExtensionSystem {
|
class ElectronExtensionSystem : public ExtensionSystem {
|
||||||
public:
|
public:
|
||||||
using InstallUpdateCallback = ExtensionSystem::InstallUpdateCallback;
|
using InstallUpdateCallback = ExtensionSystem::InstallUpdateCallback;
|
||||||
explicit AtomExtensionSystem(content::BrowserContext* browser_context);
|
explicit ElectronExtensionSystem(content::BrowserContext* browser_context);
|
||||||
~AtomExtensionSystem() override;
|
~ElectronExtensionSystem() override;
|
||||||
|
|
||||||
// Loads an unpacked extension from a directory. Returns the extension on
|
// Loads an unpacked extension from a directory. Returns the extension on
|
||||||
// success, or nullptr otherwise.
|
// success, or nullptr otherwise.
|
||||||
void LoadExtension(const base::FilePath& extension_dir,
|
void LoadExtension(
|
||||||
base::OnceCallback<void(const Extension*)> loaded);
|
const base::FilePath& extension_dir,
|
||||||
|
base::OnceCallback<void(const Extension*, const std::string&)> cb);
|
||||||
|
|
||||||
// Finish initialization for the shell extension system.
|
// Finish initialization for the shell extension system.
|
||||||
void FinishInitialization();
|
void FinishInitialization();
|
||||||
|
@ -98,18 +99,18 @@ class AtomExtensionSystem : public ExtensionSystem {
|
||||||
std::unique_ptr<SharedUserScriptMaster> shared_user_script_master_;
|
std::unique_ptr<SharedUserScriptMaster> shared_user_script_master_;
|
||||||
std::unique_ptr<AppSorting> app_sorting_;
|
std::unique_ptr<AppSorting> app_sorting_;
|
||||||
|
|
||||||
std::unique_ptr<AtomExtensionLoader> extension_loader_;
|
std::unique_ptr<ElectronExtensionLoader> extension_loader_;
|
||||||
|
|
||||||
scoped_refptr<ValueStoreFactory> store_factory_;
|
scoped_refptr<ValueStoreFactory> store_factory_;
|
||||||
|
|
||||||
// Signaled when the extension system has completed its startup tasks.
|
// Signaled when the extension system has completed its startup tasks.
|
||||||
base::OneShotEvent ready_;
|
base::OneShotEvent ready_;
|
||||||
|
|
||||||
base::WeakPtrFactory<AtomExtensionSystem> weak_factory_;
|
base::WeakPtrFactory<ElectronExtensionSystem> weak_factory_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionSystem);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionSystem);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_SYSTEM_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_SYSTEM_H_
|
|
@ -2,49 +2,50 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_extension_system_factory.h"
|
#include "shell/browser/extensions/electron_extension_system_factory.h"
|
||||||
|
|
||||||
#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
#include "components/keyed_service/content/browser_context_dependency_manager.h"
|
||||||
#include "extensions/browser/extension_prefs_factory.h"
|
#include "extensions/browser/extension_prefs_factory.h"
|
||||||
#include "extensions/browser/extension_registry_factory.h"
|
#include "extensions/browser/extension_registry_factory.h"
|
||||||
#include "shell/browser/extensions/atom_extension_system.h"
|
#include "shell/browser/extensions/electron_extension_system.h"
|
||||||
|
|
||||||
using content::BrowserContext;
|
using content::BrowserContext;
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
ExtensionSystem* AtomExtensionSystemFactory::GetForBrowserContext(
|
ExtensionSystem* ElectronExtensionSystemFactory::GetForBrowserContext(
|
||||||
BrowserContext* context) {
|
BrowserContext* context) {
|
||||||
return static_cast<AtomExtensionSystem*>(
|
return static_cast<ElectronExtensionSystem*>(
|
||||||
GetInstance()->GetServiceForBrowserContext(context, true));
|
GetInstance()->GetServiceForBrowserContext(context, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
AtomExtensionSystemFactory* AtomExtensionSystemFactory::GetInstance() {
|
ElectronExtensionSystemFactory* ElectronExtensionSystemFactory::GetInstance() {
|
||||||
return base::Singleton<AtomExtensionSystemFactory>::get();
|
return base::Singleton<ElectronExtensionSystemFactory>::get();
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomExtensionSystemFactory::AtomExtensionSystemFactory()
|
ElectronExtensionSystemFactory::ElectronExtensionSystemFactory()
|
||||||
: ExtensionSystemProvider("AtomExtensionSystem",
|
: ExtensionSystemProvider("ElectronExtensionSystem",
|
||||||
BrowserContextDependencyManager::GetInstance()) {
|
BrowserContextDependencyManager::GetInstance()) {
|
||||||
DependsOn(ExtensionPrefsFactory::GetInstance());
|
DependsOn(ExtensionPrefsFactory::GetInstance());
|
||||||
DependsOn(ExtensionRegistryFactory::GetInstance());
|
DependsOn(ExtensionRegistryFactory::GetInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomExtensionSystemFactory::~AtomExtensionSystemFactory() {}
|
ElectronExtensionSystemFactory::~ElectronExtensionSystemFactory() {}
|
||||||
|
|
||||||
KeyedService* AtomExtensionSystemFactory::BuildServiceInstanceFor(
|
KeyedService* ElectronExtensionSystemFactory::BuildServiceInstanceFor(
|
||||||
BrowserContext* context) const {
|
BrowserContext* context) const {
|
||||||
return new AtomExtensionSystem(context);
|
return new ElectronExtensionSystem(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
BrowserContext* AtomExtensionSystemFactory::GetBrowserContextToUse(
|
BrowserContext* ElectronExtensionSystemFactory::GetBrowserContextToUse(
|
||||||
BrowserContext* context) const {
|
BrowserContext* context) const {
|
||||||
// Use a separate instance for incognito.
|
// Use a separate instance for incognito.
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionSystemFactory::ServiceIsCreatedWithBrowserContext() const {
|
bool ElectronExtensionSystemFactory::ServiceIsCreatedWithBrowserContext()
|
||||||
|
const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_SYSTEM_FACTORY_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_SYSTEM_FACTORY_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_SYSTEM_FACTORY_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_SYSTEM_FACTORY_H_
|
||||||
|
|
||||||
#include "base/macros.h"
|
#include "base/macros.h"
|
||||||
#include "base/memory/singleton.h"
|
#include "base/memory/singleton.h"
|
||||||
|
@ -11,20 +11,20 @@
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
// A factory that provides AtomExtensionSystem.
|
// A factory that provides ElectronExtensionSystem.
|
||||||
class AtomExtensionSystemFactory : public ExtensionSystemProvider {
|
class ElectronExtensionSystemFactory : public ExtensionSystemProvider {
|
||||||
public:
|
public:
|
||||||
// ExtensionSystemProvider implementation:
|
// ExtensionSystemProvider implementation:
|
||||||
ExtensionSystem* GetForBrowserContext(
|
ExtensionSystem* GetForBrowserContext(
|
||||||
content::BrowserContext* context) override;
|
content::BrowserContext* context) override;
|
||||||
|
|
||||||
static AtomExtensionSystemFactory* GetInstance();
|
static ElectronExtensionSystemFactory* GetInstance();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend struct base::DefaultSingletonTraits<AtomExtensionSystemFactory>;
|
friend struct base::DefaultSingletonTraits<ElectronExtensionSystemFactory>;
|
||||||
|
|
||||||
AtomExtensionSystemFactory();
|
ElectronExtensionSystemFactory();
|
||||||
~AtomExtensionSystemFactory() override;
|
~ElectronExtensionSystemFactory() override;
|
||||||
|
|
||||||
// BrowserContextKeyedServiceFactory implementation:
|
// BrowserContextKeyedServiceFactory implementation:
|
||||||
KeyedService* BuildServiceInstanceFor(
|
KeyedService* BuildServiceInstanceFor(
|
||||||
|
@ -33,9 +33,9 @@ class AtomExtensionSystemFactory : public ExtensionSystemProvider {
|
||||||
content::BrowserContext* context) const override;
|
content::BrowserContext* context) const override;
|
||||||
bool ServiceIsCreatedWithBrowserContext() const override;
|
bool ServiceIsCreatedWithBrowserContext() const override;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionSystemFactory);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionSystemFactory);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_SYSTEM_FACTORY_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_SYSTEM_FACTORY_H_
|
|
@ -2,25 +2,25 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_extension_web_contents_observer.h"
|
#include "shell/browser/extensions/electron_extension_web_contents_observer.h"
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
AtomExtensionWebContentsObserver::AtomExtensionWebContentsObserver(
|
ElectronExtensionWebContentsObserver::ElectronExtensionWebContentsObserver(
|
||||||
content::WebContents* web_contents)
|
content::WebContents* web_contents)
|
||||||
: ExtensionWebContentsObserver(web_contents) {}
|
: ExtensionWebContentsObserver(web_contents) {}
|
||||||
|
|
||||||
AtomExtensionWebContentsObserver::~AtomExtensionWebContentsObserver() {}
|
ElectronExtensionWebContentsObserver::~ElectronExtensionWebContentsObserver() {}
|
||||||
|
|
||||||
void AtomExtensionWebContentsObserver::CreateForWebContents(
|
void ElectronExtensionWebContentsObserver::CreateForWebContents(
|
||||||
content::WebContents* web_contents) {
|
content::WebContents* web_contents) {
|
||||||
content::WebContentsUserData<
|
content::WebContentsUserData<
|
||||||
AtomExtensionWebContentsObserver>::CreateForWebContents(web_contents);
|
ElectronExtensionWebContentsObserver>::CreateForWebContents(web_contents);
|
||||||
|
|
||||||
// Initialize this instance if necessary.
|
// Initialize this instance if necessary.
|
||||||
FromWebContents(web_contents)->Initialize();
|
FromWebContents(web_contents)->Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
WEB_CONTENTS_USER_DATA_KEY_IMPL(AtomExtensionWebContentsObserver)
|
WEB_CONTENTS_USER_DATA_KEY_IMPL(ElectronExtensionWebContentsObserver)
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_WEB_CONTENTS_OBSERVER_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_WEB_CONTENTS_OBSERVER_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_WEB_CONTENTS_OBSERVER_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_WEB_CONTENTS_OBSERVER_H_
|
||||||
|
|
||||||
#include "base/macros.h"
|
#include "base/macros.h"
|
||||||
#include "content/public/browser/web_contents_user_data.h"
|
#include "content/public/browser/web_contents_user_data.h"
|
||||||
|
@ -12,26 +12,29 @@
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
// The app_shell version of ExtensionWebContentsObserver.
|
// The app_shell version of ExtensionWebContentsObserver.
|
||||||
class AtomExtensionWebContentsObserver
|
class ElectronExtensionWebContentsObserver
|
||||||
: public ExtensionWebContentsObserver,
|
: public ExtensionWebContentsObserver,
|
||||||
public content::WebContentsUserData<AtomExtensionWebContentsObserver> {
|
public content::WebContentsUserData<
|
||||||
|
ElectronExtensionWebContentsObserver> {
|
||||||
public:
|
public:
|
||||||
~AtomExtensionWebContentsObserver() override;
|
~ElectronExtensionWebContentsObserver() override;
|
||||||
|
|
||||||
// Creates and initializes an instance of this class for the given
|
// Creates and initializes an instance of this class for the given
|
||||||
// |web_contents|, if it doesn't already exist.
|
// |web_contents|, if it doesn't already exist.
|
||||||
static void CreateForWebContents(content::WebContents* web_contents);
|
static void CreateForWebContents(content::WebContents* web_contents);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class content::WebContentsUserData<AtomExtensionWebContentsObserver>;
|
friend class content::WebContentsUserData<
|
||||||
|
ElectronExtensionWebContentsObserver>;
|
||||||
|
|
||||||
explicit AtomExtensionWebContentsObserver(content::WebContents* web_contents);
|
explicit ElectronExtensionWebContentsObserver(
|
||||||
|
content::WebContents* web_contents);
|
||||||
|
|
||||||
WEB_CONTENTS_USER_DATA_KEY_DECL();
|
WEB_CONTENTS_USER_DATA_KEY_DECL();
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionWebContentsObserver);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionWebContentsObserver);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSION_WEB_CONTENTS_OBSERVER_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSION_WEB_CONTENTS_OBSERVER_H_
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_extension_web_contents_observer.h"
|
#include "shell/browser/extensions/electron_extension_web_contents_observer.h"
|
||||||
#include "shell/browser/extensions/electron_messaging_delegate.h"
|
#include "shell/browser/extensions/electron_messaging_delegate.h"
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
@ -22,7 +22,7 @@ MessagingDelegate* ElectronExtensionsAPIClient::GetMessagingDelegate() {
|
||||||
|
|
||||||
void ElectronExtensionsAPIClient::AttachWebContentsHelpers(
|
void ElectronExtensionsAPIClient::AttachWebContentsHelpers(
|
||||||
content::WebContents* web_contents) const {
|
content::WebContents* web_contents) const {
|
||||||
extensions::AtomExtensionWebContentsObserver::CreateForWebContents(
|
extensions::ElectronExtensionWebContentsObserver::CreateForWebContents(
|
||||||
web_contents);
|
web_contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_extensions_browser_client.h"
|
#include "shell/browser/extensions/electron_extensions_browser_client.h"
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -30,13 +30,13 @@
|
||||||
#include "shell/browser/atom_browser_client.h"
|
#include "shell/browser/atom_browser_client.h"
|
||||||
#include "shell/browser/atom_browser_context.h"
|
#include "shell/browser/atom_browser_context.h"
|
||||||
#include "shell/browser/browser.h"
|
#include "shell/browser/browser.h"
|
||||||
#include "shell/browser/extensions/api/runtime/atom_runtime_api_delegate.h"
|
#include "shell/browser/extensions/api/runtime/electron_runtime_api_delegate.h"
|
||||||
#include "shell/browser/extensions/atom_extension_host_delegate.h"
|
#include "shell/browser/extensions/electron_extension_host_delegate.h"
|
||||||
#include "shell/browser/extensions/atom_extension_system_factory.h"
|
#include "shell/browser/extensions/electron_extension_system_factory.h"
|
||||||
#include "shell/browser/extensions/atom_extension_web_contents_observer.h"
|
#include "shell/browser/extensions/electron_extension_web_contents_observer.h"
|
||||||
#include "shell/browser/extensions/atom_navigation_ui_data.h"
|
|
||||||
#include "shell/browser/extensions/electron_extensions_api_client.h"
|
#include "shell/browser/extensions/electron_extensions_api_client.h"
|
||||||
#include "shell/browser/extensions/electron_extensions_browser_api_provider.h"
|
#include "shell/browser/extensions/electron_extensions_browser_api_provider.h"
|
||||||
|
#include "shell/browser/extensions/electron_navigation_ui_data.h"
|
||||||
#include "shell/browser/extensions/electron_process_manager_delegate.h"
|
#include "shell/browser/extensions/electron_process_manager_delegate.h"
|
||||||
|
|
||||||
using content::BrowserContext;
|
using content::BrowserContext;
|
||||||
|
@ -44,7 +44,7 @@ using content::BrowserThread;
|
||||||
|
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
AtomExtensionsBrowserClient::AtomExtensionsBrowserClient()
|
ElectronExtensionsBrowserClient::ElectronExtensionsBrowserClient()
|
||||||
: api_client_(new extensions::ElectronExtensionsAPIClient),
|
: api_client_(new extensions::ElectronExtensionsAPIClient),
|
||||||
process_manager_delegate_(new extensions::ElectronProcessManagerDelegate),
|
process_manager_delegate_(new extensions::ElectronProcessManagerDelegate),
|
||||||
extension_cache_(new extensions::NullExtensionCache()) {
|
extension_cache_(new extensions::NullExtensionCache()) {
|
||||||
|
@ -58,19 +58,19 @@ AtomExtensionsBrowserClient::AtomExtensionsBrowserClient()
|
||||||
std::make_unique<extensions::ElectronExtensionsBrowserAPIProvider>());
|
std::make_unique<extensions::ElectronExtensionsBrowserAPIProvider>());
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomExtensionsBrowserClient::~AtomExtensionsBrowserClient() {}
|
ElectronExtensionsBrowserClient::~ElectronExtensionsBrowserClient() {}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsShuttingDown() {
|
bool ElectronExtensionsBrowserClient::IsShuttingDown() {
|
||||||
return electron::Browser::Get()->is_shutting_down();
|
return electron::Browser::Get()->is_shutting_down();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::AreExtensionsDisabled(
|
bool ElectronExtensionsBrowserClient::AreExtensionsDisabled(
|
||||||
const base::CommandLine& command_line,
|
const base::CommandLine& command_line,
|
||||||
BrowserContext* context) {
|
BrowserContext* context) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsValidContext(BrowserContext* context) {
|
bool ElectronExtensionsBrowserClient::IsValidContext(BrowserContext* context) {
|
||||||
auto context_map = AtomBrowserContext::browser_context_map();
|
auto context_map = AtomBrowserContext::browser_context_map();
|
||||||
for (auto const& entry : context_map) {
|
for (auto const& entry : context_map) {
|
||||||
if (entry.second && entry.second.get() == context)
|
if (entry.second && entry.second.get() == context)
|
||||||
|
@ -79,23 +79,23 @@ bool AtomExtensionsBrowserClient::IsValidContext(BrowserContext* context) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsSameContext(BrowserContext* first,
|
bool ElectronExtensionsBrowserClient::IsSameContext(BrowserContext* first,
|
||||||
BrowserContext* second) {
|
BrowserContext* second) {
|
||||||
return first == second;
|
return first == second;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::HasOffTheRecordContext(
|
bool ElectronExtensionsBrowserClient::HasOffTheRecordContext(
|
||||||
BrowserContext* context) {
|
BrowserContext* context) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BrowserContext* AtomExtensionsBrowserClient::GetOffTheRecordContext(
|
BrowserContext* ElectronExtensionsBrowserClient::GetOffTheRecordContext(
|
||||||
BrowserContext* context) {
|
BrowserContext* context) {
|
||||||
// app_shell only supports a single context.
|
// app_shell only supports a single context.
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BrowserContext* AtomExtensionsBrowserClient::GetOriginalContext(
|
BrowserContext* ElectronExtensionsBrowserClient::GetOriginalContext(
|
||||||
BrowserContext* context) {
|
BrowserContext* context) {
|
||||||
DCHECK(context);
|
DCHECK(context);
|
||||||
if (context->IsOffTheRecord()) {
|
if (context->IsOffTheRecord()) {
|
||||||
|
@ -105,24 +105,24 @@ BrowserContext* AtomExtensionsBrowserClient::GetOriginalContext(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsGuestSession(
|
bool ElectronExtensionsBrowserClient::IsGuestSession(
|
||||||
BrowserContext* context) const {
|
BrowserContext* context) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsExtensionIncognitoEnabled(
|
bool ElectronExtensionsBrowserClient::IsExtensionIncognitoEnabled(
|
||||||
const std::string& extension_id,
|
const std::string& extension_id,
|
||||||
content::BrowserContext* context) const {
|
content::BrowserContext* context) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::CanExtensionCrossIncognito(
|
bool ElectronExtensionsBrowserClient::CanExtensionCrossIncognito(
|
||||||
const extensions::Extension* extension,
|
const extensions::Extension* extension,
|
||||||
content::BrowserContext* context) const {
|
content::BrowserContext* context) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
base::FilePath AtomExtensionsBrowserClient::GetBundleResourcePath(
|
base::FilePath ElectronExtensionsBrowserClient::GetBundleResourcePath(
|
||||||
const network::ResourceRequest& request,
|
const network::ResourceRequest& request,
|
||||||
const base::FilePath& extension_resources_path,
|
const base::FilePath& extension_resources_path,
|
||||||
int* resource_id) const {
|
int* resource_id) const {
|
||||||
|
@ -130,7 +130,7 @@ base::FilePath AtomExtensionsBrowserClient::GetBundleResourcePath(
|
||||||
return base::FilePath();
|
return base::FilePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsBrowserClient::LoadResourceFromResourceBundle(
|
void ElectronExtensionsBrowserClient::LoadResourceFromResourceBundle(
|
||||||
const network::ResourceRequest& request,
|
const network::ResourceRequest& request,
|
||||||
mojo::PendingReceiver<network::mojom::URLLoader> loader,
|
mojo::PendingReceiver<network::mojom::URLLoader> loader,
|
||||||
const base::FilePath& resource_relative_path,
|
const base::FilePath& resource_relative_path,
|
||||||
|
@ -172,7 +172,7 @@ bool AllowCrossRendererResourceLoad(const GURL& url,
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::AllowCrossRendererResourceLoad(
|
bool ElectronExtensionsBrowserClient::AllowCrossRendererResourceLoad(
|
||||||
const GURL& url,
|
const GURL& url,
|
||||||
content::ResourceType resource_type,
|
content::ResourceType resource_type,
|
||||||
ui::PageTransition page_transition,
|
ui::PageTransition page_transition,
|
||||||
|
@ -192,71 +192,73 @@ bool AtomExtensionsBrowserClient::AllowCrossRendererResourceLoad(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
PrefService* AtomExtensionsBrowserClient::GetPrefServiceForContext(
|
PrefService* ElectronExtensionsBrowserClient::GetPrefServiceForContext(
|
||||||
BrowserContext* context) {
|
BrowserContext* context) {
|
||||||
return static_cast<AtomBrowserContext*>(context)->prefs();
|
return static_cast<AtomBrowserContext*>(context)->prefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
|
void ElectronExtensionsBrowserClient::GetEarlyExtensionPrefsObservers(
|
||||||
content::BrowserContext* context,
|
content::BrowserContext* context,
|
||||||
std::vector<extensions::EarlyExtensionPrefsObserver*>* observers) const {}
|
std::vector<extensions::EarlyExtensionPrefsObserver*>* observers) const {}
|
||||||
|
|
||||||
extensions::ProcessManagerDelegate*
|
extensions::ProcessManagerDelegate*
|
||||||
AtomExtensionsBrowserClient::GetProcessManagerDelegate() const {
|
ElectronExtensionsBrowserClient::GetProcessManagerDelegate() const {
|
||||||
return process_manager_delegate_.get();
|
return process_manager_delegate_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<extensions::ExtensionHostDelegate> AtomExtensionsBrowserClient::
|
std::unique_ptr<extensions::ExtensionHostDelegate>
|
||||||
|
ElectronExtensionsBrowserClient::
|
||||||
CreateExtensionHostDelegate() { // TODO(samuelmaddock):
|
CreateExtensionHostDelegate() { // TODO(samuelmaddock):
|
||||||
return base::WrapUnique(new extensions::AtomExtensionHostDelegate);
|
return base::WrapUnique(new extensions::ElectronExtensionHostDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::DidVersionUpdate(BrowserContext* context) {
|
bool ElectronExtensionsBrowserClient::DidVersionUpdate(
|
||||||
|
BrowserContext* context) {
|
||||||
// TODO(jamescook): We might want to tell extensions when app_shell updates.
|
// TODO(jamescook): We might want to tell extensions when app_shell updates.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsBrowserClient::PermitExternalProtocolHandler() {}
|
void ElectronExtensionsBrowserClient::PermitExternalProtocolHandler() {}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsInDemoMode() {
|
bool ElectronExtensionsBrowserClient::IsInDemoMode() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsScreensaverInDemoMode(
|
bool ElectronExtensionsBrowserClient::IsScreensaverInDemoMode(
|
||||||
const std::string& app_id) {
|
const std::string& app_id) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsRunningInForcedAppMode() {
|
bool ElectronExtensionsBrowserClient::IsRunningInForcedAppMode() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsAppModeForcedForApp(
|
bool ElectronExtensionsBrowserClient::IsAppModeForcedForApp(
|
||||||
const extensions::ExtensionId& extension_id) {
|
const extensions::ExtensionId& extension_id) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsLoggedInAsPublicAccount() {
|
bool ElectronExtensionsBrowserClient::IsLoggedInAsPublicAccount() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
extensions::ExtensionSystemProvider*
|
extensions::ExtensionSystemProvider*
|
||||||
AtomExtensionsBrowserClient::GetExtensionSystemFactory() {
|
ElectronExtensionsBrowserClient::GetExtensionSystemFactory() {
|
||||||
return extensions::AtomExtensionSystemFactory::GetInstance();
|
return extensions::ElectronExtensionSystemFactory::GetInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<extensions::RuntimeAPIDelegate>
|
std::unique_ptr<extensions::RuntimeAPIDelegate>
|
||||||
AtomExtensionsBrowserClient::CreateRuntimeAPIDelegate(
|
ElectronExtensionsBrowserClient::CreateRuntimeAPIDelegate(
|
||||||
content::BrowserContext* context) const {
|
content::BrowserContext* context) const {
|
||||||
return std::make_unique<extensions::AtomRuntimeAPIDelegate>(context);
|
return std::make_unique<extensions::ElectronRuntimeAPIDelegate>(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
const extensions::ComponentExtensionResourceManager*
|
const extensions::ComponentExtensionResourceManager*
|
||||||
AtomExtensionsBrowserClient::GetComponentExtensionResourceManager() {
|
ElectronExtensionsBrowserClient::GetComponentExtensionResourceManager() {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsBrowserClient::BroadcastEventToRenderers(
|
void ElectronExtensionsBrowserClient::BroadcastEventToRenderers(
|
||||||
extensions::events::HistogramValue histogram_value,
|
extensions::events::HistogramValue histogram_value,
|
||||||
const std::string& event_name,
|
const std::string& event_name,
|
||||||
std::unique_ptr<base::ListValue> args,
|
std::unique_ptr<base::ListValue> args,
|
||||||
|
@ -264,9 +266,10 @@ void AtomExtensionsBrowserClient::BroadcastEventToRenderers(
|
||||||
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
|
||||||
base::PostTask(
|
base::PostTask(
|
||||||
FROM_HERE, {BrowserThread::UI},
|
FROM_HERE, {BrowserThread::UI},
|
||||||
base::BindOnce(&AtomExtensionsBrowserClient::BroadcastEventToRenderers,
|
base::BindOnce(
|
||||||
base::Unretained(this), histogram_value, event_name,
|
&ElectronExtensionsBrowserClient::BroadcastEventToRenderers,
|
||||||
std::move(args), dispatch_to_off_the_record_profiles));
|
base::Unretained(this), histogram_value, event_name,
|
||||||
|
std::move(args), dispatch_to_off_the_record_profiles));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,49 +284,50 @@ void AtomExtensionsBrowserClient::BroadcastEventToRenderers(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extensions::ExtensionCache* AtomExtensionsBrowserClient::GetExtensionCache() {
|
extensions::ExtensionCache*
|
||||||
|
ElectronExtensionsBrowserClient::GetExtensionCache() {
|
||||||
return extension_cache_.get();
|
return extension_cache_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsBackgroundUpdateAllowed() {
|
bool ElectronExtensionsBrowserClient::IsBackgroundUpdateAllowed() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsMinBrowserVersionSupported(
|
bool ElectronExtensionsBrowserClient::IsMinBrowserVersionSupported(
|
||||||
const std::string& min_version) {
|
const std::string& min_version) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsBrowserClient::SetAPIClientForTest(
|
void ElectronExtensionsBrowserClient::SetAPIClientForTest(
|
||||||
extensions::ExtensionsAPIClient* api_client) {
|
extensions::ExtensionsAPIClient* api_client) {
|
||||||
api_client_.reset(api_client);
|
api_client_.reset(api_client);
|
||||||
}
|
}
|
||||||
|
|
||||||
extensions::ExtensionWebContentsObserver*
|
extensions::ExtensionWebContentsObserver*
|
||||||
AtomExtensionsBrowserClient::GetExtensionWebContentsObserver(
|
ElectronExtensionsBrowserClient::GetExtensionWebContentsObserver(
|
||||||
content::WebContents* web_contents) {
|
content::WebContents* web_contents) {
|
||||||
return extensions::AtomExtensionWebContentsObserver::FromWebContents(
|
return extensions::ElectronExtensionWebContentsObserver::FromWebContents(
|
||||||
web_contents);
|
web_contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
extensions::KioskDelegate* AtomExtensionsBrowserClient::GetKioskDelegate() {
|
extensions::KioskDelegate* ElectronExtensionsBrowserClient::GetKioskDelegate() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsBrowserClient::IsLockScreenContext(
|
bool ElectronExtensionsBrowserClient::IsLockScreenContext(
|
||||||
content::BrowserContext* context) {
|
content::BrowserContext* context) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string AtomExtensionsBrowserClient::GetApplicationLocale() {
|
std::string ElectronExtensionsBrowserClient::GetApplicationLocale() {
|
||||||
return AtomBrowserClient::Get()->GetApplicationLocale();
|
return AtomBrowserClient::Get()->GetApplicationLocale();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string AtomExtensionsBrowserClient::GetUserAgent() const {
|
std::string ElectronExtensionsBrowserClient::GetUserAgent() const {
|
||||||
return AtomBrowserClient::Get()->GetUserAgent();
|
return AtomBrowserClient::Get()->GetUserAgent();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsBrowserClient::RegisterBrowserInterfaceBindersForFrame(
|
void ElectronExtensionsBrowserClient::RegisterBrowserInterfaceBindersForFrame(
|
||||||
service_manager::BinderMapWithContext<content::RenderFrameHost*>* map,
|
service_manager::BinderMapWithContext<content::RenderFrameHost*>* map,
|
||||||
content::RenderFrameHost* render_frame_host,
|
content::RenderFrameHost* render_frame_host,
|
||||||
const extensions::Extension* extension) const {}
|
const extensions::Extension* extension) const {}
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSIONS_BROWSER_CLIENT_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSIONS_BROWSER_CLIENT_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSIONS_BROWSER_CLIENT_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSIONS_BROWSER_CLIENT_H_
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -31,10 +31,11 @@ namespace electron {
|
||||||
// with no related incognito context.
|
// with no related incognito context.
|
||||||
// Must be initialized via InitWithBrowserContext() once the BrowserContext is
|
// Must be initialized via InitWithBrowserContext() once the BrowserContext is
|
||||||
// created.
|
// created.
|
||||||
class AtomExtensionsBrowserClient : public extensions::ExtensionsBrowserClient {
|
class ElectronExtensionsBrowserClient
|
||||||
|
: public extensions::ExtensionsBrowserClient {
|
||||||
public:
|
public:
|
||||||
AtomExtensionsBrowserClient();
|
ElectronExtensionsBrowserClient();
|
||||||
~AtomExtensionsBrowserClient() override;
|
~ElectronExtensionsBrowserClient() override;
|
||||||
|
|
||||||
// ExtensionsBrowserClient overrides:
|
// ExtensionsBrowserClient overrides:
|
||||||
bool IsShuttingDown() override;
|
bool IsShuttingDown() override;
|
||||||
|
@ -137,9 +138,9 @@ class AtomExtensionsBrowserClient : public extensions::ExtensionsBrowserClient {
|
||||||
// The extension cache used for download and installation.
|
// The extension cache used for download and installation.
|
||||||
std::unique_ptr<extensions::ExtensionCache> extension_cache_;
|
std::unique_ptr<extensions::ExtensionCache> extension_cache_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionsBrowserClient);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionsBrowserClient);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace electron
|
} // namespace electron
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_EXTENSIONS_BROWSER_CLIENT_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_EXTENSIONS_BROWSER_CLIENT_H_
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/browser/extensions/atom_navigation_ui_data.h"
|
#include "shell/browser/extensions/electron_navigation_ui_data.h"
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
@ -11,20 +11,20 @@
|
||||||
|
|
||||||
namespace extensions {
|
namespace extensions {
|
||||||
|
|
||||||
AtomNavigationUIData::AtomNavigationUIData() {}
|
ElectronNavigationUIData::ElectronNavigationUIData() {}
|
||||||
|
|
||||||
AtomNavigationUIData::AtomNavigationUIData(
|
ElectronNavigationUIData::ElectronNavigationUIData(
|
||||||
content::NavigationHandle* navigation_handle) {
|
content::NavigationHandle* navigation_handle) {
|
||||||
extension_data_ = std::make_unique<ExtensionNavigationUIData>(
|
extension_data_ = std::make_unique<ExtensionNavigationUIData>(
|
||||||
navigation_handle, extension_misc::kUnknownTabId,
|
navigation_handle, extension_misc::kUnknownTabId,
|
||||||
extension_misc::kUnknownWindowId);
|
extension_misc::kUnknownWindowId);
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomNavigationUIData::~AtomNavigationUIData() {}
|
ElectronNavigationUIData::~ElectronNavigationUIData() {}
|
||||||
|
|
||||||
std::unique_ptr<content::NavigationUIData> AtomNavigationUIData::Clone() {
|
std::unique_ptr<content::NavigationUIData> ElectronNavigationUIData::Clone() {
|
||||||
std::unique_ptr<AtomNavigationUIData> copy =
|
std::unique_ptr<ElectronNavigationUIData> copy =
|
||||||
std::make_unique<AtomNavigationUIData>();
|
std::make_unique<ElectronNavigationUIData>();
|
||||||
|
|
||||||
if (extension_data_)
|
if (extension_data_)
|
||||||
copy->SetExtensionNavigationUIData(extension_data_->DeepCopy());
|
copy->SetExtensionNavigationUIData(extension_data_->DeepCopy());
|
||||||
|
@ -32,7 +32,7 @@ std::unique_ptr<content::NavigationUIData> AtomNavigationUIData::Clone() {
|
||||||
return std::move(copy);
|
return std::move(copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomNavigationUIData::SetExtensionNavigationUIData(
|
void ElectronNavigationUIData::SetExtensionNavigationUIData(
|
||||||
std::unique_ptr<ExtensionNavigationUIData> extension_data) {
|
std::unique_ptr<ExtensionNavigationUIData> extension_data) {
|
||||||
extension_data_ = std::move(extension_data);
|
extension_data_ = std::move(extension_data);
|
||||||
}
|
}
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_BROWSER_EXTENSIONS_ATOM_NAVIGATION_UI_DATA_H_
|
#ifndef SHELL_BROWSER_EXTENSIONS_ELECTRON_NAVIGATION_UI_DATA_H_
|
||||||
#define SHELL_BROWSER_EXTENSIONS_ATOM_NAVIGATION_UI_DATA_H_
|
#define SHELL_BROWSER_EXTENSIONS_ELECTRON_NAVIGATION_UI_DATA_H_
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
@ -18,11 +18,12 @@ namespace extensions {
|
||||||
// beginning of each navigation. The class is instantiated on the UI thread,
|
// beginning of each navigation. The class is instantiated on the UI thread,
|
||||||
// then a copy created using Clone is passed to the content::ResourceRequestInfo
|
// then a copy created using Clone is passed to the content::ResourceRequestInfo
|
||||||
// on the IO thread.
|
// on the IO thread.
|
||||||
class AtomNavigationUIData : public content::NavigationUIData {
|
class ElectronNavigationUIData : public content::NavigationUIData {
|
||||||
public:
|
public:
|
||||||
AtomNavigationUIData();
|
ElectronNavigationUIData();
|
||||||
explicit AtomNavigationUIData(content::NavigationHandle* navigation_handle);
|
explicit ElectronNavigationUIData(
|
||||||
~AtomNavigationUIData() override;
|
content::NavigationHandle* navigation_handle);
|
||||||
|
~ElectronNavigationUIData() override;
|
||||||
|
|
||||||
// Creates a new ChromeNavigationUIData that is a deep copy of the original.
|
// Creates a new ChromeNavigationUIData that is a deep copy of the original.
|
||||||
// Any changes to the original after the clone is created will not be
|
// Any changes to the original after the clone is created will not be
|
||||||
|
@ -40,9 +41,9 @@ class AtomNavigationUIData : public content::NavigationUIData {
|
||||||
// Manages the lifetime of optional ExtensionNavigationUIData information.
|
// Manages the lifetime of optional ExtensionNavigationUIData information.
|
||||||
std::unique_ptr<ExtensionNavigationUIData> extension_data_;
|
std::unique_ptr<ExtensionNavigationUIData> extension_data_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomNavigationUIData);
|
DISALLOW_COPY_AND_ASSIGN(ElectronNavigationUIData);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace extensions
|
} // namespace extensions
|
||||||
|
|
||||||
#endif // SHELL_BROWSER_EXTENSIONS_ATOM_NAVIGATION_UI_DATA_H_
|
#endif // SHELL_BROWSER_EXTENSIONS_ELECTRON_NAVIGATION_UI_DATA_H_
|
|
@ -29,10 +29,10 @@
|
||||||
#include "shell/browser/ui/inspectable_web_contents.h"
|
#include "shell/browser/ui/inspectable_web_contents.h"
|
||||||
#include "shell/browser/ui/inspectable_web_contents_view.h"
|
#include "shell/browser/ui/inspectable_web_contents_view.h"
|
||||||
#include "shell/browser/window_list.h"
|
#include "shell/browser/window_list.h"
|
||||||
#include "shell/common/deprecate_util.h"
|
|
||||||
#include "shell/common/gin_converters/gfx_converter.h"
|
#include "shell/common/gin_converters/gfx_converter.h"
|
||||||
#include "shell/common/gin_helper/dictionary.h"
|
#include "shell/common/gin_helper/dictionary.h"
|
||||||
#include "shell/common/options_switches.h"
|
#include "shell/common/options_switches.h"
|
||||||
|
#include "shell/common/process_util.h"
|
||||||
#include "skia/ext/skia_utils_mac.h"
|
#include "skia/ext/skia_utils_mac.h"
|
||||||
#include "third_party/webrtc/modules/desktop_capture/mac/window_list_utils.h"
|
#include "third_party/webrtc/modules/desktop_capture/mac/window_list_utils.h"
|
||||||
#include "ui/gfx/skia_util.h"
|
#include "ui/gfx/skia_util.h"
|
||||||
|
@ -1463,16 +1463,14 @@ void NativeWindowMac::SetVibrancy(const std::string& type) {
|
||||||
NSVisualEffectMaterial vibrancyType;
|
NSVisualEffectMaterial vibrancyType;
|
||||||
|
|
||||||
if (type == "appearance-based") {
|
if (type == "appearance-based") {
|
||||||
EmitDeprecationWarning(
|
EmitWarning(env, "NSVisualEffectMaterialAppearanceBased" + dep_warn,
|
||||||
env, "NSVisualEffectMaterialAppearanceBased" + dep_warn, "electron");
|
"electron");
|
||||||
vibrancyType = NSVisualEffectMaterialAppearanceBased;
|
vibrancyType = NSVisualEffectMaterialAppearanceBased;
|
||||||
} else if (type == "light") {
|
} else if (type == "light") {
|
||||||
EmitDeprecationWarning(env, "NSVisualEffectMaterialLight" + dep_warn,
|
EmitWarning(env, "NSVisualEffectMaterialLight" + dep_warn, "electron");
|
||||||
"electron");
|
|
||||||
vibrancyType = NSVisualEffectMaterialLight;
|
vibrancyType = NSVisualEffectMaterialLight;
|
||||||
} else if (type == "dark") {
|
} else if (type == "dark") {
|
||||||
EmitDeprecationWarning(env, "NSVisualEffectMaterialDark" + dep_warn,
|
EmitWarning(env, "NSVisualEffectMaterialDark" + dep_warn, "electron");
|
||||||
"electron");
|
|
||||||
vibrancyType = NSVisualEffectMaterialDark;
|
vibrancyType = NSVisualEffectMaterialDark;
|
||||||
} else if (type == "titlebar") {
|
} else if (type == "titlebar") {
|
||||||
vibrancyType = NSVisualEffectMaterialTitlebar;
|
vibrancyType = NSVisualEffectMaterialTitlebar;
|
||||||
|
@ -1495,13 +1493,13 @@ void NativeWindowMac::SetVibrancy(const std::string& type) {
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(7);
|
vibrancyType = static_cast<NSVisualEffectMaterial>(7);
|
||||||
} else if (type == "medium-light") {
|
} else if (type == "medium-light") {
|
||||||
// NSVisualEffectMaterialMediumLight
|
// NSVisualEffectMaterialMediumLight
|
||||||
EmitDeprecationWarning(
|
EmitWarning(env, "NSVisualEffectMaterialMediumLight" + dep_warn,
|
||||||
env, "NSVisualEffectMaterialMediumLight" + dep_warn, "electron");
|
"electron");
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(8);
|
vibrancyType = static_cast<NSVisualEffectMaterial>(8);
|
||||||
} else if (type == "ultra-dark") {
|
} else if (type == "ultra-dark") {
|
||||||
// NSVisualEffectMaterialUltraDark
|
// NSVisualEffectMaterialUltraDark
|
||||||
EmitDeprecationWarning(env, "NSVisualEffectMaterialUltraDark" + dep_warn,
|
EmitWarning(env, "NSVisualEffectMaterialUltraDark" + dep_warn,
|
||||||
"electron");
|
"electron");
|
||||||
vibrancyType = static_cast<NSVisualEffectMaterial>(9);
|
vibrancyType = static_cast<NSVisualEffectMaterial>(9);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
// Copyright (c) 2019 GitHub, Inc.
|
|
||||||
// Use of this source code is governed by the MIT license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef SHELL_COMMON_DEPRECATE_UTIL_H_
|
|
||||||
#define SHELL_COMMON_DEPRECATE_UTIL_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "shell/common/node_includes.h"
|
|
||||||
|
|
||||||
namespace electron {
|
|
||||||
|
|
||||||
void EmitDeprecationWarning(node::Environment* env,
|
|
||||||
const std::string& warning_msg,
|
|
||||||
const std::string& warning_type);
|
|
||||||
|
|
||||||
} // namespace electron
|
|
||||||
|
|
||||||
#endif // SHELL_COMMON_DEPRECATE_UTIL_H_
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/common/extensions/atom_extensions_api_provider.h"
|
#include "shell/common/extensions/electron_extensions_api_provider.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -74,50 +74,51 @@ base::span<const Alias> GetPermissionAliases() {
|
||||||
|
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
AtomExtensionsAPIProvider::AtomExtensionsAPIProvider() = default;
|
ElectronExtensionsAPIProvider::ElectronExtensionsAPIProvider() = default;
|
||||||
AtomExtensionsAPIProvider::~AtomExtensionsAPIProvider() = default;
|
ElectronExtensionsAPIProvider::~ElectronExtensionsAPIProvider() = default;
|
||||||
|
|
||||||
void AtomExtensionsAPIProvider::AddAPIFeatures(
|
void ElectronExtensionsAPIProvider::AddAPIFeatures(
|
||||||
extensions::FeatureProvider* provider) {
|
extensions::FeatureProvider* provider) {
|
||||||
extensions::AddElectronAPIFeatures(provider);
|
extensions::AddElectronAPIFeatures(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsAPIProvider::AddManifestFeatures(
|
void ElectronExtensionsAPIProvider::AddManifestFeatures(
|
||||||
extensions::FeatureProvider* provider) {
|
extensions::FeatureProvider* provider) {
|
||||||
extensions::AddElectronManifestFeatures(provider);
|
extensions::AddElectronManifestFeatures(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsAPIProvider::AddPermissionFeatures(
|
void ElectronExtensionsAPIProvider::AddPermissionFeatures(
|
||||||
extensions::FeatureProvider* provider) {
|
extensions::FeatureProvider* provider) {
|
||||||
// No shell-specific permission features.
|
// No shell-specific permission features.
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsAPIProvider::AddBehaviorFeatures(
|
void ElectronExtensionsAPIProvider::AddBehaviorFeatures(
|
||||||
extensions::FeatureProvider* provider) {
|
extensions::FeatureProvider* provider) {
|
||||||
// No shell-specific behavior features.
|
// No shell-specific behavior features.
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsAPIProvider::AddAPIJSONSources(
|
void ElectronExtensionsAPIProvider::AddAPIJSONSources(
|
||||||
extensions::JSONFeatureProviderSource* json_source) {
|
extensions::JSONFeatureProviderSource* json_source) {
|
||||||
// json_source->LoadJSON(IDR_SHELL_EXTENSION_API_FEATURES);
|
// json_source->LoadJSON(IDR_SHELL_EXTENSION_API_FEATURES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsAPIProvider::IsAPISchemaGenerated(const std::string& name) {
|
bool ElectronExtensionsAPIProvider::IsAPISchemaGenerated(
|
||||||
|
const std::string& name) {
|
||||||
return extensions::api::ElectronGeneratedSchemas::IsGenerated(name);
|
return extensions::api::ElectronGeneratedSchemas::IsGenerated(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
base::StringPiece AtomExtensionsAPIProvider::GetAPISchema(
|
base::StringPiece ElectronExtensionsAPIProvider::GetAPISchema(
|
||||||
const std::string& name) {
|
const std::string& name) {
|
||||||
return extensions::api::ElectronGeneratedSchemas::Get(name);
|
return extensions::api::ElectronGeneratedSchemas::Get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsAPIProvider::RegisterPermissions(
|
void ElectronExtensionsAPIProvider::RegisterPermissions(
|
||||||
extensions::PermissionsInfo* permissions_info) {
|
extensions::PermissionsInfo* permissions_info) {
|
||||||
permissions_info->RegisterPermissions(extensions::GetPermissionInfos(),
|
permissions_info->RegisterPermissions(extensions::GetPermissionInfos(),
|
||||||
extensions::GetPermissionAliases());
|
extensions::GetPermissionAliases());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsAPIProvider::RegisterManifestHandlers() {
|
void ElectronExtensionsAPIProvider::RegisterManifestHandlers() {
|
||||||
extensions::ManifestHandlerRegistry* registry =
|
extensions::ManifestHandlerRegistry* registry =
|
||||||
extensions::ManifestHandlerRegistry::Get();
|
extensions::ManifestHandlerRegistry::Get();
|
||||||
registry->RegisterHandler(
|
registry->RegisterHandler(
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_COMMON_EXTENSIONS_ATOM_EXTENSIONS_API_PROVIDER_H_
|
#ifndef SHELL_COMMON_EXTENSIONS_ELECTRON_EXTENSIONS_API_PROVIDER_H_
|
||||||
#define SHELL_COMMON_EXTENSIONS_ATOM_EXTENSIONS_API_PROVIDER_H_
|
#define SHELL_COMMON_EXTENSIONS_ELECTRON_EXTENSIONS_API_PROVIDER_H_
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -12,10 +12,10 @@
|
||||||
|
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
class AtomExtensionsAPIProvider : public extensions::ExtensionsAPIProvider {
|
class ElectronExtensionsAPIProvider : public extensions::ExtensionsAPIProvider {
|
||||||
public:
|
public:
|
||||||
AtomExtensionsAPIProvider();
|
ElectronExtensionsAPIProvider();
|
||||||
~AtomExtensionsAPIProvider() override;
|
~ElectronExtensionsAPIProvider() override;
|
||||||
|
|
||||||
// ExtensionsAPIProvider:
|
// ExtensionsAPIProvider:
|
||||||
void AddAPIFeatures(extensions::FeatureProvider* provider) override;
|
void AddAPIFeatures(extensions::FeatureProvider* provider) override;
|
||||||
|
@ -31,9 +31,9 @@ class AtomExtensionsAPIProvider : public extensions::ExtensionsAPIProvider {
|
||||||
void RegisterManifestHandlers() override;
|
void RegisterManifestHandlers() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionsAPIProvider);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionsAPIProvider);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace electron
|
} // namespace electron
|
||||||
|
|
||||||
#endif // SHELL_COMMON_EXTENSIONS_ATOM_EXTENSIONS_API_PROVIDER_H_
|
#endif // SHELL_COMMON_EXTENSIONS_ELECTRON_EXTENSIONS_API_PROVIDER_H_
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/common/extensions/atom_extensions_client.h"
|
#include "shell/common/extensions/electron_extensions_client.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
#include "extensions/common/features/simple_feature.h"
|
#include "extensions/common/features/simple_feature.h"
|
||||||
#include "extensions/common/permissions/permission_message_provider.h"
|
#include "extensions/common/permissions/permission_message_provider.h"
|
||||||
#include "extensions/common/url_pattern_set.h"
|
#include "extensions/common/url_pattern_set.h"
|
||||||
#include "shell/common/extensions/atom_extensions_api_provider.h"
|
#include "shell/common/extensions/electron_extensions_api_provider.h"
|
||||||
|
|
||||||
using extensions::ExtensionsClient;
|
using extensions::ExtensionsClient;
|
||||||
|
|
||||||
|
@ -27,11 +27,11 @@ namespace {
|
||||||
|
|
||||||
// TODO(jamescook): Refactor ChromePermissionsMessageProvider so we can share
|
// TODO(jamescook): Refactor ChromePermissionsMessageProvider so we can share
|
||||||
// code. For now, this implementation does nothing.
|
// code. For now, this implementation does nothing.
|
||||||
class AtomPermissionMessageProvider
|
class ElectronPermissionMessageProvider
|
||||||
: public extensions::PermissionMessageProvider {
|
: public extensions::PermissionMessageProvider {
|
||||||
public:
|
public:
|
||||||
AtomPermissionMessageProvider() {}
|
ElectronPermissionMessageProvider() {}
|
||||||
~AtomPermissionMessageProvider() override {}
|
~ElectronPermissionMessageProvider() override {}
|
||||||
|
|
||||||
// PermissionMessageProvider implementation.
|
// PermissionMessageProvider implementation.
|
||||||
extensions::PermissionMessages GetPermissionMessages(
|
extensions::PermissionMessages GetPermissionMessages(
|
||||||
|
@ -60,81 +60,82 @@ class AtomPermissionMessageProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomPermissionMessageProvider);
|
DISALLOW_COPY_AND_ASSIGN(ElectronPermissionMessageProvider);
|
||||||
};
|
};
|
||||||
|
|
||||||
base::LazyInstance<AtomPermissionMessageProvider>::DestructorAtExit
|
base::LazyInstance<ElectronPermissionMessageProvider>::DestructorAtExit
|
||||||
g_permission_message_provider = LAZY_INSTANCE_INITIALIZER;
|
g_permission_message_provider = LAZY_INSTANCE_INITIALIZER;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
AtomExtensionsClient::AtomExtensionsClient()
|
ElectronExtensionsClient::ElectronExtensionsClient()
|
||||||
: webstore_base_url_(extension_urls::kChromeWebstoreBaseURL),
|
: webstore_base_url_(extension_urls::kChromeWebstoreBaseURL),
|
||||||
webstore_update_url_(extension_urls::kChromeWebstoreUpdateURL) {
|
webstore_update_url_(extension_urls::kChromeWebstoreUpdateURL) {
|
||||||
AddAPIProvider(std::make_unique<extensions::CoreExtensionsAPIProvider>());
|
AddAPIProvider(std::make_unique<extensions::CoreExtensionsAPIProvider>());
|
||||||
AddAPIProvider(std::make_unique<AtomExtensionsAPIProvider>());
|
AddAPIProvider(std::make_unique<ElectronExtensionsAPIProvider>());
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomExtensionsClient::~AtomExtensionsClient() {}
|
ElectronExtensionsClient::~ElectronExtensionsClient() {}
|
||||||
|
|
||||||
void AtomExtensionsClient::Initialize() {
|
void ElectronExtensionsClient::Initialize() {
|
||||||
// TODO(jamescook): Do we need to whitelist any extensions?
|
// TODO(jamescook): Do we need to whitelist any extensions?
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsClient::InitializeWebStoreUrls(
|
void ElectronExtensionsClient::InitializeWebStoreUrls(
|
||||||
base::CommandLine* command_line) {}
|
base::CommandLine* command_line) {}
|
||||||
|
|
||||||
const extensions::PermissionMessageProvider&
|
const extensions::PermissionMessageProvider&
|
||||||
AtomExtensionsClient::GetPermissionMessageProvider() const {
|
ElectronExtensionsClient::GetPermissionMessageProvider() const {
|
||||||
NOTIMPLEMENTED();
|
NOTIMPLEMENTED();
|
||||||
return g_permission_message_provider.Get();
|
return g_permission_message_provider.Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string AtomExtensionsClient::GetProductName() {
|
const std::string ElectronExtensionsClient::GetProductName() {
|
||||||
// TODO(samuelmaddock):
|
// TODO(samuelmaddock):
|
||||||
return "app_shell";
|
return "app_shell";
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsClient::FilterHostPermissions(
|
void ElectronExtensionsClient::FilterHostPermissions(
|
||||||
const extensions::URLPatternSet& hosts,
|
const extensions::URLPatternSet& hosts,
|
||||||
extensions::URLPatternSet* new_hosts,
|
extensions::URLPatternSet* new_hosts,
|
||||||
extensions::PermissionIDSet* permissions) const {
|
extensions::PermissionIDSet* permissions) const {
|
||||||
NOTIMPLEMENTED();
|
NOTIMPLEMENTED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsClient::SetScriptingWhitelist(
|
void ElectronExtensionsClient::SetScriptingWhitelist(
|
||||||
const ExtensionsClient::ScriptingWhitelist& whitelist) {
|
const ExtensionsClient::ScriptingWhitelist& whitelist) {
|
||||||
scripting_whitelist_ = whitelist;
|
scripting_whitelist_ = whitelist;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ExtensionsClient::ScriptingWhitelist&
|
const ExtensionsClient::ScriptingWhitelist&
|
||||||
AtomExtensionsClient::GetScriptingWhitelist() const {
|
ElectronExtensionsClient::GetScriptingWhitelist() const {
|
||||||
// TODO(jamescook): Real whitelist.
|
// TODO(jamescook): Real whitelist.
|
||||||
return scripting_whitelist_;
|
return scripting_whitelist_;
|
||||||
}
|
}
|
||||||
|
|
||||||
extensions::URLPatternSet AtomExtensionsClient::GetPermittedChromeSchemeHosts(
|
extensions::URLPatternSet
|
||||||
|
ElectronExtensionsClient::GetPermittedChromeSchemeHosts(
|
||||||
const extensions::Extension* extension,
|
const extensions::Extension* extension,
|
||||||
const extensions::APIPermissionSet& api_permissions) const {
|
const extensions::APIPermissionSet& api_permissions) const {
|
||||||
NOTIMPLEMENTED();
|
NOTIMPLEMENTED();
|
||||||
return extensions::URLPatternSet();
|
return extensions::URLPatternSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsClient::IsScriptableURL(const GURL& url,
|
bool ElectronExtensionsClient::IsScriptableURL(const GURL& url,
|
||||||
std::string* error) const {
|
std::string* error) const {
|
||||||
// No restrictions on URLs.
|
// No restrictions on URLs.
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const GURL& AtomExtensionsClient::GetWebstoreBaseURL() const {
|
const GURL& ElectronExtensionsClient::GetWebstoreBaseURL() const {
|
||||||
return webstore_base_url_;
|
return webstore_base_url_;
|
||||||
}
|
}
|
||||||
|
|
||||||
const GURL& AtomExtensionsClient::GetWebstoreUpdateURL() const {
|
const GURL& ElectronExtensionsClient::GetWebstoreUpdateURL() const {
|
||||||
return webstore_update_url_;
|
return webstore_update_url_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsClient::IsBlacklistUpdateURL(const GURL& url) const {
|
bool ElectronExtensionsClient::IsBlacklistUpdateURL(const GURL& url) const {
|
||||||
// TODO(rockot): Maybe we want to do something else here. For now we accept
|
// TODO(rockot): Maybe we want to do something else here. For now we accept
|
||||||
// any URL as a blacklist URL because we don't really care.
|
// any URL as a blacklist URL because we don't really care.
|
||||||
return true;
|
return true;
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_COMMON_EXTENSIONS_ATOM_EXTENSIONS_CLIENT_H_
|
#ifndef SHELL_COMMON_EXTENSIONS_ELECTRON_EXTENSIONS_CLIENT_H_
|
||||||
#define SHELL_COMMON_EXTENSIONS_ATOM_EXTENSIONS_CLIENT_H_
|
#define SHELL_COMMON_EXTENSIONS_ELECTRON_EXTENSIONS_CLIENT_H_
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -24,12 +24,12 @@ class URLPatternSet;
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
// The app_shell implementation of ExtensionsClient.
|
// The app_shell implementation of ExtensionsClient.
|
||||||
class AtomExtensionsClient : public extensions::ExtensionsClient {
|
class ElectronExtensionsClient : public extensions::ExtensionsClient {
|
||||||
public:
|
public:
|
||||||
typedef extensions::ExtensionsClient::ScriptingWhitelist ScriptingWhitelist;
|
typedef extensions::ExtensionsClient::ScriptingWhitelist ScriptingWhitelist;
|
||||||
|
|
||||||
AtomExtensionsClient();
|
ElectronExtensionsClient();
|
||||||
~AtomExtensionsClient() override;
|
~ElectronExtensionsClient() override;
|
||||||
|
|
||||||
// ExtensionsClient overrides:
|
// ExtensionsClient overrides:
|
||||||
void Initialize() override;
|
void Initialize() override;
|
||||||
|
@ -57,9 +57,9 @@ class AtomExtensionsClient : public extensions::ExtensionsClient {
|
||||||
const GURL webstore_base_url_;
|
const GURL webstore_base_url_;
|
||||||
const GURL webstore_update_url_;
|
const GURL webstore_update_url_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionsClient);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionsClient);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace electron
|
} // namespace electron
|
||||||
|
|
||||||
#endif // SHELL_COMMON_EXTENSIONS_ATOM_EXTENSIONS_CLIENT_H_
|
#endif // SHELL_COMMON_EXTENSIONS_ELECTRON_EXTENSIONS_CLIENT_H_
|
|
@ -12,7 +12,6 @@
|
||||||
#include "base/strings/string_util.h"
|
#include "base/strings/string_util.h"
|
||||||
#include "base/strings/utf_string_conversions.h"
|
#include "base/strings/utf_string_conversions.h"
|
||||||
#include "gin/converter.h"
|
#include "gin/converter.h"
|
||||||
#include "shell/common/deprecate_util.h"
|
|
||||||
#include "shell/common/gin_converters/gfx_converter.h"
|
#include "shell/common/gin_converters/gfx_converter.h"
|
||||||
#include "shell/common/gin_converters/value_converter.h"
|
#include "shell/common/gin_converters/value_converter.h"
|
||||||
#include "shell/common/gin_helper/dictionary.h"
|
#include "shell/common/gin_helper/dictionary.h"
|
||||||
|
|
|
@ -2,16 +2,16 @@
|
||||||
// Use of this source code is governed by the MIT license that can be
|
// Use of this source code is governed by the MIT license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/common/deprecate_util.h"
|
#include "shell/common/process_util.h"
|
||||||
|
|
||||||
#include "gin/dictionary.h"
|
#include "gin/dictionary.h"
|
||||||
#include "shell/common/gin_converters/callback_converter.h"
|
#include "shell/common/gin_converters/callback_converter.h"
|
||||||
|
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
void EmitDeprecationWarning(node::Environment* env,
|
void EmitWarning(node::Environment* env,
|
||||||
const std::string& warning_msg,
|
const std::string& warning_msg,
|
||||||
const std::string& warning_type) {
|
const std::string& warning_type) {
|
||||||
gin::Dictionary process(env->isolate(), env->process_object());
|
gin::Dictionary process(env->isolate(), env->process_object());
|
||||||
|
|
||||||
base::RepeatingCallback<void(base::StringPiece, base::StringPiece,
|
base::RepeatingCallback<void(base::StringPiece, base::StringPiece,
|
20
shell/common/process_util.h
Normal file
20
shell/common/process_util.h
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright (c) 2019 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef SHELL_COMMON_PROCESS_UTIL_H_
|
||||||
|
#define SHELL_COMMON_PROCESS_UTIL_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "shell/common/node_includes.h"
|
||||||
|
|
||||||
|
namespace electron {
|
||||||
|
|
||||||
|
void EmitWarning(node::Environment* env,
|
||||||
|
const std::string& warning_msg,
|
||||||
|
const std::string& warning_type);
|
||||||
|
|
||||||
|
} // namespace electron
|
||||||
|
|
||||||
|
#endif // SHELL_COMMON_PROCESS_UTIL_H_
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "shell/renderer/extensions/atom_extensions_renderer_client.h"
|
#include "shell/renderer/extensions/electron_extensions_renderer_client.h"
|
||||||
|
|
||||||
#include "content/public/renderer/render_thread.h"
|
#include "content/public/renderer/render_thread.h"
|
||||||
#include "extensions/renderer/dispatcher.h"
|
#include "extensions/renderer/dispatcher.h"
|
||||||
|
@ -10,20 +10,20 @@
|
||||||
|
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
AtomExtensionsRendererClient::AtomExtensionsRendererClient()
|
ElectronExtensionsRendererClient::ElectronExtensionsRendererClient()
|
||||||
: dispatcher_(std::make_unique<extensions::Dispatcher>(
|
: dispatcher_(std::make_unique<extensions::Dispatcher>(
|
||||||
std::make_unique<ElectronExtensionsDispatcherDelegate>())) {
|
std::make_unique<ElectronExtensionsDispatcherDelegate>())) {
|
||||||
dispatcher_->OnRenderThreadStarted(content::RenderThread::Get());
|
dispatcher_->OnRenderThreadStarted(content::RenderThread::Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomExtensionsRendererClient::~AtomExtensionsRendererClient() {}
|
ElectronExtensionsRendererClient::~ElectronExtensionsRendererClient() {}
|
||||||
|
|
||||||
bool AtomExtensionsRendererClient::IsIncognitoProcess() const {
|
bool ElectronExtensionsRendererClient::IsIncognitoProcess() const {
|
||||||
// app_shell doesn't support off-the-record contexts.
|
// app_shell doesn't support off-the-record contexts.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AtomExtensionsRendererClient::GetLowestIsolatedWorldId() const {
|
int ElectronExtensionsRendererClient::GetLowestIsolatedWorldId() const {
|
||||||
// app_shell doesn't need to reserve world IDs for anything other than
|
// app_shell doesn't need to reserve world IDs for anything other than
|
||||||
// extensions, so we always return 1. Note that 0 is reserved for the global
|
// extensions, so we always return 1. Note that 0 is reserved for the global
|
||||||
// world.
|
// world.
|
||||||
|
@ -31,33 +31,33 @@ int AtomExtensionsRendererClient::GetLowestIsolatedWorldId() const {
|
||||||
return 10;
|
return 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
extensions::Dispatcher* AtomExtensionsRendererClient::GetDispatcher() {
|
extensions::Dispatcher* ElectronExtensionsRendererClient::GetDispatcher() {
|
||||||
return dispatcher_.get();
|
return dispatcher_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsRendererClient::ExtensionAPIEnabledForServiceWorkerScript(
|
bool ElectronExtensionsRendererClient::
|
||||||
const GURL& scope,
|
ExtensionAPIEnabledForServiceWorkerScript(const GURL& scope,
|
||||||
const GURL& script_url) const {
|
const GURL& script_url) const {
|
||||||
// TODO(nornagon): adapt logic from chrome's version
|
// TODO(nornagon): adapt logic from chrome's version
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AtomExtensionsRendererClient::AllowPopup() {
|
bool ElectronExtensionsRendererClient::AllowPopup() {
|
||||||
// TODO(samuelmaddock):
|
// TODO(samuelmaddock):
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsRendererClient::RunScriptsAtDocumentStart(
|
void ElectronExtensionsRendererClient::RunScriptsAtDocumentStart(
|
||||||
content::RenderFrame* render_frame) {
|
content::RenderFrame* render_frame) {
|
||||||
dispatcher_->RunScriptsAtDocumentStart(render_frame);
|
dispatcher_->RunScriptsAtDocumentStart(render_frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsRendererClient::RunScriptsAtDocumentEnd(
|
void ElectronExtensionsRendererClient::RunScriptsAtDocumentEnd(
|
||||||
content::RenderFrame* render_frame) {
|
content::RenderFrame* render_frame) {
|
||||||
dispatcher_->RunScriptsAtDocumentEnd(render_frame);
|
dispatcher_->RunScriptsAtDocumentEnd(render_frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomExtensionsRendererClient::RunScriptsAtDocumentIdle(
|
void ElectronExtensionsRendererClient::RunScriptsAtDocumentIdle(
|
||||||
content::RenderFrame* render_frame) {
|
content::RenderFrame* render_frame) {
|
||||||
dispatcher_->RunScriptsAtDocumentIdle(render_frame);
|
dispatcher_->RunScriptsAtDocumentIdle(render_frame);
|
||||||
}
|
}
|
|
@ -2,8 +2,8 @@
|
||||||
// Use of this source code is governed by the MIT license that can be
|
// Use of this source code is governed by the MIT license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef SHELL_RENDERER_EXTENSIONS_ATOM_EXTENSIONS_RENDERER_CLIENT_H_
|
#ifndef SHELL_RENDERER_EXTENSIONS_ELECTRON_EXTENSIONS_RENDERER_CLIENT_H_
|
||||||
#define SHELL_RENDERER_EXTENSIONS_ATOM_EXTENSIONS_RENDERER_CLIENT_H_
|
#define SHELL_RENDERER_EXTENSIONS_ELECTRON_EXTENSIONS_RENDERER_CLIENT_H_
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
@ -20,11 +20,11 @@ class Dispatcher;
|
||||||
|
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
class AtomExtensionsRendererClient
|
class ElectronExtensionsRendererClient
|
||||||
: public extensions::ExtensionsRendererClient {
|
: public extensions::ExtensionsRendererClient {
|
||||||
public:
|
public:
|
||||||
AtomExtensionsRendererClient();
|
ElectronExtensionsRendererClient();
|
||||||
~AtomExtensionsRendererClient() override;
|
~ElectronExtensionsRendererClient() override;
|
||||||
|
|
||||||
// ExtensionsRendererClient implementation.
|
// ExtensionsRendererClient implementation.
|
||||||
bool IsIncognitoProcess() const override;
|
bool IsIncognitoProcess() const override;
|
||||||
|
@ -43,9 +43,9 @@ class AtomExtensionsRendererClient
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<extensions::Dispatcher> dispatcher_;
|
std::unique_ptr<extensions::Dispatcher> dispatcher_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomExtensionsRendererClient);
|
DISALLOW_COPY_AND_ASSIGN(ElectronExtensionsRendererClient);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace electron
|
} // namespace electron
|
||||||
|
|
||||||
#endif // SHELL_RENDERER_EXTENSIONS_ATOM_EXTENSIONS_RENDERER_CLIENT_H_
|
#endif // SHELL_RENDERER_EXTENSIONS_ELECTRON_EXTENSIONS_RENDERER_CLIENT_H_
|
|
@ -73,8 +73,8 @@
|
||||||
#include "extensions/renderer/guest_view/extensions_guest_view_container.h"
|
#include "extensions/renderer/guest_view/extensions_guest_view_container.h"
|
||||||
#include "extensions/renderer/guest_view/extensions_guest_view_container_dispatcher.h"
|
#include "extensions/renderer/guest_view/extensions_guest_view_container_dispatcher.h"
|
||||||
#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h"
|
#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h"
|
||||||
#include "shell/common/extensions/atom_extensions_client.h"
|
#include "shell/common/extensions/electron_extensions_client.h"
|
||||||
#include "shell/renderer/extensions/atom_extensions_renderer_client.h"
|
#include "shell/renderer/extensions/electron_extensions_renderer_client.h"
|
||||||
#endif // BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#endif // BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
|
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
@ -149,7 +149,7 @@ void RendererClientBase::RenderThreadStarted() {
|
||||||
extensions_client_.reset(CreateExtensionsClient());
|
extensions_client_.reset(CreateExtensionsClient());
|
||||||
extensions::ExtensionsClient::Set(extensions_client_.get());
|
extensions::ExtensionsClient::Set(extensions_client_.get());
|
||||||
|
|
||||||
extensions_renderer_client_.reset(new AtomExtensionsRendererClient);
|
extensions_renderer_client_.reset(new ElectronExtensionsRendererClient);
|
||||||
extensions::ExtensionsRendererClient::Set(extensions_renderer_client_.get());
|
extensions::ExtensionsRendererClient::Set(extensions_renderer_client_.get());
|
||||||
|
|
||||||
thread->AddObserver(extensions_renderer_client_->GetDispatcher());
|
thread->AddObserver(extensions_renderer_client_->GetDispatcher());
|
||||||
|
@ -386,7 +386,7 @@ v8::Local<v8::Value> RendererClientBase::RunScript(
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
extensions::ExtensionsClient* RendererClientBase::CreateExtensionsClient() {
|
extensions::ExtensionsClient* RendererClientBase::CreateExtensionsClient() {
|
||||||
return new AtomExtensionsClient;
|
return new ElectronExtensionsClient;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ class ExtensionsClient;
|
||||||
namespace electron {
|
namespace electron {
|
||||||
|
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
class AtomExtensionsRendererClient;
|
class ElectronExtensionsRendererClient;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class RendererClientBase : public content::ContentRendererClient
|
class RendererClientBase : public content::ContentRendererClient
|
||||||
|
@ -115,7 +115,7 @@ class RendererClientBase : public content::ContentRendererClient
|
||||||
private:
|
private:
|
||||||
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
|
||||||
std::unique_ptr<extensions::ExtensionsClient> extensions_client_;
|
std::unique_ptr<extensions::ExtensionsClient> extensions_client_;
|
||||||
std::unique_ptr<AtomExtensionsRendererClient> extensions_renderer_client_;
|
std::unique_ptr<ElectronExtensionsRendererClient> extensions_renderer_client_;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WIDEVINE_CDM_AVAILABLE)
|
#if defined(WIDEVINE_CDM_AVAILABLE)
|
||||||
|
|
|
@ -3578,201 +3578,6 @@ describe('BrowserWindow module', () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('extensions and dev tools extensions', () => {
|
|
||||||
let showPanelTimeoutId: NodeJS.Timeout | null = null
|
|
||||||
|
|
||||||
const showLastDevToolsPanel = (w: BrowserWindow) => {
|
|
||||||
w.webContents.once('devtools-opened', () => {
|
|
||||||
const show = () => {
|
|
||||||
if (w == null || w.isDestroyed()) return
|
|
||||||
const { devToolsWebContents } = w as unknown as { devToolsWebContents: WebContents | undefined }
|
|
||||||
if (devToolsWebContents == null || devToolsWebContents.isDestroyed()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const showLastPanel = () => {
|
|
||||||
// this is executed in the devtools context, where UI is a global
|
|
||||||
const { UI } = (window as any)
|
|
||||||
const lastPanelId = UI.inspectorView._tabbedPane._tabs.peekLast().id
|
|
||||||
UI.inspectorView.showPanel(lastPanelId)
|
|
||||||
}
|
|
||||||
devToolsWebContents.executeJavaScript(`(${showLastPanel})()`, false).then(() => {
|
|
||||||
showPanelTimeoutId = setTimeout(show, 100)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
showPanelTimeoutId = setTimeout(show, 100)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
if (showPanelTimeoutId != null) {
|
|
||||||
clearTimeout(showPanelTimeoutId)
|
|
||||||
showPanelTimeoutId = null
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('BrowserWindow.addDevToolsExtension', () => {
|
|
||||||
describe('for invalid extensions', () => {
|
|
||||||
it('throws errors for missing manifest.json files', () => {
|
|
||||||
const nonexistentExtensionPath = path.join(__dirname, 'does-not-exist')
|
|
||||||
expect(() => {
|
|
||||||
BrowserWindow.addDevToolsExtension(nonexistentExtensionPath)
|
|
||||||
}).to.throw(/ENOENT: no such file or directory/)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('throws errors for invalid manifest.json files', () => {
|
|
||||||
const badManifestExtensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'bad-manifest')
|
|
||||||
expect(() => {
|
|
||||||
BrowserWindow.addDevToolsExtension(badManifestExtensionPath)
|
|
||||||
}).to.throw(/Unexpected token }/)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('for a valid extension', () => {
|
|
||||||
const extensionName = 'foo'
|
|
||||||
|
|
||||||
before(() => {
|
|
||||||
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'foo')
|
|
||||||
BrowserWindow.addDevToolsExtension(extensionPath)
|
|
||||||
expect(BrowserWindow.getDevToolsExtensions()).to.have.property(extensionName)
|
|
||||||
})
|
|
||||||
|
|
||||||
after(() => {
|
|
||||||
BrowserWindow.removeDevToolsExtension('foo')
|
|
||||||
expect(BrowserWindow.getDevToolsExtensions()).to.not.have.property(extensionName)
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('when the devtools is docked', () => {
|
|
||||||
let message: any
|
|
||||||
let w: BrowserWindow
|
|
||||||
before(async () => {
|
|
||||||
w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true } })
|
|
||||||
const p = new Promise(resolve => ipcMain.once('answer', (event, message) => {
|
|
||||||
resolve(message)
|
|
||||||
}))
|
|
||||||
showLastDevToolsPanel(w)
|
|
||||||
w.loadURL('about:blank')
|
|
||||||
w.webContents.openDevTools({ mode: 'bottom' })
|
|
||||||
message = await p
|
|
||||||
})
|
|
||||||
after(closeAllWindows)
|
|
||||||
|
|
||||||
describe('created extension info', function () {
|
|
||||||
it('has proper "runtimeId"', async function () {
|
|
||||||
expect(message).to.have.ownProperty('runtimeId')
|
|
||||||
expect(message.runtimeId).to.equal(extensionName)
|
|
||||||
})
|
|
||||||
it('has "tabId" matching webContents id', function () {
|
|
||||||
expect(message).to.have.ownProperty('tabId')
|
|
||||||
expect(message.tabId).to.equal(w.webContents.id)
|
|
||||||
})
|
|
||||||
it('has "i18nString" with proper contents', function () {
|
|
||||||
expect(message).to.have.ownProperty('i18nString')
|
|
||||||
expect(message.i18nString).to.equal('foo - bar (baz)')
|
|
||||||
})
|
|
||||||
it('has "storageItems" with proper contents', function () {
|
|
||||||
expect(message).to.have.ownProperty('storageItems')
|
|
||||||
expect(message.storageItems).to.deep.equal({
|
|
||||||
local: {
|
|
||||||
set: { hello: 'world', world: 'hello' },
|
|
||||||
remove: { world: 'hello' },
|
|
||||||
clear: {}
|
|
||||||
},
|
|
||||||
sync: {
|
|
||||||
set: { foo: 'bar', bar: 'foo' },
|
|
||||||
remove: { foo: 'bar' },
|
|
||||||
clear: {}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('when the devtools is undocked', () => {
|
|
||||||
let message: any
|
|
||||||
let w: BrowserWindow
|
|
||||||
before(async () => {
|
|
||||||
w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true } })
|
|
||||||
showLastDevToolsPanel(w)
|
|
||||||
w.loadURL('about:blank')
|
|
||||||
w.webContents.openDevTools({ mode: 'undocked' })
|
|
||||||
message = await new Promise(resolve => ipcMain.once('answer', (event, message) => {
|
|
||||||
resolve(message)
|
|
||||||
}))
|
|
||||||
})
|
|
||||||
after(closeAllWindows)
|
|
||||||
|
|
||||||
describe('created extension info', function () {
|
|
||||||
it('has proper "runtimeId"', function () {
|
|
||||||
expect(message).to.have.ownProperty('runtimeId')
|
|
||||||
expect(message.runtimeId).to.equal(extensionName)
|
|
||||||
})
|
|
||||||
it('has "tabId" matching webContents id', function () {
|
|
||||||
expect(message).to.have.ownProperty('tabId')
|
|
||||||
expect(message.tabId).to.equal(w.webContents.id)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('works when used with partitions', async () => {
|
|
||||||
const w = new BrowserWindow({
|
|
||||||
show: false,
|
|
||||||
webPreferences: {
|
|
||||||
nodeIntegration: true,
|
|
||||||
partition: 'temp'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'foo')
|
|
||||||
BrowserWindow.addDevToolsExtension(extensionPath)
|
|
||||||
try {
|
|
||||||
showLastDevToolsPanel(w)
|
|
||||||
|
|
||||||
const p: Promise<any> = new Promise(resolve => ipcMain.once('answer', function (event, message) {
|
|
||||||
resolve(message)
|
|
||||||
}))
|
|
||||||
|
|
||||||
w.loadURL('about:blank')
|
|
||||||
w.webContents.openDevTools({ mode: 'bottom' })
|
|
||||||
const message = await p
|
|
||||||
expect(message.runtimeId).to.equal('foo')
|
|
||||||
} finally {
|
|
||||||
BrowserWindow.removeDevToolsExtension('foo')
|
|
||||||
await closeAllWindows()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
it('serializes the registered extensions on quit', () => {
|
|
||||||
const extensionName = 'foo'
|
|
||||||
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', extensionName)
|
|
||||||
const serializedPath = path.join(app.getPath('userData'), 'DevTools Extensions')
|
|
||||||
|
|
||||||
BrowserWindow.addDevToolsExtension(extensionPath)
|
|
||||||
app.emit('will-quit')
|
|
||||||
expect(JSON.parse(fs.readFileSync(serializedPath, 'utf8'))).to.deep.equal([extensionPath])
|
|
||||||
|
|
||||||
BrowserWindow.removeDevToolsExtension(extensionName)
|
|
||||||
app.emit('will-quit')
|
|
||||||
expect(fs.existsSync(serializedPath)).to.be.false('file exists')
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('BrowserWindow.addExtension', () => {
|
|
||||||
it('throws errors for missing manifest.json files', () => {
|
|
||||||
expect(() => {
|
|
||||||
BrowserWindow.addExtension(path.join(__dirname, 'does-not-exist'))
|
|
||||||
}).to.throw('ENOENT: no such file or directory')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('throws errors for invalid manifest.json files', () => {
|
|
||||||
expect(() => {
|
|
||||||
BrowserWindow.addExtension(path.join(__dirname, 'fixtures', 'devtools-extensions', 'bad-manifest'))
|
|
||||||
}).to.throw('Unexpected token }')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
ifdescribe(process.platform === 'darwin')('previewFile', () => {
|
ifdescribe(process.platform === 'darwin')('previewFile', () => {
|
||||||
afterEach(closeAllWindows)
|
afterEach(closeAllWindows)
|
||||||
it('opens the path in Quick Look on macOS', () => {
|
it('opens the path in Quick Look on macOS', () => {
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
import { expect } from 'chai'
|
|
||||||
import * as path from 'path'
|
|
||||||
|
|
||||||
import { closeWindow } from './window-helpers'
|
|
||||||
import { emittedNTimes } from './events-helpers'
|
|
||||||
|
|
||||||
import { BrowserWindow, ipcMain, WebContents } from 'electron'
|
|
||||||
|
|
||||||
describe('chrome extension content scripts', () => {
|
|
||||||
const fixtures = path.resolve(__dirname, 'fixtures')
|
|
||||||
const extensionPath = path.resolve(fixtures, 'extensions')
|
|
||||||
|
|
||||||
const addExtension = (name: string) => BrowserWindow.addExtension(path.resolve(extensionPath, name))
|
|
||||||
const removeAllExtensions = () => {
|
|
||||||
Object.keys(BrowserWindow.getExtensions()).map(extName => {
|
|
||||||
BrowserWindow.removeExtension(extName)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
let responseIdCounter = 0
|
|
||||||
const executeJavaScriptInFrame = (webContents: WebContents, frameRoutingId: number, code: string) => {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
const responseId = responseIdCounter++
|
|
||||||
ipcMain.once(`executeJavaScriptInFrame_${responseId}`, (event, result) => {
|
|
||||||
resolve(result)
|
|
||||||
})
|
|
||||||
webContents.send('executeJavaScriptInFrame', frameRoutingId, code, responseId)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const generateTests = (sandboxEnabled: boolean, contextIsolationEnabled: boolean) => {
|
|
||||||
describe(`with sandbox ${sandboxEnabled ? 'enabled' : 'disabled'} and context isolation ${contextIsolationEnabled ? 'enabled' : 'disabled'}`, () => {
|
|
||||||
let w: BrowserWindow
|
|
||||||
|
|
||||||
describe('supports "run_at" option', () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
await closeWindow(w)
|
|
||||||
w = new BrowserWindow({
|
|
||||||
show: false,
|
|
||||||
width: 400,
|
|
||||||
height: 400,
|
|
||||||
webPreferences: {
|
|
||||||
contextIsolation: contextIsolationEnabled,
|
|
||||||
sandbox: sandboxEnabled
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
removeAllExtensions()
|
|
||||||
return closeWindow(w).then(() => { w = null as unknown as BrowserWindow })
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should run content script at document_start', () => {
|
|
||||||
addExtension('content-script-document-start')
|
|
||||||
w.webContents.once('dom-ready', async () => {
|
|
||||||
const result = await w.webContents.executeJavaScript('document.documentElement.style.backgroundColor')
|
|
||||||
expect(result).to.equal('red')
|
|
||||||
})
|
|
||||||
w.loadURL('about:blank')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should run content script at document_idle', async () => {
|
|
||||||
addExtension('content-script-document-idle')
|
|
||||||
w.loadURL('about:blank')
|
|
||||||
const result = await w.webContents.executeJavaScript('document.body.style.backgroundColor')
|
|
||||||
expect(result).to.equal('red')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should run content script at document_end', () => {
|
|
||||||
addExtension('content-script-document-end')
|
|
||||||
w.webContents.once('did-finish-load', async () => {
|
|
||||||
const result = await w.webContents.executeJavaScript('document.documentElement.style.backgroundColor')
|
|
||||||
expect(result).to.equal('red')
|
|
||||||
})
|
|
||||||
w.loadURL('about:blank')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('supports "all_frames" option', () => {
|
|
||||||
const contentScript = path.resolve(fixtures, 'extensions/content-script')
|
|
||||||
|
|
||||||
// Computed style values
|
|
||||||
const COLOR_RED = `rgb(255, 0, 0)`
|
|
||||||
const COLOR_BLUE = `rgb(0, 0, 255)`
|
|
||||||
const COLOR_TRANSPARENT = `rgba(0, 0, 0, 0)`
|
|
||||||
|
|
||||||
before(() => {
|
|
||||||
BrowserWindow.addExtension(contentScript)
|
|
||||||
})
|
|
||||||
|
|
||||||
after(() => {
|
|
||||||
BrowserWindow.removeExtension('content-script-test')
|
|
||||||
})
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
w = new BrowserWindow({
|
|
||||||
show: false,
|
|
||||||
webPreferences: {
|
|
||||||
// enable content script injection in subframes
|
|
||||||
nodeIntegrationInSubFrames: true,
|
|
||||||
preload: path.join(contentScript, 'all_frames-preload.js')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(() =>
|
|
||||||
closeWindow(w).then(() => {
|
|
||||||
w = null as unknown as BrowserWindow
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
it('applies matching rules in subframes', async () => {
|
|
||||||
const detailsPromise = emittedNTimes(w.webContents, 'did-frame-finish-load', 2)
|
|
||||||
w.loadFile(path.join(contentScript, 'frame-with-frame.html'))
|
|
||||||
const frameEvents = await detailsPromise
|
|
||||||
await Promise.all(
|
|
||||||
frameEvents.map(async frameEvent => {
|
|
||||||
const [, isMainFrame, , frameRoutingId] = frameEvent
|
|
||||||
const result: any = await executeJavaScriptInFrame(
|
|
||||||
w.webContents,
|
|
||||||
frameRoutingId,
|
|
||||||
`(() => {
|
|
||||||
const a = document.getElementById('all_frames_enabled')
|
|
||||||
const b = document.getElementById('all_frames_disabled')
|
|
||||||
return {
|
|
||||||
enabledColor: getComputedStyle(a).backgroundColor,
|
|
||||||
disabledColor: getComputedStyle(b).backgroundColor
|
|
||||||
}
|
|
||||||
})()`
|
|
||||||
)
|
|
||||||
expect(result.enabledColor).to.equal(COLOR_RED)
|
|
||||||
if (isMainFrame) {
|
|
||||||
expect(result.disabledColor).to.equal(COLOR_BLUE)
|
|
||||||
} else {
|
|
||||||
expect(result.disabledColor).to.equal(COLOR_TRANSPARENT) // null color
|
|
||||||
}
|
|
||||||
})
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
generateTests(false, false)
|
|
||||||
generateTests(false, true)
|
|
||||||
generateTests(true, false)
|
|
||||||
generateTests(true, true)
|
|
||||||
})
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { expect } from 'chai'
|
import { expect } from 'chai'
|
||||||
import { session, BrowserWindow, ipcMain, WebContents } from 'electron'
|
import { app, session, BrowserWindow, ipcMain, WebContents } from 'electron'
|
||||||
import { closeAllWindows, closeWindow } from './window-helpers'
|
import { closeAllWindows, closeWindow } from './window-helpers'
|
||||||
import * as http from 'http'
|
import * as http from 'http'
|
||||||
import { AddressInfo } from 'net'
|
import { AddressInfo } from 'net'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import { ifdescribe } from './spec-helpers'
|
import { ifdescribe } from './spec-helpers'
|
||||||
import { emittedOnce } from './events-helpers'
|
import { emittedOnce, emittedNTimes } from './events-helpers'
|
||||||
|
|
||||||
const fixtures = path.join(__dirname, 'fixtures')
|
const fixtures = path.join(__dirname, 'fixtures')
|
||||||
|
|
||||||
|
@ -243,6 +243,150 @@ ifdescribe(process.electronBinding('features').isExtensionsEnabled())('chrome ex
|
||||||
expect(bg).to.equal('')
|
expect(bg).to.equal('')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('chrome extension content scripts', () => {
|
||||||
|
const fixtures = path.resolve(__dirname, 'fixtures')
|
||||||
|
const extensionPath = path.resolve(fixtures, 'extensions')
|
||||||
|
|
||||||
|
const addExtension = (name: string) => session.defaultSession.loadExtension(path.resolve(extensionPath, name))
|
||||||
|
const removeAllExtensions = () => {
|
||||||
|
Object.keys(session.defaultSession.getAllExtensions()).map(extName => {
|
||||||
|
session.defaultSession.removeExtension(extName)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let responseIdCounter = 0
|
||||||
|
const executeJavaScriptInFrame = (webContents: WebContents, frameRoutingId: number, code: string) => {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
const responseId = responseIdCounter++
|
||||||
|
ipcMain.once(`executeJavaScriptInFrame_${responseId}`, (event, result) => {
|
||||||
|
resolve(result)
|
||||||
|
})
|
||||||
|
webContents.send('executeJavaScriptInFrame', frameRoutingId, code, responseId)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const generateTests = (sandboxEnabled: boolean, contextIsolationEnabled: boolean) => {
|
||||||
|
describe(`with sandbox ${sandboxEnabled ? 'enabled' : 'disabled'} and context isolation ${contextIsolationEnabled ? 'enabled' : 'disabled'}`, () => {
|
||||||
|
let w: BrowserWindow
|
||||||
|
|
||||||
|
describe('supports "run_at" option', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await closeWindow(w)
|
||||||
|
w = new BrowserWindow({
|
||||||
|
show: false,
|
||||||
|
width: 400,
|
||||||
|
height: 400,
|
||||||
|
webPreferences: {
|
||||||
|
contextIsolation: contextIsolationEnabled,
|
||||||
|
sandbox: sandboxEnabled
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
removeAllExtensions()
|
||||||
|
return closeWindow(w).then(() => { w = null as unknown as BrowserWindow })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should run content script at document_start', async () => {
|
||||||
|
await addExtension('content-script-document-start')
|
||||||
|
w.webContents.once('dom-ready', async () => {
|
||||||
|
const result = await w.webContents.executeJavaScript('document.documentElement.style.backgroundColor')
|
||||||
|
expect(result).to.equal('red')
|
||||||
|
})
|
||||||
|
w.loadURL(url)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should run content script at document_idle', async () => {
|
||||||
|
await addExtension('content-script-document-idle')
|
||||||
|
w.loadURL(url)
|
||||||
|
const result = await w.webContents.executeJavaScript('document.body.style.backgroundColor')
|
||||||
|
expect(result).to.equal('red')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should run content script at document_end', async () => {
|
||||||
|
await addExtension('content-script-document-end')
|
||||||
|
w.webContents.once('did-finish-load', async () => {
|
||||||
|
const result = await w.webContents.executeJavaScript('document.documentElement.style.backgroundColor')
|
||||||
|
expect(result).to.equal('red')
|
||||||
|
})
|
||||||
|
w.loadURL(url)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// TODO(nornagon): real extensions don't load on file: urls, so this
|
||||||
|
// test needs to be updated to serve its content over http.
|
||||||
|
describe.skip('supports "all_frames" option', () => {
|
||||||
|
const contentScript = path.resolve(fixtures, 'extensions/content-script')
|
||||||
|
|
||||||
|
// Computed style values
|
||||||
|
const COLOR_RED = `rgb(255, 0, 0)`
|
||||||
|
const COLOR_BLUE = `rgb(0, 0, 255)`
|
||||||
|
const COLOR_TRANSPARENT = `rgba(0, 0, 0, 0)`
|
||||||
|
|
||||||
|
before(() => {
|
||||||
|
BrowserWindow.addExtension(contentScript)
|
||||||
|
})
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
BrowserWindow.removeExtension('content-script-test')
|
||||||
|
})
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
w = new BrowserWindow({
|
||||||
|
show: false,
|
||||||
|
webPreferences: {
|
||||||
|
// enable content script injection in subframes
|
||||||
|
nodeIntegrationInSubFrames: true,
|
||||||
|
preload: path.join(contentScript, 'all_frames-preload.js')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(() =>
|
||||||
|
closeWindow(w).then(() => {
|
||||||
|
w = null as unknown as BrowserWindow
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
it('applies matching rules in subframes', async () => {
|
||||||
|
const detailsPromise = emittedNTimes(w.webContents, 'did-frame-finish-load', 2)
|
||||||
|
w.loadFile(path.join(contentScript, 'frame-with-frame.html'))
|
||||||
|
const frameEvents = await detailsPromise
|
||||||
|
await Promise.all(
|
||||||
|
frameEvents.map(async frameEvent => {
|
||||||
|
const [, isMainFrame, , frameRoutingId] = frameEvent
|
||||||
|
const result: any = await executeJavaScriptInFrame(
|
||||||
|
w.webContents,
|
||||||
|
frameRoutingId,
|
||||||
|
`(() => {
|
||||||
|
const a = document.getElementById('all_frames_enabled')
|
||||||
|
const b = document.getElementById('all_frames_disabled')
|
||||||
|
return {
|
||||||
|
enabledColor: getComputedStyle(a).backgroundColor,
|
||||||
|
disabledColor: getComputedStyle(b).backgroundColor
|
||||||
|
}
|
||||||
|
})()`
|
||||||
|
)
|
||||||
|
expect(result.enabledColor).to.equal(COLOR_RED)
|
||||||
|
if (isMainFrame) {
|
||||||
|
expect(result.disabledColor).to.equal(COLOR_BLUE)
|
||||||
|
} else {
|
||||||
|
expect(result.disabledColor).to.equal(COLOR_TRANSPARENT) // null color
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
generateTests(false, false)
|
||||||
|
generateTests(false, true)
|
||||||
|
generateTests(true, false)
|
||||||
|
generateTests(true, true)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
ifdescribe(!process.electronBinding('features').isExtensionsEnabled())('chrome extensions', () => {
|
ifdescribe(!process.electronBinding('features').isExtensionsEnabled())('chrome extensions', () => {
|
||||||
|
@ -325,4 +469,199 @@ ifdescribe(!process.electronBinding('features').isExtensionsEnabled())('chrome e
|
||||||
|
|
||||||
expect(response).to.equal(3)
|
expect(response).to.equal(3)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('extensions and dev tools extensions', () => {
|
||||||
|
let showPanelTimeoutId: NodeJS.Timeout | null = null
|
||||||
|
|
||||||
|
const showLastDevToolsPanel = (w: BrowserWindow) => {
|
||||||
|
w.webContents.once('devtools-opened', () => {
|
||||||
|
const show = () => {
|
||||||
|
if (w == null || w.isDestroyed()) return
|
||||||
|
const { devToolsWebContents } = w as unknown as { devToolsWebContents: WebContents | undefined }
|
||||||
|
if (devToolsWebContents == null || devToolsWebContents.isDestroyed()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const showLastPanel = () => {
|
||||||
|
// this is executed in the devtools context, where UI is a global
|
||||||
|
const { UI } = (window as any)
|
||||||
|
const lastPanelId = UI.inspectorView._tabbedPane._tabs.peekLast().id
|
||||||
|
UI.inspectorView.showPanel(lastPanelId)
|
||||||
|
}
|
||||||
|
devToolsWebContents.executeJavaScript(`(${showLastPanel})()`, false).then(() => {
|
||||||
|
showPanelTimeoutId = setTimeout(show, 100)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
showPanelTimeoutId = setTimeout(show, 100)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
if (showPanelTimeoutId != null) {
|
||||||
|
clearTimeout(showPanelTimeoutId)
|
||||||
|
showPanelTimeoutId = null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('BrowserWindow.addDevToolsExtension', () => {
|
||||||
|
describe('for invalid extensions', () => {
|
||||||
|
it('throws errors for missing manifest.json files', () => {
|
||||||
|
const nonexistentExtensionPath = path.join(__dirname, 'does-not-exist')
|
||||||
|
expect(() => {
|
||||||
|
BrowserWindow.addDevToolsExtension(nonexistentExtensionPath)
|
||||||
|
}).to.throw(/ENOENT: no such file or directory/)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws errors for invalid manifest.json files', () => {
|
||||||
|
const badManifestExtensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'bad-manifest')
|
||||||
|
expect(() => {
|
||||||
|
BrowserWindow.addDevToolsExtension(badManifestExtensionPath)
|
||||||
|
}).to.throw(/Unexpected token }/)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('for a valid extension', () => {
|
||||||
|
const extensionName = 'foo'
|
||||||
|
|
||||||
|
before(() => {
|
||||||
|
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'foo')
|
||||||
|
BrowserWindow.addDevToolsExtension(extensionPath)
|
||||||
|
expect(BrowserWindow.getDevToolsExtensions()).to.have.property(extensionName)
|
||||||
|
})
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
BrowserWindow.removeDevToolsExtension('foo')
|
||||||
|
expect(BrowserWindow.getDevToolsExtensions()).to.not.have.property(extensionName)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('when the devtools is docked', () => {
|
||||||
|
let message: any
|
||||||
|
let w: BrowserWindow
|
||||||
|
before(async () => {
|
||||||
|
w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true } })
|
||||||
|
const p = new Promise(resolve => ipcMain.once('answer', (event, message) => {
|
||||||
|
resolve(message)
|
||||||
|
}))
|
||||||
|
showLastDevToolsPanel(w)
|
||||||
|
w.loadURL('about:blank')
|
||||||
|
w.webContents.openDevTools({ mode: 'bottom' })
|
||||||
|
message = await p
|
||||||
|
})
|
||||||
|
after(closeAllWindows)
|
||||||
|
|
||||||
|
describe('created extension info', function () {
|
||||||
|
it('has proper "runtimeId"', async function () {
|
||||||
|
expect(message).to.have.ownProperty('runtimeId')
|
||||||
|
expect(message.runtimeId).to.equal(extensionName)
|
||||||
|
})
|
||||||
|
it('has "tabId" matching webContents id', function () {
|
||||||
|
expect(message).to.have.ownProperty('tabId')
|
||||||
|
expect(message.tabId).to.equal(w.webContents.id)
|
||||||
|
})
|
||||||
|
it('has "i18nString" with proper contents', function () {
|
||||||
|
expect(message).to.have.ownProperty('i18nString')
|
||||||
|
expect(message.i18nString).to.equal('foo - bar (baz)')
|
||||||
|
})
|
||||||
|
it('has "storageItems" with proper contents', function () {
|
||||||
|
expect(message).to.have.ownProperty('storageItems')
|
||||||
|
expect(message.storageItems).to.deep.equal({
|
||||||
|
local: {
|
||||||
|
set: { hello: 'world', world: 'hello' },
|
||||||
|
remove: { world: 'hello' },
|
||||||
|
clear: {}
|
||||||
|
},
|
||||||
|
sync: {
|
||||||
|
set: { foo: 'bar', bar: 'foo' },
|
||||||
|
remove: { foo: 'bar' },
|
||||||
|
clear: {}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('when the devtools is undocked', () => {
|
||||||
|
let message: any
|
||||||
|
let w: BrowserWindow
|
||||||
|
before(async () => {
|
||||||
|
w = new BrowserWindow({ show: false, webPreferences: { nodeIntegration: true } })
|
||||||
|
showLastDevToolsPanel(w)
|
||||||
|
w.loadURL('about:blank')
|
||||||
|
w.webContents.openDevTools({ mode: 'undocked' })
|
||||||
|
message = await new Promise(resolve => ipcMain.once('answer', (event, message) => {
|
||||||
|
resolve(message)
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
after(closeAllWindows)
|
||||||
|
|
||||||
|
describe('created extension info', function () {
|
||||||
|
it('has proper "runtimeId"', function () {
|
||||||
|
expect(message).to.have.ownProperty('runtimeId')
|
||||||
|
expect(message.runtimeId).to.equal(extensionName)
|
||||||
|
})
|
||||||
|
it('has "tabId" matching webContents id', function () {
|
||||||
|
expect(message).to.have.ownProperty('tabId')
|
||||||
|
expect(message.tabId).to.equal(w.webContents.id)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('works when used with partitions', async () => {
|
||||||
|
const w = new BrowserWindow({
|
||||||
|
show: false,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true,
|
||||||
|
partition: 'temp'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'foo')
|
||||||
|
BrowserWindow.addDevToolsExtension(extensionPath)
|
||||||
|
try {
|
||||||
|
showLastDevToolsPanel(w)
|
||||||
|
|
||||||
|
const p: Promise<any> = new Promise(resolve => ipcMain.once('answer', function (event, message) {
|
||||||
|
resolve(message)
|
||||||
|
}))
|
||||||
|
|
||||||
|
w.loadURL('about:blank')
|
||||||
|
w.webContents.openDevTools({ mode: 'bottom' })
|
||||||
|
const message = await p
|
||||||
|
expect(message.runtimeId).to.equal('foo')
|
||||||
|
} finally {
|
||||||
|
BrowserWindow.removeDevToolsExtension('foo')
|
||||||
|
await closeAllWindows()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('serializes the registered extensions on quit', () => {
|
||||||
|
const extensionName = 'foo'
|
||||||
|
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', extensionName)
|
||||||
|
const serializedPath = path.join(app.getPath('userData'), 'DevTools Extensions')
|
||||||
|
|
||||||
|
BrowserWindow.addDevToolsExtension(extensionPath)
|
||||||
|
app.emit('will-quit')
|
||||||
|
expect(JSON.parse(fs.readFileSync(serializedPath, 'utf8'))).to.deep.equal([extensionPath])
|
||||||
|
|
||||||
|
BrowserWindow.removeDevToolsExtension(extensionName)
|
||||||
|
app.emit('will-quit')
|
||||||
|
expect(fs.existsSync(serializedPath)).to.be.false('file exists')
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('BrowserWindow.addExtension', () => {
|
||||||
|
it('throws errors for missing manifest.json files', () => {
|
||||||
|
expect(() => {
|
||||||
|
BrowserWindow.addExtension(path.join(__dirname, 'does-not-exist'))
|
||||||
|
}).to.throw('ENOENT: no such file or directory')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws errors for invalid manifest.json files', () => {
|
||||||
|
expect(() => {
|
||||||
|
BrowserWindow.addExtension(path.join(__dirname, 'fixtures', 'devtools-extensions', 'bad-manifest'))
|
||||||
|
}).to.throw('Unexpected token }')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
2
spec-main/fixtures/devtools-extensions/foo/devtools.js
Normal file
2
spec-main/fixtures/devtools-extensions/foo/devtools.js
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/* global chrome */
|
||||||
|
chrome.devtools.panels.create('Foo', 'foo.png', 'index.html')
|
|
@ -3,8 +3,6 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>foo</title>
|
<title>foo</title>
|
||||||
<script>
|
<script src="devtools.js"></script>
|
||||||
chrome.devtools.panels.create('Foo', 'foo.png', 'index.html')
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -3,84 +3,7 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title></title>
|
<title></title>
|
||||||
<script>
|
<script src="panel.js"></script>
|
||||||
function testStorageClear (callback) {
|
|
||||||
chrome.storage.sync.clear(function () {
|
|
||||||
chrome.storage.sync.get(null, function (syncItems) {
|
|
||||||
chrome.storage.local.clear(function () {
|
|
||||||
chrome.storage.local.get(null, function(localItems) {
|
|
||||||
callback(syncItems, localItems)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function testStorageRemove (callback) {
|
|
||||||
chrome.storage.sync.remove('bar', function () {
|
|
||||||
chrome.storage.sync.get({foo: 'baz'}, function (syncItems) {
|
|
||||||
chrome.storage.local.remove(['hello'], function () {
|
|
||||||
chrome.storage.local.get(null, function(localItems) {
|
|
||||||
callback(syncItems, localItems)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function testStorageSet (callback) {
|
|
||||||
chrome.storage.sync.set({foo: 'bar', bar: 'foo'}, function () {
|
|
||||||
chrome.storage.sync.get({foo: 'baz', bar: 'fooo'}, function (syncItems) {
|
|
||||||
chrome.storage.local.set({hello: 'world', world: 'hello'}, function () {
|
|
||||||
chrome.storage.local.get(null, function(localItems) {
|
|
||||||
callback(syncItems, localItems)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function testStorage (callback) {
|
|
||||||
testStorageSet(function (syncForSet, localForSet) {
|
|
||||||
testStorageRemove(function (syncForRemove, localForRemove) {
|
|
||||||
testStorageClear(function (syncForClear, localForClear) {
|
|
||||||
callback(
|
|
||||||
syncForSet, localForSet,
|
|
||||||
syncForRemove, localForRemove,
|
|
||||||
syncForClear, localForClear
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
testStorage(function (
|
|
||||||
syncForSet, localForSet,
|
|
||||||
syncForRemove, localForRemove,
|
|
||||||
syncForClear, localForClear
|
|
||||||
) {
|
|
||||||
var message = JSON.stringify({
|
|
||||||
runtimeId: chrome.runtime.id,
|
|
||||||
tabId: chrome.devtools.inspectedWindow.tabId,
|
|
||||||
i18nString: chrome.i18n.getMessage('foo', ['bar', 'baz']),
|
|
||||||
storageItems: {
|
|
||||||
local: {
|
|
||||||
set: localForSet,
|
|
||||||
remove: localForRemove,
|
|
||||||
clear: localForClear
|
|
||||||
},
|
|
||||||
sync: {
|
|
||||||
set: syncForSet,
|
|
||||||
remove: syncForRemove,
|
|
||||||
clear: syncForClear
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
var sendMessage = `require('electron').ipcRenderer.send('answer', ${message})`
|
|
||||||
window.chrome.devtools.inspectedWindow.eval(sendMessage, function () {})
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
a custom devtools extension
|
a custom devtools extension
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
{
|
{
|
||||||
|
"manifest_version": 2,
|
||||||
"name": "foo",
|
"name": "foo",
|
||||||
|
"permissions": [
|
||||||
|
"storage"
|
||||||
|
],
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"devtools_page": "foo.html",
|
"devtools_page": "foo.html",
|
||||||
"default_locale": "en"
|
"default_locale": "en"
|
||||||
|
|
77
spec-main/fixtures/devtools-extensions/foo/panel.js
Normal file
77
spec-main/fixtures/devtools-extensions/foo/panel.js
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/* global chrome */
|
||||||
|
function testStorageClear (callback) {
|
||||||
|
chrome.storage.sync.clear(function () {
|
||||||
|
chrome.storage.sync.get(null, function (syncItems) {
|
||||||
|
chrome.storage.local.clear(function () {
|
||||||
|
chrome.storage.local.get(null, function (localItems) {
|
||||||
|
callback(syncItems, localItems)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function testStorageRemove (callback) {
|
||||||
|
chrome.storage.sync.remove('bar', function () {
|
||||||
|
chrome.storage.sync.get({ foo: 'baz' }, function (syncItems) {
|
||||||
|
chrome.storage.local.remove(['hello'], function () {
|
||||||
|
chrome.storage.local.get(null, function (localItems) {
|
||||||
|
callback(syncItems, localItems)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function testStorageSet (callback) {
|
||||||
|
chrome.storage.sync.set({ foo: 'bar', bar: 'foo' }, function () {
|
||||||
|
chrome.storage.sync.get({ foo: 'baz', bar: 'fooo' }, function (syncItems) {
|
||||||
|
chrome.storage.local.set({ hello: 'world', world: 'hello' }, function () {
|
||||||
|
chrome.storage.local.get(null, function (localItems) {
|
||||||
|
callback(syncItems, localItems)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function testStorage (callback) {
|
||||||
|
testStorageSet(function (syncForSet, localForSet) {
|
||||||
|
testStorageRemove(function (syncForRemove, localForRemove) {
|
||||||
|
testStorageClear(function (syncForClear, localForClear) {
|
||||||
|
callback(
|
||||||
|
syncForSet, localForSet,
|
||||||
|
syncForRemove, localForRemove,
|
||||||
|
syncForClear, localForClear
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
testStorage(function (
|
||||||
|
syncForSet, localForSet,
|
||||||
|
syncForRemove, localForRemove,
|
||||||
|
syncForClear, localForClear
|
||||||
|
) {
|
||||||
|
const message = JSON.stringify({
|
||||||
|
runtimeId: chrome.runtime.id,
|
||||||
|
tabId: chrome.devtools.inspectedWindow.tabId,
|
||||||
|
i18nString: null, // chrome.i18n.getMessage('foo', ['bar', 'baz']),
|
||||||
|
storageItems: {
|
||||||
|
local: {
|
||||||
|
set: localForSet,
|
||||||
|
remove: localForRemove,
|
||||||
|
clear: localForClear
|
||||||
|
},
|
||||||
|
sync: {
|
||||||
|
set: syncForSet,
|
||||||
|
remove: syncForRemove,
|
||||||
|
clear: syncForClear
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const sendMessage = `require('electron').ipcRenderer.send('answer', ${message})`
|
||||||
|
window.chrome.devtools.inspectedWindow.eval(sendMessage, function () {})
|
||||||
|
})
|
|
@ -4,7 +4,7 @@
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<webview nodeintegration src="./a.html"></webview>
|
<webview nodeintegration src="about:blank"></webview>
|
||||||
<script>
|
<script>
|
||||||
var wv = document.querySelector('webview')
|
var wv = document.querySelector('webview')
|
||||||
wv.addEventListener('dom-ready', () => {
|
wv.addEventListener('dom-ready', () => {
|
||||||
|
|
|
@ -162,10 +162,12 @@ describe('<webview> tag', function () {
|
||||||
BrowserWindow.removeDevToolsExtension('foo')
|
BrowserWindow.removeDevToolsExtension('foo')
|
||||||
|
|
||||||
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'foo')
|
const extensionPath = path.join(__dirname, 'fixtures', 'devtools-extensions', 'foo')
|
||||||
BrowserWindow.addDevToolsExtension(extensionPath)
|
await BrowserWindow.addDevToolsExtension(extensionPath)
|
||||||
|
|
||||||
w.loadFile(path.join(__dirname, 'fixtures', 'pages', 'webview-devtools.html'))
|
w.loadFile(path.join(__dirname, 'fixtures', 'pages', 'webview-devtools.html'))
|
||||||
|
let childWebContentsId = 0
|
||||||
app.once('web-contents-created', (e, webContents) => {
|
app.once('web-contents-created', (e, webContents) => {
|
||||||
|
childWebContentsId = webContents.id
|
||||||
webContents.on('devtools-opened', function () {
|
webContents.on('devtools-opened', function () {
|
||||||
const showPanelIntervalId = setInterval(function () {
|
const showPanelIntervalId = setInterval(function () {
|
||||||
if (!webContents.isDestroyed() && webContents.devToolsWebContents) {
|
if (!webContents.isDestroyed() && webContents.devToolsWebContents) {
|
||||||
|
@ -181,8 +183,8 @@ describe('<webview> tag', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
const [, { runtimeId, tabId }] = await emittedOnce(ipcMain, 'answer')
|
const [, { runtimeId, tabId }] = await emittedOnce(ipcMain, 'answer')
|
||||||
expect(runtimeId).to.equal('foo')
|
expect(runtimeId).to.match(/^[a-z]{32}$/)
|
||||||
expect(tabId).to.be.not.equal(w.webContents.id)
|
expect(tabId).to.equal(childWebContentsId)
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('zoom behavior', () => {
|
describe('zoom behavior', () => {
|
||||||
|
|
Loading…
Reference in a new issue