Merge pull request #2447 from atom/fix-microtask-checkpoint
Make sure microtask checkpoint is performed after Node.js calls
This commit is contained in:
commit
b65e089028
25 changed files with 233 additions and 28 deletions
|
@ -17,6 +17,7 @@
|
||||||
#include "atom/browser/atom_browser_main_parts.h"
|
#include "atom/browser/atom_browser_main_parts.h"
|
||||||
#include "atom/browser/browser.h"
|
#include "atom/browser/browser.h"
|
||||||
#include "atom/browser/api/atom_api_web_contents.h"
|
#include "atom/browser/api/atom_api_web_contents.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "base/command_line.h"
|
#include "base/command_line.h"
|
||||||
#include "base/environment.h"
|
#include "base/environment.h"
|
||||||
|
@ -25,7 +26,6 @@
|
||||||
#include "brightray/browser/brightray_paths.h"
|
#include "brightray/browser/brightray_paths.h"
|
||||||
#include "content/public/browser/client_certificate_delegate.h"
|
#include "content/public/browser/client_certificate_delegate.h"
|
||||||
#include "content/public/browser/gpu_data_manager.h"
|
#include "content/public/browser/gpu_data_manager.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
#include "net/ssl/ssl_cert_request_info.h"
|
#include "net/ssl/ssl_cert_request_info.h"
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "base/bind.h"
|
#include "base/bind.h"
|
||||||
#include "base/files/file_util.h"
|
#include "base/files/file_util.h"
|
||||||
#include "content/public/browser/tracing_controller.h"
|
#include "content/public/browser/tracing_controller.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
|
|
||||||
#include "atom/common/node_includes.h"
|
#include "atom/common/node_includes.h"
|
||||||
|
|
|
@ -4,13 +4,13 @@
|
||||||
|
|
||||||
#include "atom/browser/api/atom_api_cookies.h"
|
#include "atom/browser/api/atom_api_cookies.h"
|
||||||
|
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
#include "atom/common/native_mate_converters/value_converter.h"
|
#include "atom/common/native_mate_converters/value_converter.h"
|
||||||
#include "base/bind.h"
|
#include "base/bind.h"
|
||||||
#include "base/time/time.h"
|
#include "base/time/time.h"
|
||||||
#include "content/public/browser/browser_context.h"
|
#include "content/public/browser/browser_context.h"
|
||||||
#include "content/public/browser/browser_thread.h"
|
#include "content/public/browser/browser_thread.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
#include "net/cookies/cookie_monster.h"
|
#include "net/cookies/cookie_monster.h"
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/browser/ui/file_dialog.h"
|
#include "atom/browser/ui/file_dialog.h"
|
||||||
#include "atom/browser/ui/message_box.h"
|
#include "atom/browser/ui/message_box.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "atom/common/native_mate_converters/image_converter.h"
|
#include "atom/common/native_mate_converters/image_converter.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
|
|
||||||
#include "atom/common/node_includes.h"
|
#include "atom/common/node_includes.h"
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "atom/common/native_mate_converters/accelerator_converter.h"
|
#include "atom/common/native_mate_converters/accelerator_converter.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "base/stl_util.h"
|
#include "base/stl_util.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
|
|
||||||
#include "atom/common/node_includes.h"
|
#include "atom/common/node_includes.h"
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/common/native_mate_converters/accelerator_converter.h"
|
#include "atom/common/native_mate_converters/accelerator_converter.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/image_converter.h"
|
#include "atom/common/native_mate_converters/image_converter.h"
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/constructor.h"
|
#include "native_mate/constructor.h"
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
|
|
|
@ -10,10 +10,10 @@
|
||||||
#include "atom/browser/api/atom_api_session.h"
|
#include "atom/browser/api/atom_api_session.h"
|
||||||
#include "atom/browser/net/adapter_request_job.h"
|
#include "atom/browser/net/adapter_request_job.h"
|
||||||
#include "atom/browser/net/atom_url_request_job_factory.h"
|
#include "atom/browser/net/atom_url_request_job_factory.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
#include "content/public/browser/browser_thread.h"
|
#include "content/public/browser/browser_thread.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "net/url_request/url_request_context.h"
|
#include "net/url_request/url_request_context.h"
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include "atom/browser/api/atom_api_cookies.h"
|
#include "atom/browser/api/atom_api_cookies.h"
|
||||||
#include "atom/browser/atom_browser_context.h"
|
#include "atom/browser/atom_browser_context.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "base/files/file_path.h"
|
#include "base/files/file_path.h"
|
||||||
|
@ -18,7 +19,6 @@
|
||||||
#include "chrome/common/pref_names.h"
|
#include "chrome/common/pref_names.h"
|
||||||
#include "content/public/browser/browser_thread.h"
|
#include "content/public/browser/browser_thread.h"
|
||||||
#include "content/public/browser/storage_partition.h"
|
#include "content/public/browser/storage_partition.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
#include "net/base/load_flags.h"
|
#include "net/base/load_flags.h"
|
||||||
#include "net/disk_cache/disk_cache.h"
|
#include "net/disk_cache/disk_cache.h"
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/browser/web_view_guest_delegate.h"
|
#include "atom/browser/web_view_guest_delegate.h"
|
||||||
#include "atom/common/api/api_messages.h"
|
#include "atom/common/api/api_messages.h"
|
||||||
#include "atom/common/event_emitter_caller.h"
|
#include "atom/common/api/event_emitter_caller.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "atom/common/native_mate_converters/gfx_converter.h"
|
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
|
@ -37,7 +38,6 @@
|
||||||
#include "content/public/browser/storage_partition.h"
|
#include "content/public/browser/storage_partition.h"
|
||||||
#include "content/public/browser/site_instance.h"
|
#include "content/public/browser/site_instance.h"
|
||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
#include "net/http/http_response_headers.h"
|
#include "net/http/http_response_headers.h"
|
||||||
|
|
|
@ -8,12 +8,12 @@
|
||||||
#include "atom/browser/api/atom_api_web_contents.h"
|
#include "atom/browser/api/atom_api_web_contents.h"
|
||||||
#include "atom/browser/browser.h"
|
#include "atom/browser/browser.h"
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/gfx_converter.h"
|
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
#include "atom/common/native_mate_converters/image_converter.h"
|
#include "atom/common/native_mate_converters/image_converter.h"
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
#include "content/public/browser/render_process_host.h"
|
#include "content/public/browser/render_process_host.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/constructor.h"
|
#include "native_mate/constructor.h"
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "ui/gfx/geometry/rect.h"
|
#include "ui/gfx/geometry/rect.h"
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "atom/common/event_emitter_caller.h"
|
#include "atom/common/api/event_emitter_caller.h"
|
||||||
#include "native_mate/wrappable.h"
|
#include "native_mate/wrappable.h"
|
||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
|
|
||||||
#include "atom_natives.h" // NOLINT: This file is generated with coffee2c.
|
#include "atom_natives.h" // NOLINT: This file is generated with coffee2c.
|
||||||
#include "atom/common/asar/archive.h"
|
#include "atom/common/asar/archive.h"
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "native_mate/arguments.h"
|
#include "native_mate/arguments.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
#include "native_mate/wrappable.h"
|
#include "native_mate/wrappable.h"
|
||||||
|
|
|
@ -98,6 +98,10 @@ void AtomBindings::OnCallNextTick(uv_async_t* handle) {
|
||||||
if (tick_info->in_tick())
|
if (tick_info->in_tick())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (tick_info->length() == 0) {
|
||||||
|
env->isolate()->RunMicrotasks();
|
||||||
|
}
|
||||||
|
|
||||||
if (tick_info->length() == 0) {
|
if (tick_info->length() == 0) {
|
||||||
tick_info->set_index(0);
|
tick_info->set_index(0);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -2,7 +2,11 @@
|
||||||
// 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 "atom/common/event_emitter_caller.h"
|
#include "atom/common/api/event_emitter_caller.h"
|
||||||
|
|
||||||
|
#include "atom/common/api/locker.h"
|
||||||
|
#include "base/memory/scoped_ptr.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
|
|
||||||
#include "atom/common/node_includes.h"
|
#include "atom/common/node_includes.h"
|
||||||
|
|
||||||
|
@ -13,6 +17,12 @@ namespace internal {
|
||||||
v8::Local<v8::Value> CallEmitWithArgs(v8::Isolate* isolate,
|
v8::Local<v8::Value> CallEmitWithArgs(v8::Isolate* isolate,
|
||||||
v8::Local<v8::Object> obj,
|
v8::Local<v8::Object> obj,
|
||||||
ValueVector* args) {
|
ValueVector* args) {
|
||||||
|
// Perform microtask checkpoint after running JavaScript.
|
||||||
|
scoped_ptr<blink::WebScopedRunV8Script> script_scope(
|
||||||
|
Locker::IsBrowserProcess() ?
|
||||||
|
nullptr : new blink::WebScopedRunV8Script(isolate));
|
||||||
|
// Use node::MakeCallback to call the callback, and it will also run pending
|
||||||
|
// tasks in Node.js.
|
||||||
return node::MakeCallback(
|
return node::MakeCallback(
|
||||||
isolate, obj, "emit", args->size(), &args->front());
|
isolate, obj, "emit", args->size(), &args->front());
|
||||||
}
|
}
|
|
@ -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 ATOM_COMMON_EVENT_EMITTER_CALLER_H_
|
#ifndef ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_
|
||||||
#define ATOM_COMMON_EVENT_EMITTER_CALLER_H_
|
#define ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -50,4 +50,4 @@ v8::Local<v8::Value> EmitEvent(v8::Isolate* isolate,
|
||||||
|
|
||||||
} // namespace mate
|
} // namespace mate
|
||||||
|
|
||||||
#endif // ATOM_COMMON_EVENT_EMITTER_CALLER_H_
|
#endif // ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_
|
17
atom/common/api/locker.cc
Normal file
17
atom/common/api/locker.cc
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// 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.chromium file.
|
||||||
|
|
||||||
|
#include "atom/common/api/locker.h"
|
||||||
|
|
||||||
|
namespace mate {
|
||||||
|
|
||||||
|
Locker::Locker(v8::Isolate* isolate) {
|
||||||
|
if (IsBrowserProcess())
|
||||||
|
locker_.reset(new v8::Locker(isolate));
|
||||||
|
}
|
||||||
|
|
||||||
|
Locker::~Locker() {
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace mate
|
34
atom/common/api/locker.h
Normal file
34
atom/common/api/locker.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
// 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.chromium file.
|
||||||
|
|
||||||
|
#ifndef ATOM_COMMON_API_LOCKER_H_
|
||||||
|
#define ATOM_COMMON_API_LOCKER_H_
|
||||||
|
|
||||||
|
#include "base/memory/scoped_ptr.h"
|
||||||
|
#include "v8/include/v8.h"
|
||||||
|
|
||||||
|
namespace mate {
|
||||||
|
|
||||||
|
// Only lock when lockers are used in current thread.
|
||||||
|
class Locker {
|
||||||
|
public:
|
||||||
|
explicit Locker(v8::Isolate* isolate);
|
||||||
|
~Locker();
|
||||||
|
|
||||||
|
// Returns whether current process is browser process, currently we detect it
|
||||||
|
// by checking whether current has used V8 Lock, but it might be a bad idea.
|
||||||
|
static inline bool IsBrowserProcess() { return v8::Locker::IsActive(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void* operator new(size_t size);
|
||||||
|
void operator delete(void*, size_t);
|
||||||
|
|
||||||
|
scoped_ptr<v8::Locker> locker_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(Locker);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace mate
|
||||||
|
|
||||||
|
#endif // ATOM_COMMON_API_LOCKER_H_
|
104
atom/common/native_mate_converters/callback.h
Normal file
104
atom/common/native_mate_converters/callback.h
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
// Copyright (c) 2015 GitHub, Inc. All rights reserved.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_COMMON_NATIVE_MATE_CONVERTERS_CALLBACK_H_
|
||||||
|
#define ATOM_COMMON_NATIVE_MATE_CONVERTERS_CALLBACK_H_
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "atom/common/api/locker.h"
|
||||||
|
#include "base/bind.h"
|
||||||
|
#include "base/callback.h"
|
||||||
|
#include "native_mate/function_template.h"
|
||||||
|
#include "native_mate/scoped_persistent.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
|
|
||||||
|
namespace mate {
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
typedef scoped_refptr<RefCountedPersistent<v8::Function> > SafeV8Function;
|
||||||
|
|
||||||
|
template <typename Sig>
|
||||||
|
struct V8FunctionInvoker {};
|
||||||
|
|
||||||
|
template <typename... ArgTypes>
|
||||||
|
struct V8FunctionInvoker<v8::Local<v8::Value>(ArgTypes...)> {
|
||||||
|
static v8::Local<v8::Value> Go(v8::Isolate* isolate, SafeV8Function function,
|
||||||
|
ArgTypes... raw) {
|
||||||
|
Locker locker(isolate);
|
||||||
|
v8::EscapableHandleScope handle_scope(isolate);
|
||||||
|
scoped_ptr<blink::WebScopedRunV8Script> script_scope(
|
||||||
|
Locker::IsBrowserProcess() ?
|
||||||
|
nullptr : new blink::WebScopedRunV8Script(isolate));
|
||||||
|
v8::Local<v8::Function> holder = function->NewHandle();
|
||||||
|
v8::Local<v8::Context> context = holder->CreationContext();
|
||||||
|
v8::Context::Scope context_scope(context);
|
||||||
|
std::vector<v8::Local<v8::Value>> args = { ConvertToV8(isolate, raw)... };
|
||||||
|
v8::Local<v8::Value> ret(holder->Call(holder, args.size(), &args.front()));
|
||||||
|
return handle_scope.Escape(ret);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... ArgTypes>
|
||||||
|
struct V8FunctionInvoker<void(ArgTypes...)> {
|
||||||
|
static void Go(v8::Isolate* isolate, SafeV8Function function,
|
||||||
|
ArgTypes... raw) {
|
||||||
|
Locker locker(isolate);
|
||||||
|
v8::HandleScope handle_scope(isolate);
|
||||||
|
scoped_ptr<blink::WebScopedRunV8Script> script_scope(
|
||||||
|
Locker::IsBrowserProcess() ?
|
||||||
|
nullptr : new blink::WebScopedRunV8Script(isolate));
|
||||||
|
v8::Local<v8::Function> holder = function->NewHandle();
|
||||||
|
v8::Local<v8::Context> context = holder->CreationContext();
|
||||||
|
v8::Context::Scope context_scope(context);
|
||||||
|
std::vector<v8::Local<v8::Value>> args = { ConvertToV8(isolate, raw)... };
|
||||||
|
holder->Call(holder, args.size(), &args.front());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename ReturnType, typename... ArgTypes>
|
||||||
|
struct V8FunctionInvoker<ReturnType(ArgTypes...)> {
|
||||||
|
static ReturnType Go(v8::Isolate* isolate, SafeV8Function function,
|
||||||
|
ArgTypes... raw) {
|
||||||
|
Locker locker(isolate);
|
||||||
|
v8::HandleScope handle_scope(isolate);
|
||||||
|
scoped_ptr<blink::WebScopedRunV8Script> script_scope(
|
||||||
|
Locker::IsBrowserProcess() ?
|
||||||
|
nullptr : new blink::WebScopedRunV8Script(isolate));
|
||||||
|
v8::Local<v8::Function> holder = function->NewHandle();
|
||||||
|
v8::Local<v8::Context> context = holder->CreationContext();
|
||||||
|
v8::Context::Scope context_scope(context);
|
||||||
|
ReturnType ret;
|
||||||
|
std::vector<v8::Local<v8::Value>> args = { ConvertToV8(isolate, raw)... };
|
||||||
|
v8::Local<v8::Value> val(holder->Call(holder, args.size(), &args.front()));
|
||||||
|
Converter<ReturnType>::FromV8(isolate, val, &ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
|
template<typename Sig>
|
||||||
|
struct Converter<base::Callback<Sig> > {
|
||||||
|
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
|
||||||
|
const base::Callback<Sig>& val) {
|
||||||
|
return CreateFunctionTemplate(isolate, val)->GetFunction();
|
||||||
|
}
|
||||||
|
static bool FromV8(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::Value> val,
|
||||||
|
base::Callback<Sig>* out) {
|
||||||
|
if (!val->IsFunction())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
internal::SafeV8Function function(
|
||||||
|
new RefCountedPersistent<v8::Function>(isolate, val));
|
||||||
|
*out = base::Bind(&internal::V8FunctionInvoker<Sig>::Go, isolate, function);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace mate
|
||||||
|
|
||||||
|
#endif // ATOM_COMMON_NATIVE_MATE_CONVERTERS_CALLBACK_H_
|
|
@ -7,8 +7,9 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "atom/common/api/event_emitter_caller.h"
|
||||||
|
#include "atom/common/api/locker.h"
|
||||||
#include "atom/common/atom_command_line.h"
|
#include "atom/common/atom_command_line.h"
|
||||||
#include "atom/common/event_emitter_caller.h"
|
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "base/command_line.h"
|
#include "base/command_line.h"
|
||||||
#include "base/base_paths.h"
|
#include "base/base_paths.h"
|
||||||
|
@ -17,8 +18,8 @@
|
||||||
#include "base/path_service.h"
|
#include "base/path_service.h"
|
||||||
#include "content/public/browser/browser_thread.h"
|
#include "content/public/browser/browser_thread.h"
|
||||||
#include "content/public/common/content_paths.h"
|
#include "content/public/common/content_paths.h"
|
||||||
#include "native_mate/locker.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
|
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
|
||||||
|
|
||||||
#include "atom/common/node_includes.h"
|
#include "atom/common/node_includes.h"
|
||||||
|
|
||||||
|
@ -227,6 +228,10 @@ void NodeBindings::UvRunOnce() {
|
||||||
// Enter node context while dealing with uv events.
|
// Enter node context while dealing with uv events.
|
||||||
v8::Context::Scope context_scope(env->context());
|
v8::Context::Scope context_scope(env->context());
|
||||||
|
|
||||||
|
// Perform microtask checkpoint after running JavaScript.
|
||||||
|
scoped_ptr<blink::WebScopedRunV8Script> script_scope(
|
||||||
|
is_browser_ ? nullptr : new blink::WebScopedRunV8Script(env->isolate()));
|
||||||
|
|
||||||
// Deal with uv events.
|
// Deal with uv events.
|
||||||
int r = uv_run(uv_loop_, UV_RUN_NOWAIT);
|
int r = uv_run(uv_loop_, UV_RUN_NOWAIT);
|
||||||
if (r == 0 || uv_loop_->stop_flag != 0)
|
if (r == 0 || uv_loop_->stop_flag != 0)
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
#include "atom/renderer/api/atom_api_web_frame.h"
|
#include "atom/renderer/api/atom_api_web_frame.h"
|
||||||
|
|
||||||
|
#include "atom/common/native_mate_converters/callback.h"
|
||||||
#include "atom/common/native_mate_converters/gfx_converter.h"
|
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
#include "atom/renderer/api/atom_api_spell_check_client.h"
|
#include "atom/renderer/api/atom_api_spell_check_client.h"
|
||||||
#include "content/public/renderer/render_frame.h"
|
#include "content/public/renderer/render_frame.h"
|
||||||
#include "native_mate/callback.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
#include "third_party/WebKit/public/web/WebDocument.h"
|
#include "third_party/WebKit/public/web/WebDocument.h"
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
|
|
||||||
#include "atom/common/api/api_messages.h"
|
#include "atom/common/api/api_messages.h"
|
||||||
#include "atom/common/event_emitter_caller.h"
|
#include "atom/common/api/event_emitter_caller.h"
|
||||||
#include "atom/common/native_mate_converters/value_converter.h"
|
#include "atom/common/native_mate_converters/value_converter.h"
|
||||||
#include "atom/common/options_switches.h"
|
#include "atom/common/options_switches.h"
|
||||||
#include "atom/renderer/atom_renderer_client.h"
|
#include "atom/renderer/atom_renderer_client.h"
|
||||||
|
@ -162,8 +162,7 @@ void AtomRenderViewObserver::OnJavaScriptExecuteRequest(
|
||||||
v8::HandleScope handle_scope(isolate);
|
v8::HandleScope handle_scope(isolate);
|
||||||
|
|
||||||
blink::WebFrame* frame = render_view()->GetWebView()->mainFrame();
|
blink::WebFrame* frame = render_view()->GetWebView()->mainFrame();
|
||||||
frame->executeScriptAndReturnValue(
|
frame->executeScriptAndReturnValue(blink::WebScriptSource(code));
|
||||||
blink::WebScriptSource(code));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|
|
@ -238,6 +238,10 @@
|
||||||
'atom/common/api/atom_api_v8_util.cc',
|
'atom/common/api/atom_api_v8_util.cc',
|
||||||
'atom/common/api/atom_bindings.cc',
|
'atom/common/api/atom_bindings.cc',
|
||||||
'atom/common/api/atom_bindings.h',
|
'atom/common/api/atom_bindings.h',
|
||||||
|
'atom/common/api/event_emitter_caller.cc',
|
||||||
|
'atom/common/api/event_emitter_caller.h',
|
||||||
|
'atom/common/api/locker.cc',
|
||||||
|
'atom/common/api/locker.h',
|
||||||
'atom/common/api/object_life_monitor.cc',
|
'atom/common/api/object_life_monitor.cc',
|
||||||
'atom/common/api/object_life_monitor.h',
|
'atom/common/api/object_life_monitor.h',
|
||||||
'atom/common/asar/archive.cc',
|
'atom/common/asar/archive.cc',
|
||||||
|
@ -266,14 +270,13 @@
|
||||||
'atom/common/crash_reporter/win/crash_service_main.h',
|
'atom/common/crash_reporter/win/crash_service_main.h',
|
||||||
'atom/common/draggable_region.cc',
|
'atom/common/draggable_region.cc',
|
||||||
'atom/common/draggable_region.h',
|
'atom/common/draggable_region.h',
|
||||||
'atom/common/event_emitter_caller.cc',
|
|
||||||
'atom/common/event_emitter_caller.h',
|
|
||||||
'atom/common/google_api_key.h',
|
'atom/common/google_api_key.h',
|
||||||
'atom/common/id_weak_map.cc',
|
'atom/common/id_weak_map.cc',
|
||||||
'atom/common/id_weak_map.h',
|
'atom/common/id_weak_map.h',
|
||||||
'atom/common/linux/application_info.cc',
|
'atom/common/linux/application_info.cc',
|
||||||
'atom/common/native_mate_converters/accelerator_converter.cc',
|
'atom/common/native_mate_converters/accelerator_converter.cc',
|
||||||
'atom/common/native_mate_converters/accelerator_converter.h',
|
'atom/common/native_mate_converters/accelerator_converter.h',
|
||||||
|
'atom/common/native_mate_converters/callback.h',
|
||||||
'atom/common/native_mate_converters/file_path_converter.h',
|
'atom/common/native_mate_converters/file_path_converter.h',
|
||||||
'atom/common/native_mate_converters/gfx_converter.cc',
|
'atom/common/native_mate_converters/gfx_converter.cc',
|
||||||
'atom/common/native_mate_converters/gfx_converter.h',
|
'atom/common/native_mate_converters/gfx_converter.h',
|
||||||
|
|
|
@ -7,8 +7,8 @@ import sys
|
||||||
|
|
||||||
|
|
||||||
BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \
|
BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \
|
||||||
'http://gh-contractor-zcbenz.s3.amazonaws.com/libchromiumcontent'
|
'http://github-janky-artifacts.s3.amazonaws.com/libchromiumcontent'
|
||||||
LIBCHROMIUMCONTENT_COMMIT = '8c7f5b9adb9372130a9295b7e0fb19355f613cf9'
|
LIBCHROMIUMCONTENT_COMMIT = 'dd51a41b42246b0b5159bfad5e327c8cf10bc585'
|
||||||
|
|
||||||
PLATFORM = {
|
PLATFORM = {
|
||||||
'cygwin': 'win32',
|
'cygwin': 'win32',
|
||||||
|
|
|
@ -135,3 +135,32 @@ describe 'chromium feature', ->
|
||||||
else
|
else
|
||||||
done('user agent is empty')
|
done('user agent is empty')
|
||||||
websocket = new WebSocket("ws://127.0.0.1:#{port}")
|
websocket = new WebSocket("ws://127.0.0.1:#{port}")
|
||||||
|
|
||||||
|
describe 'Promise', ->
|
||||||
|
it 'resolves correctly in Node.js calls', (done) ->
|
||||||
|
document.registerElement('x-element', {
|
||||||
|
prototype: Object.create(HTMLElement.prototype, {
|
||||||
|
createdCallback: { value: -> }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
setImmediate ->
|
||||||
|
called = false
|
||||||
|
Promise.resolve().then ->
|
||||||
|
done(if called then undefined else new Error('wrong sequnce'))
|
||||||
|
document.createElement 'x-element'
|
||||||
|
called = true
|
||||||
|
|
||||||
|
it 'resolves correctly in Electron calls', (done) ->
|
||||||
|
document.registerElement('y-element', {
|
||||||
|
prototype: Object.create(HTMLElement.prototype, {
|
||||||
|
createdCallback: { value: -> }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
remote.getGlobal('setImmediate') ->
|
||||||
|
called = false
|
||||||
|
Promise.resolve().then ->
|
||||||
|
done(if called then undefined else new Error('wrong sequnce'))
|
||||||
|
document.createElement 'y-element'
|
||||||
|
called = true
|
||||||
|
|
2
vendor/native_mate
vendored
2
vendor/native_mate
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 656e403f0102c59428261c1eaad22912d2bbd3c5
|
Subproject commit 67d9eaa215e8727d86dc7b1f7a10be8699848f1f
|
Loading…
Reference in a new issue