Merge branch 'master' into desktop-capture-api
This commit is contained in:
commit
04f7ceab73
464 changed files with 18563 additions and 4629 deletions
|
@ -4,11 +4,13 @@
|
|||
|
||||
#include "atom/renderer/api/atom_api_web_frame.h"
|
||||
|
||||
#include "atom/common/api/api_messages.h"
|
||||
#include "atom/common/native_mate_converters/callback.h"
|
||||
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||
#include "atom/renderer/api/atom_api_spell_check_client.h"
|
||||
#include "content/public/renderer/render_frame.h"
|
||||
#include "content/public/renderer/render_view.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
#include "native_mate/object_template_builder.h"
|
||||
#include "third_party/WebKit/public/web/WebDocument.h"
|
||||
|
@ -34,6 +36,10 @@ void WebFrame::SetName(const std::string& name) {
|
|||
}
|
||||
|
||||
double WebFrame::SetZoomLevel(double level) {
|
||||
auto render_view = content::RenderView::FromWebView(web_frame_->view());
|
||||
// Notify guests if any for zoom level change.
|
||||
render_view->Send(
|
||||
new AtomViewHostMsg_ZoomLevelChanged(MSG_ROUTING_NONE, level));
|
||||
return web_frame_->view()->setZoomLevel(level);
|
||||
}
|
||||
|
||||
|
@ -92,7 +98,7 @@ void WebFrame::RegisterURLSchemeAsSecure(const std::string& scheme) {
|
|||
blink::WebString::fromUTF8(scheme));
|
||||
}
|
||||
|
||||
void WebFrame::RegisterURLSchemeAsBypassingCsp(const std::string& scheme) {
|
||||
void WebFrame::RegisterURLSchemeAsBypassingCSP(const std::string& scheme) {
|
||||
// Register scheme to bypass pages's Content Security Policy.
|
||||
blink::WebSecurityPolicy::registerURLSchemeAsBypassingContentSecurityPolicy(
|
||||
blink::WebString::fromUTF8(scheme));
|
||||
|
@ -123,11 +129,11 @@ mate::ObjectTemplateBuilder WebFrame::GetObjectTemplateBuilder(
|
|||
&WebFrame::RegisterElementResizeCallback)
|
||||
.SetMethod("attachGuest", &WebFrame::AttachGuest)
|
||||
.SetMethod("setSpellCheckProvider", &WebFrame::SetSpellCheckProvider)
|
||||
.SetMethod("registerUrlSchemeAsSecure",
|
||||
.SetMethod("registerURLSchemeAsSecure",
|
||||
&WebFrame::RegisterURLSchemeAsSecure)
|
||||
.SetMethod("registerUrlSchemeAsBypassingCsp",
|
||||
&WebFrame::RegisterURLSchemeAsBypassingCsp)
|
||||
.SetMethod("registerUrlSchemeAsPrivileged",
|
||||
.SetMethod("registerURLSchemeAsBypassingCSP",
|
||||
&WebFrame::RegisterURLSchemeAsBypassingCSP)
|
||||
.SetMethod("registerURLSchemeAsPrivileged",
|
||||
&WebFrame::RegisterURLSchemeAsPrivileged);
|
||||
}
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ class WebFrame : public mate::Wrappable {
|
|||
v8::Local<v8::Object> provider);
|
||||
|
||||
void RegisterURLSchemeAsSecure(const std::string& scheme);
|
||||
void RegisterURLSchemeAsBypassingCsp(const std::string& scheme);
|
||||
void RegisterURLSchemeAsBypassingCSP(const std::string& scheme);
|
||||
void RegisterURLSchemeAsPrivileged(const std::string& scheme);
|
||||
|
||||
// mate::Wrappable:
|
||||
|
|
17
atom/renderer/api/lib/exports/electron.coffee
Normal file
17
atom/renderer/api/lib/exports/electron.coffee
Normal file
|
@ -0,0 +1,17 @@
|
|||
# Import common modules.
|
||||
module.exports = require '../../../../common/api/lib/exports/electron'
|
||||
|
||||
Object.defineProperties module.exports,
|
||||
# Renderer side modules, please sort with alphabet order.
|
||||
ipcRenderer:
|
||||
enumerable: true
|
||||
get: -> require '../ipc-renderer'
|
||||
remote:
|
||||
enumerable: true
|
||||
get: -> require '../remote'
|
||||
screen:
|
||||
enumerable: true
|
||||
get: -> require '../screen'
|
||||
webFrame:
|
||||
enumerable: true
|
||||
get: -> require '../web-frame'
|
24
atom/renderer/api/lib/ipc-renderer.coffee
Normal file
24
atom/renderer/api/lib/ipc-renderer.coffee
Normal file
|
@ -0,0 +1,24 @@
|
|||
{EventEmitter} = require 'events'
|
||||
|
||||
binding = process.atomBinding 'ipc'
|
||||
v8Util = process.atomBinding 'v8_util'
|
||||
|
||||
# Created by init.coffee.
|
||||
ipcRenderer = v8Util.getHiddenValue global, 'ipc'
|
||||
|
||||
# Delay the callback to next tick in case the browser is still in the middle
|
||||
# of sending a message while the callback sends a sync message to browser,
|
||||
# which can fail sometimes.
|
||||
ipcRenderer.emit = (args...) ->
|
||||
setTimeout (-> EventEmitter::emit.call ipcRenderer, args...), 0
|
||||
|
||||
ipcRenderer.send = (args...) ->
|
||||
binding.send 'ipc-message', [args...]
|
||||
|
||||
ipcRenderer.sendSync = (args...) ->
|
||||
JSON.parse binding.sendSync('ipc-message-sync', [args...])
|
||||
|
||||
ipcRenderer.sendToHost = (args...) ->
|
||||
binding.send 'ipc-message-host', [args...]
|
||||
|
||||
module.exports = ipcRenderer
|
|
@ -1,20 +1,19 @@
|
|||
binding = process.atomBinding 'ipc'
|
||||
v8Util = process.atomBinding 'v8_util'
|
||||
{ipcRenderer, deprecate} = require 'electron'
|
||||
{EventEmitter} = require 'events'
|
||||
|
||||
# Created by init.coffee.
|
||||
ipc = v8Util.getHiddenValue global, 'ipc'
|
||||
# This module is deprecated, we mirror everything from ipcRenderer.
|
||||
deprecate.warn 'ipc module', 'require("electron").ipcRenderer'
|
||||
|
||||
ipc.send = (args...) ->
|
||||
binding.send 'ipc-message', [args...]
|
||||
|
||||
ipc.sendSync = (args...) ->
|
||||
JSON.parse binding.sendSync('ipc-message-sync', [args...])
|
||||
|
||||
ipc.sendToHost = (args...) ->
|
||||
binding.send 'ipc-message-host', [args...]
|
||||
# Routes events of ipcRenderer.
|
||||
ipc = new EventEmitter
|
||||
ipcRenderer.emit = (channel, event, args...) ->
|
||||
ipc.emit channel, args...
|
||||
EventEmitter::emit.apply ipcRenderer, arguments
|
||||
|
||||
# Deprecated.
|
||||
ipc.sendChannel = ipc.send
|
||||
ipc.sendChannelSync = ipc.sendSync
|
||||
for method of ipcRenderer when method.startsWith 'send'
|
||||
ipc[method] = ipcRenderer[method]
|
||||
deprecate.rename ipc, 'sendChannel', 'send'
|
||||
deprecate.rename ipc, 'sendChannelSync', 'sendSync'
|
||||
|
||||
module.exports = ipc
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
ipc = require 'ipc'
|
||||
{ipcRenderer, CallbacksRegistry} = require 'electron'
|
||||
v8Util = process.atomBinding 'v8_util'
|
||||
CallbacksRegistry = require 'callbacks-registry'
|
||||
|
||||
callbacksRegistry = new CallbacksRegistry
|
||||
|
||||
|
@ -19,7 +18,7 @@ wrapArgs = (args, visited=[]) ->
|
|||
type: 'array', value: wrapArgs(value, visited)
|
||||
else if Buffer.isBuffer value
|
||||
type: 'buffer', value: Array::slice.call(value, 0)
|
||||
else if value? and value.constructor.name is 'Promise'
|
||||
else if value?.constructor.name is 'Promise'
|
||||
type: 'promise', then: valueToMeta(value.then.bind(value))
|
||||
else if value? and typeof value is 'object' and v8Util.getHiddenValue value, 'atomId'
|
||||
type: 'remote-object', id: v8Util.getHiddenValue value, 'atomId'
|
||||
|
@ -33,7 +32,7 @@ wrapArgs = (args, visited=[]) ->
|
|||
else if typeof value is 'function' and v8Util.getHiddenValue value, 'returnValue'
|
||||
type: 'function-with-return-value', value: valueToMeta(value())
|
||||
else if typeof value is 'function'
|
||||
type: 'function', id: callbacksRegistry.add(value)
|
||||
type: 'function', id: callbacksRegistry.add(value), location: v8Util.getHiddenValue value, 'location'
|
||||
else
|
||||
type: 'value', value: value
|
||||
|
||||
|
@ -46,7 +45,9 @@ metaToValue = (meta) ->
|
|||
when 'array' then (metaToValue(el) for el in meta.members)
|
||||
when 'buffer' then new Buffer(meta.value)
|
||||
when 'promise' then Promise.resolve(then: metaToValue(meta.then))
|
||||
when 'error'
|
||||
when 'error' then metaToPlainObject meta
|
||||
when 'date' then new Date(meta.value)
|
||||
when 'exception'
|
||||
throw new Error("#{meta.message}\n#{meta.stack}")
|
||||
else
|
||||
if meta.type is 'function'
|
||||
|
@ -56,7 +57,7 @@ metaToValue = (meta) ->
|
|||
constructor: ->
|
||||
if @constructor == RemoteFunction
|
||||
# Constructor call.
|
||||
obj = ipc.sendSync 'ATOM_BROWSER_CONSTRUCTOR', meta.id, wrapArgs(arguments)
|
||||
obj = ipcRenderer.sendSync 'ATOM_BROWSER_CONSTRUCTOR', meta.id, wrapArgs(arguments)
|
||||
|
||||
# Returning object in constructor will replace constructed object
|
||||
# with the returned object.
|
||||
|
@ -64,7 +65,7 @@ metaToValue = (meta) ->
|
|||
return metaToValue obj
|
||||
else
|
||||
# Function call.
|
||||
ret = ipc.sendSync 'ATOM_BROWSER_FUNCTION_CALL', meta.id, wrapArgs(arguments)
|
||||
ret = ipcRenderer.sendSync 'ATOM_BROWSER_FUNCTION_CALL', meta.id, wrapArgs(arguments)
|
||||
return metaToValue ret
|
||||
else
|
||||
ret = v8Util.createObjectWithName meta.name
|
||||
|
@ -78,11 +79,11 @@ metaToValue = (meta) ->
|
|||
constructor: ->
|
||||
if @constructor is RemoteMemberFunction
|
||||
# Constructor call.
|
||||
obj = ipc.sendSync 'ATOM_BROWSER_MEMBER_CONSTRUCTOR', meta.id, member.name, wrapArgs(arguments)
|
||||
obj = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_CONSTRUCTOR', meta.id, member.name, wrapArgs(arguments)
|
||||
return metaToValue obj
|
||||
else
|
||||
# Call member function.
|
||||
ret = ipc.sendSync 'ATOM_BROWSER_MEMBER_CALL', meta.id, member.name, wrapArgs(arguments)
|
||||
ret = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_CALL', meta.id, member.name, wrapArgs(arguments)
|
||||
return metaToValue ret
|
||||
else
|
||||
Object.defineProperty ret, member.name,
|
||||
|
@ -90,32 +91,47 @@ metaToValue = (meta) ->
|
|||
configurable: false,
|
||||
set: (value) ->
|
||||
# Set member data.
|
||||
ipc.sendSync 'ATOM_BROWSER_MEMBER_SET', meta.id, member.name, value
|
||||
ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_SET', meta.id, member.name, value
|
||||
value
|
||||
|
||||
get: ->
|
||||
# Get member data.
|
||||
ret = ipc.sendSync 'ATOM_BROWSER_MEMBER_GET', meta.id, member.name
|
||||
ret = ipcRenderer.sendSync 'ATOM_BROWSER_MEMBER_GET', meta.id, member.name
|
||||
metaToValue ret
|
||||
|
||||
# Track delegate object's life time, and tell the browser to clean up
|
||||
# when the object is GCed.
|
||||
v8Util.setDestructor ret, ->
|
||||
ipc.send 'ATOM_BROWSER_DEREFERENCE', meta.id
|
||||
ipcRenderer.send 'ATOM_BROWSER_DEREFERENCE', meta.id
|
||||
|
||||
# Remember object's id.
|
||||
v8Util.setHiddenValue ret, 'atomId', meta.id
|
||||
|
||||
ret
|
||||
|
||||
# Construct a plain object from the meta.
|
||||
metaToPlainObject = (meta) ->
|
||||
obj = switch meta.type
|
||||
when 'error' then new Error
|
||||
else {}
|
||||
obj[name] = value for {name, value} in meta.members
|
||||
obj
|
||||
|
||||
# Browser calls a callback in renderer.
|
||||
ipc.on 'ATOM_RENDERER_CALLBACK', (id, args) ->
|
||||
ipcRenderer.on 'ATOM_RENDERER_CALLBACK', (event, id, args) ->
|
||||
callbacksRegistry.apply id, metaToValue(args)
|
||||
|
||||
# A callback in browser is released.
|
||||
ipc.on 'ATOM_RENDERER_RELEASE_CALLBACK', (id) ->
|
||||
ipcRenderer.on 'ATOM_RENDERER_RELEASE_CALLBACK', (event, id) ->
|
||||
callbacksRegistry.remove id
|
||||
|
||||
# List all built-in modules in browser process.
|
||||
browserModules = ipcRenderer.sendSync 'ATOM_BROWSER_LIST_MODULES'
|
||||
# And add a helper receiver for each one.
|
||||
for name in browserModules
|
||||
do (name) ->
|
||||
Object.defineProperty exports, name, get: -> exports.getBuiltin name
|
||||
|
||||
# Get remote module.
|
||||
# (Just like node's require, the modules are cached permanently, note that this
|
||||
# is safe leak since the object is not expected to get freed in browser)
|
||||
|
@ -123,26 +139,37 @@ moduleCache = {}
|
|||
exports.require = (module) ->
|
||||
return moduleCache[module] if moduleCache[module]?
|
||||
|
||||
meta = ipc.sendSync 'ATOM_BROWSER_REQUIRE', module
|
||||
meta = ipcRenderer.sendSync 'ATOM_BROWSER_REQUIRE', module
|
||||
moduleCache[module] = metaToValue meta
|
||||
|
||||
# Optimize require('electron').
|
||||
moduleCache.electron = exports
|
||||
|
||||
# Alias to remote.require('electron').xxx.
|
||||
builtinCache = {}
|
||||
exports.getBuiltin = (module) ->
|
||||
return builtinCache[module] if builtinCache[module]?
|
||||
|
||||
meta = ipcRenderer.sendSync 'ATOM_BROWSER_GET_BUILTIN', module
|
||||
builtinCache[module] = metaToValue meta
|
||||
|
||||
# Get current BrowserWindow object.
|
||||
windowCache = null
|
||||
exports.getCurrentWindow = ->
|
||||
return windowCache if windowCache?
|
||||
meta = ipc.sendSync 'ATOM_BROWSER_CURRENT_WINDOW', process.guestInstanceId
|
||||
meta = ipcRenderer.sendSync 'ATOM_BROWSER_CURRENT_WINDOW'
|
||||
windowCache = metaToValue meta
|
||||
|
||||
# Get current WebContents object.
|
||||
webContentsCache = null
|
||||
exports.getCurrentWebContents = ->
|
||||
return webContentsCache if webContentsCache?
|
||||
meta = ipc.sendSync 'ATOM_BROWSER_CURRENT_WEB_CONTENTS'
|
||||
meta = ipcRenderer.sendSync 'ATOM_BROWSER_CURRENT_WEB_CONTENTS'
|
||||
webContentsCache = metaToValue meta
|
||||
|
||||
# Get a global object in browser.
|
||||
exports.getGlobal = (name) ->
|
||||
meta = ipc.sendSync 'ATOM_BROWSER_GLOBAL', name
|
||||
meta = ipcRenderer.sendSync 'ATOM_BROWSER_GLOBAL', name
|
||||
metaToValue meta
|
||||
|
||||
# Get the process object in browser.
|
||||
|
@ -159,5 +186,5 @@ exports.createFunctionWithReturnValue = (returnValue) ->
|
|||
|
||||
# Get the guest WebContents from guestInstanceId.
|
||||
exports.getGuestWebContents = (guestInstanceId) ->
|
||||
meta = ipc.sendSync 'ATOM_BROWSER_GUEST_WEB_CONTENTS', guestInstanceId
|
||||
meta = ipcRenderer.sendSync 'ATOM_BROWSER_GUEST_WEB_CONTENTS', guestInstanceId
|
||||
metaToValue meta
|
||||
|
|
|
@ -1 +1 @@
|
|||
module.exports = require('remote').require('screen')
|
||||
module.exports = require('electron').remote.screen
|
||||
|
|
|
@ -1 +1,9 @@
|
|||
module.exports = process.atomBinding('web_frame').webFrame
|
||||
{deprecate} = require 'electron'
|
||||
{webFrame} = process.atomBinding 'web_frame'
|
||||
|
||||
# Deprecated.
|
||||
deprecate.rename webFrame, 'registerUrlSchemeAsSecure', 'registerURLSchemeAsSecure'
|
||||
deprecate.rename webFrame, 'registerUrlSchemeAsBypassingCSP', 'registerURLSchemeAsBypassingCSP'
|
||||
deprecate.rename webFrame, 'registerUrlSchemeAsPrivileged', 'registerURLSchemeAsPrivileged'
|
||||
|
||||
module.exports = webFrame
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "third_party/WebKit/public/web/WebScriptSource.h"
|
||||
#include "third_party/WebKit/public/web/WebView.h"
|
||||
#include "ui/base/resource/resource_bundle.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
|
||||
namespace atom {
|
||||
|
||||
|
@ -142,7 +143,12 @@ void AtomRenderViewObserver::OnBrowserMessage(const base::string16& channel,
|
|||
|
||||
v8::Local<v8::Object> ipc;
|
||||
if (GetIPCObject(isolate, context, &ipc)) {
|
||||
mate::EmitEvent(isolate, ipc, channel, ListValueToVector(isolate, args));
|
||||
auto args_vector = ListValueToVector(isolate, args);
|
||||
// Insert the Event object, event.sender is ipc.
|
||||
mate::Dictionary event = mate::Dictionary::CreateEmpty(isolate);
|
||||
event.Set("sender", ipc);
|
||||
args_vector.insert(args_vector.begin(), event.GetHandle());
|
||||
mate::EmitEvent(isolate, ipc, channel, args_vector);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "atom/common/api/api_messages.h"
|
||||
#include "atom/common/api/atom_bindings.h"
|
||||
#include "atom/common/node_bindings.h"
|
||||
#include "atom/common/node_includes.h"
|
||||
|
@ -21,11 +22,13 @@
|
|||
#include "content/public/renderer/render_frame.h"
|
||||
#include "content/public/renderer/render_frame_observer.h"
|
||||
#include "content/public/renderer/render_thread.h"
|
||||
#include "ipc/ipc_message_macros.h"
|
||||
#include "third_party/WebKit/public/web/WebCustomElement.h"
|
||||
#include "third_party/WebKit/public/web/WebLocalFrame.h"
|
||||
#include "third_party/WebKit/public/web/WebPluginParams.h"
|
||||
#include "third_party/WebKit/public/web/WebKit.h"
|
||||
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
|
||||
#include "third_party/WebKit/public/web/WebView.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include <shlobj.h>
|
||||
|
@ -36,16 +39,8 @@ namespace atom {
|
|||
namespace {
|
||||
|
||||
bool IsSwitchEnabled(base::CommandLine* command_line,
|
||||
const char* switch_string,
|
||||
bool* enabled) {
|
||||
std::string value = command_line->GetSwitchValueASCII(switch_string);
|
||||
if (value == "true")
|
||||
*enabled = true;
|
||||
else if (value == "false")
|
||||
*enabled = false;
|
||||
else
|
||||
return false;
|
||||
return true;
|
||||
const char* switch_string) {
|
||||
return command_line->GetSwitchValueASCII(switch_string) == "true";
|
||||
}
|
||||
|
||||
// Helper class to forward the messages to the client.
|
||||
|
@ -64,6 +59,22 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver {
|
|||
render_frame()->GetWebFrame(), context);
|
||||
}
|
||||
|
||||
bool OnMessageReceived(const IPC::Message& message) {
|
||||
bool handled = true;
|
||||
IPC_BEGIN_MESSAGE_MAP(AtomRenderFrameObserver, message)
|
||||
IPC_MESSAGE_HANDLER(AtomViewMsg_SetZoomLevel, OnSetZoomLevel)
|
||||
IPC_MESSAGE_UNHANDLED(handled = false)
|
||||
IPC_END_MESSAGE_MAP()
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
void OnSetZoomLevel(double level) {
|
||||
auto view = render_frame()->GetWebFrame()->view();
|
||||
if (view)
|
||||
view->setZoomLevel(level);
|
||||
}
|
||||
|
||||
private:
|
||||
AtomRendererClient* renderer_client_;
|
||||
|
||||
|
@ -197,10 +208,8 @@ bool AtomRendererClient::ShouldOverridePageVisibilityState(
|
|||
const content::RenderFrame* render_frame,
|
||||
blink::WebPageVisibilityState* override_state) {
|
||||
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
||||
bool b;
|
||||
|
||||
if (IsSwitchEnabled(command_line, switches::kPageVisibility, &b)
|
||||
&& b) {
|
||||
if (IsSwitchEnabled(command_line, switches::kPageVisibility)) {
|
||||
*override_state = blink::WebPageVisibilityStateVisible;
|
||||
return true;
|
||||
}
|
||||
|
@ -210,19 +219,15 @@ bool AtomRendererClient::ShouldOverridePageVisibilityState(
|
|||
|
||||
void AtomRendererClient::EnableWebRuntimeFeatures() {
|
||||
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
||||
bool b;
|
||||
if (IsSwitchEnabled(command_line, switches::kExperimentalFeatures, &b))
|
||||
blink::WebRuntimeFeatures::enableExperimentalFeatures(b);
|
||||
if (IsSwitchEnabled(command_line, switches::kExperimentalCanvasFeatures, &b))
|
||||
blink::WebRuntimeFeatures::enableExperimentalCanvasFeatures(b);
|
||||
if (IsSwitchEnabled(command_line, switches::kSubpixelFontScaling, &b))
|
||||
blink::WebRuntimeFeatures::enableSubpixelFontScaling(b);
|
||||
if (IsSwitchEnabled(command_line, switches::kOverlayScrollbars, &b))
|
||||
blink::WebRuntimeFeatures::enableOverlayScrollbars(b);
|
||||
if (IsSwitchEnabled(command_line, switches::kOverlayFullscreenVideo, &b))
|
||||
blink::WebRuntimeFeatures::enableOverlayFullscreenVideo(b);
|
||||
if (IsSwitchEnabled(command_line, switches::kSharedWorker, &b))
|
||||
blink::WebRuntimeFeatures::enableSharedWorker(b);
|
||||
|
||||
if (IsSwitchEnabled(command_line, switches::kExperimentalFeatures))
|
||||
blink::WebRuntimeFeatures::enableExperimentalFeatures(true);
|
||||
if (IsSwitchEnabled(command_line, switches::kExperimentalCanvasFeatures))
|
||||
blink::WebRuntimeFeatures::enableExperimentalCanvasFeatures(true);
|
||||
if (IsSwitchEnabled(command_line, switches::kOverlayScrollbars))
|
||||
blink::WebRuntimeFeatures::enableOverlayScrollbars(true);
|
||||
if (IsSwitchEnabled(command_line, switches::kSharedWorker))
|
||||
blink::WebRuntimeFeatures::enableSharedWorker(true);
|
||||
}
|
||||
|
||||
} // namespace atom
|
||||
|
|
|
@ -7,17 +7,19 @@ Module = require 'module'
|
|||
# atom-renderer.js, we need to restore it here.
|
||||
process.argv.splice 1, 1
|
||||
|
||||
# Add renderer/api/lib to require's search paths, which contains javascript part
|
||||
# of Atom's built-in libraries.
|
||||
globalPaths = Module.globalPaths
|
||||
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
|
||||
# And also app.
|
||||
globalPaths.push path.join(process.resourcesPath, 'app')
|
||||
globalPaths.push path.join(process.resourcesPath, 'app.asar')
|
||||
# Clear search paths.
|
||||
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'reset-search-paths')
|
||||
|
||||
# Import common settings.
|
||||
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init')
|
||||
|
||||
globalPaths = Module.globalPaths
|
||||
unless process.env.ELECTRON_HIDE_INTERNAL_MODULES
|
||||
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
|
||||
|
||||
# Expose public APIs.
|
||||
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib', 'exports')
|
||||
|
||||
# The global variable will be used by ipc for event dispatching
|
||||
v8Util = process.atomBinding 'v8_util'
|
||||
v8Util.setHiddenValue global, 'ipc', new events.EventEmitter
|
||||
|
|
|
@ -32,8 +32,8 @@ convertToMenuTemplate = (items) ->
|
|||
template
|
||||
|
||||
createMenu = (x, y, items, document) ->
|
||||
remote = require 'remote'
|
||||
Menu = remote.require 'menu'
|
||||
{remote} = require 'electron'
|
||||
{Menu} = remote
|
||||
|
||||
menu = Menu.buildFromTemplate convertToMenuTemplate(items)
|
||||
# The menu is expected to show asynchronously.
|
||||
|
@ -42,9 +42,9 @@ createMenu = (x, y, items, document) ->
|
|||
DevToolsAPI.contextMenuCleared()
|
||||
|
||||
showFileChooserDialog = (callback) ->
|
||||
remote = require 'remote'
|
||||
dialog = remote.require 'dialog'
|
||||
files = dialog.showOpenDialog remote.getCurrentWindow(), null
|
||||
{remote} = require 'electron'
|
||||
{dialog} = remote
|
||||
files = dialog.showOpenDialog {}
|
||||
callback pathToHtml5FileObject files[0] if files?
|
||||
|
||||
pathToHtml5FileObject = (path) ->
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
ipc = require 'ipc'
|
||||
remote = require 'remote'
|
||||
{ipcRenderer, remote} = require 'electron'
|
||||
|
||||
# Helper function to resolve relative url.
|
||||
a = window.top.document.createElement 'a'
|
||||
resolveUrl = (url) ->
|
||||
resolveURL = (url) ->
|
||||
a.href = url
|
||||
a.href
|
||||
|
||||
|
@ -11,24 +10,23 @@ resolveUrl = (url) ->
|
|||
class BrowserWindowProxy
|
||||
constructor: (@guestId) ->
|
||||
@closed = false
|
||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED', (guestId) =>
|
||||
if guestId is @guestId
|
||||
@closed = true
|
||||
ipcRenderer.once "ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_#{@guestId}", =>
|
||||
@closed = true
|
||||
|
||||
close: ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', @guestId
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', @guestId
|
||||
|
||||
focus: ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'focus'
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'focus'
|
||||
|
||||
blur: ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'blur'
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'blur'
|
||||
|
||||
postMessage: (message, targetOrigin='*') ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', @guestId, message, targetOrigin
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', @guestId, message, targetOrigin
|
||||
|
||||
eval: (args...) ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', @guestId, 'executeJavaScript', args...
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', @guestId, 'executeJavaScript', args...
|
||||
|
||||
unless process.guestInstanceId?
|
||||
# Override default window.close.
|
||||
|
@ -56,17 +54,11 @@ window.open = (url, frameName='', features='') ->
|
|||
options.height ?= 600
|
||||
|
||||
# Resolve relative urls.
|
||||
url = resolveUrl url
|
||||
url = resolveURL url
|
||||
|
||||
(options[name] = parseInt(options[name], 10) if options[name]?) for name in ints
|
||||
|
||||
# Inherit the node-integration option of current window.
|
||||
unless options['node-integration']?
|
||||
for arg in process.argv when arg.indexOf('--node-integration=') is 0
|
||||
options['node-integration'] = arg.substr(-4) is 'true'
|
||||
break
|
||||
|
||||
guestId = ipc.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, options
|
||||
guestId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, options
|
||||
if guestId
|
||||
new BrowserWindowProxy(guestId)
|
||||
else
|
||||
|
@ -74,32 +66,30 @@ window.open = (url, frameName='', features='') ->
|
|||
|
||||
# Use the dialog API to implement alert().
|
||||
window.alert = (message, title='') ->
|
||||
dialog = remote.require 'dialog'
|
||||
buttons = ['OK']
|
||||
message = message.toString()
|
||||
dialog.showMessageBox remote.getCurrentWindow(), {message, title, buttons}
|
||||
remote.dialog.showMessageBox remote.getCurrentWindow(), {message, title, buttons}
|
||||
# Alert should always return undefined.
|
||||
return
|
||||
|
||||
# And the confirm().
|
||||
window.confirm = (message, title='') ->
|
||||
dialog = remote.require 'dialog'
|
||||
buttons = ['OK', 'Cancel']
|
||||
cancelId = 1
|
||||
not dialog.showMessageBox remote.getCurrentWindow(), {message, title, buttons, cancelId}
|
||||
not remote.dialog.showMessageBox remote.getCurrentWindow(), {message, title, buttons, cancelId}
|
||||
|
||||
# But we do not support prompt().
|
||||
window.prompt = ->
|
||||
throw new Error('prompt() is and will not be supported.')
|
||||
|
||||
# Implement window.postMessage if current window is a guest window.
|
||||
guestId = ipc.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID'
|
||||
guestId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID'
|
||||
if guestId?
|
||||
window.opener =
|
||||
postMessage: (message, targetOrigin='*') ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', guestId, message, targetOrigin, location.origin
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', guestId, message, targetOrigin, location.origin
|
||||
|
||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (guestId, message, sourceOrigin) ->
|
||||
ipcRenderer.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (event, guestId, message, sourceOrigin) ->
|
||||
# Manually dispatch event instead of using postMessage because we also need to
|
||||
# set event.source.
|
||||
event = document.createEvent 'Event'
|
||||
|
@ -111,10 +101,10 @@ ipc.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (guestId, message, sourceOrigin) -
|
|||
|
||||
# Forward history operations to browser.
|
||||
sendHistoryOperation = (args...) ->
|
||||
ipc.send 'ATOM_SHELL_NAVIGATION_CONTROLLER', args...
|
||||
ipcRenderer.send 'ATOM_SHELL_NAVIGATION_CONTROLLER', args...
|
||||
|
||||
getHistoryOperation = (args...) ->
|
||||
ipc.sendSync 'ATOM_SHELL_SYNC_NAVIGATION_CONTROLLER', args...
|
||||
ipcRenderer.sendSync 'ATOM_SHELL_SYNC_NAVIGATION_CONTROLLER', args...
|
||||
|
||||
window.history.back = -> sendHistoryOperation 'goBack'
|
||||
window.history.forward = -> sendHistoryOperation 'goForward'
|
||||
|
@ -122,3 +112,7 @@ window.history.go = (offset) -> sendHistoryOperation 'goToOffset', offset
|
|||
Object.defineProperty window.history, 'length',
|
||||
get: ->
|
||||
getHistoryOperation 'length'
|
||||
|
||||
# Make document.hidden return the correct value.
|
||||
Object.defineProperty document, 'hidden',
|
||||
get: -> !remote.getCurrentWindow().isVisible()
|
||||
|
|
|
@ -1,19 +1,18 @@
|
|||
ipc = require 'ipc'
|
||||
webFrame = require 'web-frame'
|
||||
{ipcRenderer, webFrame} = require 'electron'
|
||||
|
||||
requestId = 0
|
||||
|
||||
WEB_VIEW_EVENTS =
|
||||
'load-commit': ['url', 'isMainFrame']
|
||||
'did-finish-load': []
|
||||
'did-fail-load': ['errorCode', 'errorDescription', 'validatedUrl']
|
||||
'did-fail-load': ['errorCode', 'errorDescription', 'validatedURL']
|
||||
'did-frame-finish-load': ['isMainFrame']
|
||||
'did-start-loading': []
|
||||
'did-stop-loading': []
|
||||
'did-get-response-details': ['status', 'newUrl', 'originalUrl',
|
||||
'did-get-response-details': ['status', 'newURL', 'originalURL',
|
||||
'httpResponseCode', 'requestMethod', 'referrer',
|
||||
'headers']
|
||||
'did-get-redirect-request': ['oldUrl', 'newUrl', 'isMainFrame']
|
||||
'did-get-redirect-request': ['oldURL', 'newURL', 'isMainFrame']
|
||||
'dom-ready': []
|
||||
'console-message': ['level', 'message', 'line', 'sourceId']
|
||||
'new-window': ['url', 'frameName', 'disposition', 'options']
|
||||
|
@ -22,55 +21,59 @@ WEB_VIEW_EVENTS =
|
|||
'gpu-crashed': []
|
||||
'plugin-crashed': ['name', 'version']
|
||||
'destroyed': []
|
||||
'page-title-set': ['title', 'explicitSet']
|
||||
'page-title-updated': ['title', 'explicitSet']
|
||||
'page-favicon-updated': ['favicons']
|
||||
'enter-html-full-screen': []
|
||||
'leave-html-full-screen': []
|
||||
|
||||
dispatchEvent = (webView, event, args...) ->
|
||||
throw new Error("Unknown event #{event}") unless WEB_VIEW_EVENTS[event]?
|
||||
domEvent = new Event(event)
|
||||
for f, i in WEB_VIEW_EVENTS[event]
|
||||
DEPRECATED_EVENTS =
|
||||
'page-title-updated': 'page-title-set'
|
||||
|
||||
dispatchEvent = (webView, eventName, eventKey, args...) ->
|
||||
if DEPRECATED_EVENTS[eventName]?
|
||||
dispatchEvent webView, DEPRECATED_EVENTS[eventName], eventKey, args...
|
||||
domEvent = new Event(eventName)
|
||||
for f, i in WEB_VIEW_EVENTS[eventKey]
|
||||
domEvent[f] = args[i]
|
||||
webView.dispatchEvent domEvent
|
||||
webView.onLoadCommit domEvent if event == 'load-commit'
|
||||
webView.onLoadCommit domEvent if eventName is 'load-commit'
|
||||
|
||||
module.exports =
|
||||
registerEvents: (webView, viewInstanceId) ->
|
||||
ipc.on "ATOM_SHELL_GUEST_VIEW_INTERNAL_DISPATCH_EVENT-#{viewInstanceId}", (event, args...) ->
|
||||
dispatchEvent webView, event, args...
|
||||
ipcRenderer.on "ATOM_SHELL_GUEST_VIEW_INTERNAL_DISPATCH_EVENT-#{viewInstanceId}", (event, eventName, args...) ->
|
||||
dispatchEvent webView, eventName, eventName, args...
|
||||
|
||||
ipc.on "ATOM_SHELL_GUEST_VIEW_INTERNAL_IPC_MESSAGE-#{viewInstanceId}", (channel, args...) ->
|
||||
ipcRenderer.on "ATOM_SHELL_GUEST_VIEW_INTERNAL_IPC_MESSAGE-#{viewInstanceId}", (event, channel, args...) ->
|
||||
domEvent = new Event('ipc-message')
|
||||
domEvent.channel = channel
|
||||
domEvent.args = [args...]
|
||||
webView.dispatchEvent domEvent
|
||||
|
||||
ipc.on "ATOM_SHELL_GUEST_VIEW_INTERNAL_SIZE_CHANGED-#{viewInstanceId}", (args...) ->
|
||||
ipcRenderer.on "ATOM_SHELL_GUEST_VIEW_INTERNAL_SIZE_CHANGED-#{viewInstanceId}", (event, args...) ->
|
||||
domEvent = new Event('size-changed')
|
||||
for f, i in ['oldWidth', 'oldHeight', 'newWidth', 'newHeight']
|
||||
domEvent[f] = args[i]
|
||||
webView.onSizeChanged domEvent
|
||||
|
||||
deregisterEvents: (viewInstanceId) ->
|
||||
ipc.removeAllListeners "ATOM_SHELL_GUEST_VIEW_INTERNAL_DISPATCH_EVENT-#{viewInstanceId}"
|
||||
ipc.removeAllListeners "ATOM_SHELL_GUEST_VIEW_INTERNAL_IPC_MESSAGE-#{viewInstanceId}"
|
||||
ipc.removeAllListeners "ATOM_SHELL_GUEST_VIEW_INTERNAL_SIZE_CHANGED-#{viewInstanceId}"
|
||||
ipcRenderer.removeAllListeners "ATOM_SHELL_GUEST_VIEW_INTERNAL_DISPATCH_EVENT-#{viewInstanceId}"
|
||||
ipcRenderer.removeAllListeners "ATOM_SHELL_GUEST_VIEW_INTERNAL_IPC_MESSAGE-#{viewInstanceId}"
|
||||
ipcRenderer.removeAllListeners "ATOM_SHELL_GUEST_VIEW_INTERNAL_SIZE_CHANGED-#{viewInstanceId}"
|
||||
|
||||
createGuest: (params, callback) ->
|
||||
requestId++
|
||||
ipc.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_CREATE_GUEST', params, requestId
|
||||
ipc.once "ATOM_SHELL_RESPONSE_#{requestId}", callback
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_CREATE_GUEST', params, requestId
|
||||
ipcRenderer.once "ATOM_SHELL_RESPONSE_#{requestId}", callback
|
||||
|
||||
attachGuest: (elementInstanceId, guestInstanceId, params) ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_ATTACH_GUEST', elementInstanceId, guestInstanceId, params
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_ATTACH_GUEST', elementInstanceId, guestInstanceId, params
|
||||
webFrame.attachGuest elementInstanceId
|
||||
|
||||
destroyGuest: (guestInstanceId) ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', guestInstanceId
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', guestInstanceId
|
||||
|
||||
setSize: (guestInstanceId, params) ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_SIZE', guestInstanceId, params
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_SIZE', guestInstanceId, params
|
||||
|
||||
setAllowTransparency: (guestInstanceId, allowtransparency) ->
|
||||
ipc.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_ALLOW_TRANSPARENCY', guestInstanceId, allowtransparency
|
||||
ipcRenderer.send 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_ALLOW_TRANSPARENCY', guestInstanceId, allowtransparency
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
WebViewImpl = require './web-view'
|
||||
guestViewInternal = require './guest-view-internal'
|
||||
webViewConstants = require './web-view-constants'
|
||||
remote = require 'remote'
|
||||
|
||||
{remote} = require 'electron'
|
||||
|
||||
# Helper function to resolve url set in attribute.
|
||||
a = document.createElement 'a'
|
||||
resolveUrl = (url) ->
|
||||
resolveURL = (url) ->
|
||||
a.href = url
|
||||
a.href
|
||||
|
||||
|
@ -115,7 +116,7 @@ class SrcAttribute extends WebViewAttribute
|
|||
|
||||
getValue: ->
|
||||
if @webViewImpl.webviewNode.hasAttribute @name
|
||||
resolveUrl @webViewImpl.webviewNode.getAttribute(@name)
|
||||
resolveURL @webViewImpl.webviewNode.getAttribute(@name)
|
||||
else
|
||||
''
|
||||
|
||||
|
@ -177,7 +178,7 @@ class SrcAttribute extends WebViewAttribute
|
|||
if useragent then opts.userAgent = useragent
|
||||
|
||||
guestContents = remote.getGuestWebContents(@webViewImpl.guestInstanceId)
|
||||
guestContents.loadUrl @getValue(), opts
|
||||
guestContents.loadURL @getValue(), opts
|
||||
|
||||
# Attribute specifies HTTP referrer.
|
||||
class HttpReferrerAttribute extends WebViewAttribute
|
||||
|
@ -196,7 +197,7 @@ class PreloadAttribute extends WebViewAttribute
|
|||
|
||||
getValue: ->
|
||||
return '' unless @webViewImpl.webviewNode.hasAttribute @name
|
||||
preload = resolveUrl @webViewImpl.webviewNode.getAttribute(@name)
|
||||
preload = resolveURL @webViewImpl.webviewNode.getAttribute(@name)
|
||||
protocol = preload.substr 0, 5
|
||||
unless protocol is 'file:'
|
||||
console.error webViewConstants.ERROR_MSG_INVALID_PRELOAD_ATTRIBUTE
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
{deprecate, webFrame, remote, ipcRenderer} = require 'electron'
|
||||
v8Util = process.atomBinding 'v8_util'
|
||||
|
||||
guestViewInternal = require './guest-view-internal'
|
||||
webViewConstants = require './web-view-constants'
|
||||
webFrame = require 'web-frame'
|
||||
remote = require 'remote'
|
||||
|
||||
# ID generator.
|
||||
nextId = 0
|
||||
|
@ -46,6 +46,7 @@ class WebViewImpl
|
|||
# that we don't end up allocating a second guest.
|
||||
if @guestInstanceId
|
||||
guestViewInternal.destroyGuest @guestInstanceId
|
||||
@webContents = null
|
||||
@guestInstanceId = undefined
|
||||
@beforeFirstNavigation = true
|
||||
@attributes[webViewConstants.ATTRIBUTE_PARTITION].validPartitionId = true
|
||||
|
@ -134,7 +135,7 @@ class WebViewImpl
|
|||
guestViewInternal.setSize @guestInstanceId, normal: newSize
|
||||
|
||||
createGuest: ->
|
||||
guestViewInternal.createGuest @buildParams(), (guestInstanceId) =>
|
||||
guestViewInternal.createGuest @buildParams(), (event, guestInstanceId) =>
|
||||
@attachWindow guestInstanceId
|
||||
|
||||
dispatchEvent: (webViewEvent) ->
|
||||
|
@ -188,6 +189,7 @@ class WebViewImpl
|
|||
|
||||
attachWindow: (guestInstanceId) ->
|
||||
@guestInstanceId = guestInstanceId
|
||||
@webContents = remote.getGuestWebContents @guestInstanceId
|
||||
return true unless @internalInstanceId
|
||||
|
||||
guestViewInternal.attachGuest @internalInstanceId, @guestInstanceId, @buildParams()
|
||||
|
@ -250,57 +252,71 @@ registerWebViewElement = ->
|
|||
|
||||
# Public-facing API methods.
|
||||
methods = [
|
||||
"getUrl"
|
||||
"getTitle"
|
||||
"isLoading"
|
||||
"isWaitingForResponse"
|
||||
"stop"
|
||||
"reload"
|
||||
"reloadIgnoringCache"
|
||||
"canGoBack"
|
||||
"canGoForward"
|
||||
"canGoToOffset"
|
||||
"clearHistory"
|
||||
"goBack"
|
||||
"goForward"
|
||||
"goToIndex"
|
||||
"goToOffset"
|
||||
"isCrashed"
|
||||
"setUserAgent"
|
||||
"getUserAgent"
|
||||
"executeJavaScript"
|
||||
"insertCSS"
|
||||
"openDevTools"
|
||||
"closeDevTools"
|
||||
"isDevToolsOpened"
|
||||
"inspectElement"
|
||||
"setAudioMuted"
|
||||
"isAudioMuted"
|
||||
"undo"
|
||||
"redo"
|
||||
"cut"
|
||||
"copy"
|
||||
"paste"
|
||||
"pasteAndMatchStyle"
|
||||
"delete"
|
||||
"selectAll"
|
||||
"unselect"
|
||||
"replace"
|
||||
"replaceMisspelling"
|
||||
"send"
|
||||
"getId"
|
||||
"inspectServiceWorker"
|
||||
"print"
|
||||
"printToPDF"
|
||||
"sendInputEvent"
|
||||
'getURL'
|
||||
'getTitle'
|
||||
'isLoading'
|
||||
'isWaitingForResponse'
|
||||
'stop'
|
||||
'reload'
|
||||
'reloadIgnoringCache'
|
||||
'canGoBack'
|
||||
'canGoForward'
|
||||
'canGoToOffset'
|
||||
'clearHistory'
|
||||
'goBack'
|
||||
'goForward'
|
||||
'goToIndex'
|
||||
'goToOffset'
|
||||
'isCrashed'
|
||||
'setUserAgent'
|
||||
'getUserAgent'
|
||||
'openDevTools'
|
||||
'closeDevTools'
|
||||
'isDevToolsOpened'
|
||||
'inspectElement'
|
||||
'setAudioMuted'
|
||||
'isAudioMuted'
|
||||
'undo'
|
||||
'redo'
|
||||
'cut'
|
||||
'copy'
|
||||
'paste'
|
||||
'pasteAndMatchStyle'
|
||||
'delete'
|
||||
'selectAll'
|
||||
'unselect'
|
||||
'replace'
|
||||
'replaceMisspelling'
|
||||
'getId'
|
||||
'downloadURL'
|
||||
'inspectServiceWorker'
|
||||
'print'
|
||||
'printToPDF'
|
||||
]
|
||||
|
||||
nonblockMethods = [
|
||||
'send',
|
||||
'sendInputEvent',
|
||||
'executeJavaScript',
|
||||
'insertCSS'
|
||||
]
|
||||
|
||||
# Forward proto.foo* method calls to WebViewImpl.foo*.
|
||||
createHandler = (m) ->
|
||||
createBlockHandler = (m) ->
|
||||
(args...) ->
|
||||
internal = v8Util.getHiddenValue this, 'internal'
|
||||
remote.getGuestWebContents(internal.guestInstanceId)[m] args...
|
||||
proto[m] = createHandler m for m in methods
|
||||
internal.webContents[m] args...
|
||||
proto[m] = createBlockHandler m for m in methods
|
||||
|
||||
createNonBlockHandler = (m) ->
|
||||
(args...) ->
|
||||
internal = v8Util.getHiddenValue this, 'internal'
|
||||
ipcRenderer.send('ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', internal.guestInstanceId, m, args...)
|
||||
|
||||
proto[m] = createNonBlockHandler m for m in nonblockMethods
|
||||
|
||||
# Deprecated.
|
||||
deprecate.rename proto, 'getUrl', 'getURL'
|
||||
|
||||
window.WebView = webFrame.registerEmbedderCustomElement 'webview',
|
||||
prototype: proto
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue