Merge origin/master into enable-webview
This commit is contained in:
commit
74b7afbec7
155 changed files with 796 additions and 644 deletions
|
@ -44,6 +44,7 @@
|
|||
#include "base/process/process_handle.h"
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "base/threading/thread_task_runner_handle.h"
|
||||
#include "base/values.h"
|
||||
#include "brightray/browser/inspectable_web_contents.h"
|
||||
#include "brightray/browser/inspectable_web_contents_view.h"
|
||||
#include "chrome/browser/printing/print_preview_message_handler.h"
|
||||
|
@ -74,6 +75,7 @@
|
|||
#include "content/public/browser/storage_partition.h"
|
||||
#include "content/public/browser/web_contents.h"
|
||||
#include "content/public/common/context_menu_params.h"
|
||||
#include "native_mate/converter.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
#include "native_mate/object_template_builder.h"
|
||||
#include "net/url_request/url_request_context.h"
|
||||
|
@ -93,6 +95,7 @@ namespace {
|
|||
struct PrintSettings {
|
||||
bool silent;
|
||||
bool print_background;
|
||||
base::string16 device_name;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
@ -130,10 +133,25 @@ struct Converter<PrintSettings> {
|
|||
return false;
|
||||
dict.Get("silent", &(out->silent));
|
||||
dict.Get("printBackground", &(out->print_background));
|
||||
dict.Get("deviceName", &(out->device_name));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct Converter<printing::PrinterBasicInfo> {
|
||||
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
|
||||
const printing::PrinterBasicInfo& val) {
|
||||
mate::Dictionary dict(isolate, v8::Object::New(isolate));
|
||||
dict.Set("name", val.printer_name);
|
||||
dict.Set("description", val.printer_description);
|
||||
dict.Set("status", val.printer_status);
|
||||
dict.Set("isDefault", val.is_default ? true : false);
|
||||
dict.Set("options", val.options);
|
||||
return dict.GetHandle();
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct Converter<WindowOpenDisposition> {
|
||||
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
|
||||
|
@ -1291,7 +1309,7 @@ bool WebContents::IsAudioMuted() {
|
|||
}
|
||||
|
||||
void WebContents::Print(mate::Arguments* args) {
|
||||
PrintSettings settings = { false, false };
|
||||
PrintSettings settings = { false, false, base::string16() };
|
||||
if (args->Length() == 1 && !args->GetNext(&settings)) {
|
||||
args->ThrowError();
|
||||
return;
|
||||
|
@ -1300,7 +1318,15 @@ void WebContents::Print(mate::Arguments* args) {
|
|||
printing::PrintViewManagerBasic::FromWebContents(web_contents())->
|
||||
PrintNow(web_contents()->GetMainFrame(),
|
||||
settings.silent,
|
||||
settings.print_background);
|
||||
settings.print_background,
|
||||
settings.device_name);
|
||||
}
|
||||
|
||||
std::vector<printing::PrinterBasicInfo> WebContents::GetPrinterList() {
|
||||
std::vector<printing::PrinterBasicInfo> printers;
|
||||
auto print_backend = printing::PrintBackend::CreateInstance(nullptr);
|
||||
print_backend->EnumeratePrinters(&printers);
|
||||
return printers;
|
||||
}
|
||||
|
||||
void WebContents::PrintToPDF(const base::DictionaryValue& setting,
|
||||
|
@ -1844,6 +1870,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
|
|||
&WebContents::UnregisterServiceWorker)
|
||||
.SetMethod("inspectServiceWorker", &WebContents::InspectServiceWorker)
|
||||
.SetMethod("print", &WebContents::Print)
|
||||
.SetMethod("getPrinters", &WebContents::GetPrinterList)
|
||||
.SetMethod("_printToPDF", &WebContents::PrintToPDF)
|
||||
.SetMethod("addWorkSpace", &WebContents::AddWorkSpace)
|
||||
.SetMethod("removeWorkSpace", &WebContents::RemoveWorkSpace)
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "content/public/browser/web_contents_observer.h"
|
||||
#include "content/public/common/favicon_url.h"
|
||||
#include "native_mate/handle.h"
|
||||
#include "printing/backend/print_backend.h"
|
||||
#include "ui/gfx/image/image.h"
|
||||
|
||||
namespace blink {
|
||||
|
@ -121,6 +122,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
|||
void SetAudioMuted(bool muted);
|
||||
bool IsAudioMuted();
|
||||
void Print(mate::Arguments* args);
|
||||
std::vector<printing::PrinterBasicInfo> GetPrinterList();
|
||||
void SetEmbedder(const WebContents* embedder);
|
||||
|
||||
// Print current page as PDF.
|
||||
|
|
|
@ -10,40 +10,13 @@
|
|||
#include "base/message_loop/message_loop.h"
|
||||
#include "base/threading/thread_task_runner_handle.h"
|
||||
#include "content/public/common/content_switches.h"
|
||||
#include "gin/array_buffer.h"
|
||||
#include "gin/v8_initializer.h"
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#include "atom/node/osfhandle.h"
|
||||
#endif
|
||||
|
||||
#include "atom/common/node_includes.h"
|
||||
|
||||
namespace atom {
|
||||
|
||||
void* ArrayBufferAllocator::Allocate(size_t length) {
|
||||
#if defined(OS_WIN)
|
||||
return node::ArrayBufferCalloc(length);
|
||||
#else
|
||||
return calloc(1, length);
|
||||
#endif
|
||||
}
|
||||
|
||||
void* ArrayBufferAllocator::AllocateUninitialized(size_t length) {
|
||||
#if defined(OS_WIN)
|
||||
return node::ArrayBufferMalloc(length);
|
||||
#else
|
||||
return malloc(length);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ArrayBufferAllocator::Free(void* data, size_t length) {
|
||||
#if defined(OS_WIN)
|
||||
node::ArrayBufferFree(data, length);
|
||||
#else
|
||||
free(data);
|
||||
#endif
|
||||
}
|
||||
|
||||
JavascriptEnvironment::JavascriptEnvironment()
|
||||
: initialized_(Initialize()),
|
||||
isolate_holder_(base::ThreadTaskRunnerHandle::Get()),
|
||||
|
@ -73,7 +46,7 @@ bool JavascriptEnvironment::Initialize() {
|
|||
|
||||
gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode,
|
||||
gin::IsolateHolder::kStableV8Extras,
|
||||
&allocator_);
|
||||
gin::ArrayBufferAllocator::SharedInstance());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,14 +14,6 @@ class Environment;
|
|||
|
||||
namespace atom {
|
||||
|
||||
// ArrayBuffer's allocator, used on Chromium's side.
|
||||
class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
|
||||
public:
|
||||
void* Allocate(size_t length) override;
|
||||
void* AllocateUninitialized(size_t length) override;
|
||||
void Free(void* data, size_t length) override;
|
||||
};
|
||||
|
||||
// Manage the V8 isolate and context automatically.
|
||||
class JavascriptEnvironment {
|
||||
public:
|
||||
|
@ -39,7 +31,6 @@ class JavascriptEnvironment {
|
|||
bool Initialize();
|
||||
|
||||
bool initialized_;
|
||||
ArrayBufferAllocator allocator_;
|
||||
gin::IsolateHolder isolate_holder_;
|
||||
v8::Isolate* isolate_;
|
||||
v8::Isolate::Scope isolate_scope_;
|
||||
|
|
|
@ -9,14 +9,18 @@
|
|||
|
||||
#include "atom/browser/api/atom_api_session.h"
|
||||
#include "atom/browser/atom_browser_context.h"
|
||||
#include "base/guid.h"
|
||||
#include "base/memory/ptr_util.h"
|
||||
#include "base/strings/string_util.h"
|
||||
#include "brightray/browser/url_request_context_getter.h"
|
||||
#include "content/browser/streams/stream_context.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
#include "net/base/io_buffer.h"
|
||||
#include "net/base/net_errors.h"
|
||||
#include "net/http/http_response_headers.h"
|
||||
#include "net/url_request/url_fetcher.h"
|
||||
#include "net/url_request/url_fetcher_response_writer.h"
|
||||
#include "url/url_constants.h"
|
||||
|
||||
using content::BrowserThread;
|
||||
|
||||
|
@ -62,7 +66,8 @@ class ResponsePiper : public net::URLFetcherResponseWriter {
|
|||
job_->HeadersCompleted();
|
||||
first_write_ = false;
|
||||
}
|
||||
return job_->DataAvailable(buffer, num_bytes, callback);
|
||||
job_->stream()->AddData(buffer->data(), num_bytes);
|
||||
return num_bytes;
|
||||
}
|
||||
int Finish(int net_error, const net::CompletionCallback& callback) override {
|
||||
return net::OK;
|
||||
|
@ -77,12 +82,11 @@ class ResponsePiper : public net::URLFetcherResponseWriter {
|
|||
|
||||
} // namespace
|
||||
|
||||
URLRequestFetchJob::URLRequestFetchJob(
|
||||
net::URLRequest* request, net::NetworkDelegate* network_delegate)
|
||||
URLRequestFetchJob::URLRequestFetchJob(net::URLRequest* request,
|
||||
net::NetworkDelegate* network_delegate)
|
||||
: JsAsker<net::URLRequestJob>(request, network_delegate),
|
||||
pending_buffer_size_(0),
|
||||
write_num_bytes_(0) {
|
||||
}
|
||||
total_bytes_read_(0) {}
|
||||
|
||||
void URLRequestFetchJob::BeforeStartInUI(
|
||||
v8::Isolate* isolate, v8::Local<v8::Value> value) {
|
||||
|
@ -169,7 +173,22 @@ void URLRequestFetchJob::StartAsync(std::unique_ptr<base::Value> options) {
|
|||
fetcher_->SetExtraRequestHeaders(
|
||||
request()->extra_request_headers().ToString());
|
||||
|
||||
fetcher_->Start();
|
||||
// Create readable stream for URLFetcher response.
|
||||
content::StreamContext* stream_context =
|
||||
static_cast<brightray::URLRequestContextGetter*>(request_context_getter())
|
||||
->stream_context();
|
||||
|
||||
if (stream_context) {
|
||||
GURL stream_url(std::string(url::kBlobScheme) + ":" +
|
||||
formated_url.GetOrigin().spec() + base::GenerateGUID());
|
||||
stream_ =
|
||||
new content::Stream(stream_context->registry(), nullptr, stream_url);
|
||||
stream_->SetReadObserver(this);
|
||||
fetcher_->Start();
|
||||
} else {
|
||||
NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::CANCELED,
|
||||
net::ERR_ABORTED));
|
||||
}
|
||||
}
|
||||
|
||||
void URLRequestFetchJob::HeadersCompleted() {
|
||||
|
@ -178,53 +197,55 @@ void URLRequestFetchJob::HeadersCompleted() {
|
|||
NotifyHeadersComplete();
|
||||
}
|
||||
|
||||
int URLRequestFetchJob::DataAvailable(net::IOBuffer* buffer,
|
||||
int num_bytes,
|
||||
const net::CompletionCallback& callback) {
|
||||
// When pending_buffer_ is empty, there's no ReadRawData() operation waiting
|
||||
// for IO completion, we have to save the parameters until the request is
|
||||
// ready to read data.
|
||||
if (!pending_buffer_.get()) {
|
||||
write_buffer_ = buffer;
|
||||
write_num_bytes_ = num_bytes;
|
||||
write_callback_ = callback;
|
||||
return net::ERR_IO_PENDING;
|
||||
}
|
||||
|
||||
// Write data to the pending buffer and clear them after the writing.
|
||||
int bytes_read = BufferCopy(buffer, num_bytes,
|
||||
pending_buffer_.get(), pending_buffer_size_);
|
||||
ClearPendingBuffer();
|
||||
ReadRawDataComplete(bytes_read);
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
void URLRequestFetchJob::Kill() {
|
||||
JsAsker<URLRequestJob>::Kill();
|
||||
ClearStream();
|
||||
fetcher_.reset();
|
||||
}
|
||||
|
||||
void URLRequestFetchJob::OnDataAvailable(content::Stream* stream) {
|
||||
if (!pending_buffer_.get())
|
||||
return;
|
||||
|
||||
int result = 0;
|
||||
auto state = stream_->ReadRawData(pending_buffer_.get(), pending_buffer_size_,
|
||||
&result);
|
||||
if (state == content::Stream::STREAM_ABORTED)
|
||||
result = net::ERR_CONNECTION_RESET;
|
||||
|
||||
// Clear the buffers before notifying the read is complete, so that it is
|
||||
// safe for the observer to read.
|
||||
pending_buffer_ = nullptr;
|
||||
pending_buffer_size_ = 0;
|
||||
|
||||
if (result > 0)
|
||||
total_bytes_read_ += result;
|
||||
ReadRawDataComplete(result);
|
||||
}
|
||||
|
||||
int URLRequestFetchJob::ReadRawData(net::IOBuffer* dest, int dest_size) {
|
||||
if (GetResponseCode() == 204) {
|
||||
request()->set_received_response_content_length(prefilter_bytes_read());
|
||||
return net::OK;
|
||||
}
|
||||
|
||||
// When write_buffer_ is empty, there is no data valable yet, we have to save
|
||||
// the dest buffer util DataAvailable.
|
||||
if (!write_buffer_.get()) {
|
||||
pending_buffer_ = dest;
|
||||
pending_buffer_size_ = dest_size;
|
||||
return net::ERR_IO_PENDING;
|
||||
int bytes_read = 0;
|
||||
switch (stream_->ReadRawData(dest, dest_size, &bytes_read)) {
|
||||
case content::Stream::STREAM_HAS_DATA:
|
||||
total_bytes_read_ += bytes_read;
|
||||
return bytes_read;
|
||||
case content::Stream::STREAM_COMPLETE:
|
||||
return stream_->GetStatus();
|
||||
case content::Stream::STREAM_EMPTY:
|
||||
pending_buffer_ = dest;
|
||||
pending_buffer_size_ = dest_size;
|
||||
return net::ERR_IO_PENDING;
|
||||
case content::Stream::STREAM_ABORTED:
|
||||
// Handle this as connection reset.
|
||||
return net::ERR_CONNECTION_RESET;
|
||||
}
|
||||
|
||||
// Read from the write buffer and clear them after reading.
|
||||
int bytes_read = BufferCopy(write_buffer_.get(), write_num_bytes_,
|
||||
dest, dest_size);
|
||||
net::CompletionCallback write_callback = write_callback_;
|
||||
ClearWriteBuffer();
|
||||
write_callback.Run(bytes_read);
|
||||
return bytes_read;
|
||||
NOTREACHED();
|
||||
return net::ERR_FAILED;
|
||||
}
|
||||
|
||||
bool URLRequestFetchJob::GetMimeType(std::string* mime_type) const {
|
||||
|
@ -246,11 +267,18 @@ int URLRequestFetchJob::GetResponseCode() const {
|
|||
return response_info_->headers->response_code();
|
||||
}
|
||||
|
||||
void URLRequestFetchJob::OnURLFetchComplete(const net::URLFetcher* source) {
|
||||
ClearPendingBuffer();
|
||||
ClearWriteBuffer();
|
||||
int64_t URLRequestFetchJob::GetTotalReceivedBytes() const {
|
||||
int64_t total_received_bytes = 0;
|
||||
if (response_info_)
|
||||
total_received_bytes = response_info_->headers->raw_headers().size();
|
||||
if (stream_.get())
|
||||
total_received_bytes += total_bytes_read_;
|
||||
return total_received_bytes;
|
||||
}
|
||||
|
||||
if (fetcher_->GetStatus().is_success()) {
|
||||
void URLRequestFetchJob::OnURLFetchComplete(const net::URLFetcher* source) {
|
||||
auto status = fetcher_->GetStatus();
|
||||
if (status.is_success()) {
|
||||
if (!response_info_) {
|
||||
// Since we notify header completion only after first write there will be
|
||||
// no response object constructed for http respones with no content 204.
|
||||
|
@ -258,28 +286,16 @@ void URLRequestFetchJob::OnURLFetchComplete(const net::URLFetcher* source) {
|
|||
HeadersCompleted();
|
||||
return;
|
||||
}
|
||||
ReadRawDataComplete(0);
|
||||
stream_->Finalize(0);
|
||||
} else {
|
||||
NotifyStartError(fetcher_->GetStatus());
|
||||
stream_->Finalize(status.error());
|
||||
NotifyStartError(status);
|
||||
}
|
||||
}
|
||||
|
||||
int URLRequestFetchJob::BufferCopy(net::IOBuffer* source, int num_bytes,
|
||||
net::IOBuffer* target, int target_size) {
|
||||
int bytes_written = std::min(num_bytes, target_size);
|
||||
memcpy(target->data(), source->data(), bytes_written);
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
void URLRequestFetchJob::ClearPendingBuffer() {
|
||||
pending_buffer_ = nullptr;
|
||||
pending_buffer_size_ = 0;
|
||||
}
|
||||
|
||||
void URLRequestFetchJob::ClearWriteBuffer() {
|
||||
write_buffer_ = nullptr;
|
||||
write_num_bytes_ = 0;
|
||||
write_callback_.Reset();
|
||||
void URLRequestFetchJob::ClearStream() {
|
||||
stream_->RemoveReadObserver(this);
|
||||
stream_ = nullptr;
|
||||
}
|
||||
|
||||
} // namespace atom
|
||||
|
|
|
@ -8,22 +8,24 @@
|
|||
#include <string>
|
||||
|
||||
#include "atom/browser/net/js_asker.h"
|
||||
#include "browser/url_request_context_getter.h"
|
||||
#include "brightray/browser/url_request_context_getter.h"
|
||||
#include "content/browser/streams/stream.h"
|
||||
#include "content/browser/streams/stream_read_observer.h"
|
||||
#include "net/url_request/url_fetcher_delegate.h"
|
||||
|
||||
namespace atom {
|
||||
|
||||
class URLRequestFetchJob : public JsAsker<net::URLRequestJob>,
|
||||
public net::URLFetcherDelegate,
|
||||
public brightray::URLRequestContextGetter::Delegate {
|
||||
public brightray::URLRequestContextGetter::Delegate,
|
||||
public content::StreamReadObserver {
|
||||
public:
|
||||
URLRequestFetchJob(net::URLRequest*, net::NetworkDelegate*);
|
||||
|
||||
// Called by response writer.
|
||||
void HeadersCompleted();
|
||||
int DataAvailable(net::IOBuffer* buffer,
|
||||
int num_bytes,
|
||||
const net::CompletionCallback& callback);
|
||||
|
||||
content::Stream* stream() const { return stream_.get(); }
|
||||
|
||||
protected:
|
||||
// JsAsker:
|
||||
|
@ -36,28 +38,26 @@ class URLRequestFetchJob : public JsAsker<net::URLRequestJob>,
|
|||
bool GetMimeType(std::string* mime_type) const override;
|
||||
void GetResponseInfo(net::HttpResponseInfo* info) override;
|
||||
int GetResponseCode() const override;
|
||||
int64_t GetTotalReceivedBytes() const override;
|
||||
|
||||
// net::URLFetcherDelegate:
|
||||
void OnURLFetchComplete(const net::URLFetcher* source) override;
|
||||
|
||||
// content::StreamReadObserver:
|
||||
void OnDataAvailable(content::Stream* stream) override;
|
||||
|
||||
private:
|
||||
int BufferCopy(net::IOBuffer* source, int num_bytes,
|
||||
net::IOBuffer* target, int target_size);
|
||||
void ClearPendingBuffer();
|
||||
void ClearWriteBuffer();
|
||||
void ClearStream();
|
||||
|
||||
scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
|
||||
std::unique_ptr<net::URLFetcher> fetcher_;
|
||||
std::unique_ptr<net::HttpResponseInfo> response_info_;
|
||||
scoped_refptr<content::Stream> stream_;
|
||||
|
||||
// Saved arguments passed to ReadRawData.
|
||||
scoped_refptr<net::IOBuffer> pending_buffer_;
|
||||
int pending_buffer_size_;
|
||||
|
||||
// Saved arguments passed to DataAvailable.
|
||||
scoped_refptr<net::IOBuffer> write_buffer_;
|
||||
int write_num_bytes_;
|
||||
net::CompletionCallback write_callback_;
|
||||
int total_bytes_read_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(URLRequestFetchJob);
|
||||
};
|
||||
|
|
|
@ -126,6 +126,10 @@ bool MoveItemToTrash(const base::FilePath& full_path) {
|
|||
} else if (trash.compare("trash-cli") == 0) {
|
||||
argv.push_back("trash-put");
|
||||
argv.push_back(full_path.value());
|
||||
} else if (trash.compare("gio") == 0) {
|
||||
argv.push_back("gio");
|
||||
argv.push_back("trash");
|
||||
argv.push_back(full_path.value());
|
||||
} else {
|
||||
argv.push_back(ELECTRON_DEFAULT_TRASH);
|
||||
argv.push_back(full_path.value());
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include "third_party/icu/source/i18n/unicode/uregex.h"
|
||||
#include "third_party/icu/source/i18n/unicode/uspoof.h"
|
||||
#include "third_party/icu/source/i18n/unicode/usearch.h"
|
||||
#include "util-inl.h"
|
||||
#include "v8-profiler.h"
|
||||
#include "v8-inspector.h"
|
||||
|
||||
|
@ -41,18 +40,6 @@ int close(int fd) {
|
|||
return _close(fd);
|
||||
}
|
||||
|
||||
void* ArrayBufferCalloc(size_t length) {
|
||||
return UncheckedCalloc(length);
|
||||
}
|
||||
|
||||
void* ArrayBufferMalloc(size_t length) {
|
||||
return UncheckedMalloc(length);
|
||||
}
|
||||
|
||||
void ArrayBufferFree(void* data, size_t length) {
|
||||
return ::free(data);
|
||||
}
|
||||
|
||||
void ReferenceSymbols() {
|
||||
// Following symbols are used by electron.exe but got stripped by compiler,
|
||||
// by using the symbols we can force compiler to keep the objects in node.dll,
|
||||
|
|
|
@ -21,12 +21,6 @@ namespace node {
|
|||
__declspec(dllexport) int open_osfhandle(intptr_t osfhandle, int flags);
|
||||
__declspec(dllexport) int close(int fd);
|
||||
|
||||
// Memory allocation functions from Node's module, used by ArrayBuffer allocator
|
||||
// to make sure memories are allocated and freed with the same allocator.
|
||||
__declspec(dllexport) void* ArrayBufferCalloc(size_t length);
|
||||
__declspec(dllexport) void* ArrayBufferMalloc(size_t length);
|
||||
__declspec(dllexport) void ArrayBufferFree(void* data, size_t length);
|
||||
|
||||
// A trick to force referencing symbols.
|
||||
__declspec(dllexport) void ReferenceSymbols();
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include "atom/renderer/api/atom_api_renderer_ipc.h"
|
||||
#include "atom/renderer/atom_render_frame_observer.h"
|
||||
#include "atom/renderer/atom_render_view_observer.h"
|
||||
#include "atom/renderer/node_array_buffer_bridge.h"
|
||||
#include "atom/renderer/web_worker_observer.h"
|
||||
#include "base/command_line.h"
|
||||
#include "content/public/renderer/render_frame.h"
|
||||
|
@ -51,7 +50,6 @@ AtomRendererClient::~AtomRendererClient() {
|
|||
}
|
||||
|
||||
void AtomRendererClient::RenderThreadStarted() {
|
||||
OverrideNodeArrayBuffer();
|
||||
RendererClientBase::RenderThreadStarted();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,66 +0,0 @@
|
|||
// Copyright (c) 2015 GitHub, Inc.
|
||||
// Use of this source code is governed by the MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "atom/renderer/node_array_buffer_bridge.h"
|
||||
|
||||
#include "atom/common/node_includes.h"
|
||||
#include "base/macros.h"
|
||||
#include "native_mate/converter.h"
|
||||
#include "third_party/WebKit/public/web/WebArrayBuffer.h"
|
||||
#include "third_party/WebKit/public/web/WebArrayBufferConverter.h"
|
||||
|
||||
namespace atom {
|
||||
|
||||
namespace {
|
||||
|
||||
// global.Uint8Array;
|
||||
v8::Local<v8::Function> GetUint8ArrayConstructor(
|
||||
v8::Isolate* isolate, v8::Local<v8::Context> context) {
|
||||
v8::Local<v8::Value> constructor = context->Global()->Get(
|
||||
mate::StringToV8(isolate, "Uint8Array"));
|
||||
return v8::Local<v8::Function>::Cast(constructor);
|
||||
}
|
||||
|
||||
// new ArrayBuffer(size);
|
||||
v8::Local<v8::ArrayBuffer> BlinkArrayBufferNew(
|
||||
v8::Isolate* isolate, size_t size) {
|
||||
blink::WebArrayBuffer buffer = blink::WebArrayBuffer::create(size, 1);
|
||||
return v8::Local<v8::ArrayBuffer>::Cast(
|
||||
blink::WebArrayBufferConverter::toV8Value(
|
||||
&buffer, isolate->GetCurrentContext()->Global(), isolate));
|
||||
}
|
||||
|
||||
// new ArrayBuffer(data, size);
|
||||
v8::Local<v8::ArrayBuffer> BlinkArrayBufferNewWith(
|
||||
v8::Isolate* isolate, void* data, size_t size) {
|
||||
blink::WebArrayBuffer buffer = blink::WebArrayBuffer::createExternal(
|
||||
data, size);
|
||||
return v8::Local<v8::ArrayBuffer>::Cast(
|
||||
blink::WebArrayBufferConverter::toV8Value(
|
||||
&buffer, isolate->GetCurrentContext()->Global(), isolate));
|
||||
}
|
||||
|
||||
// new Uint8Array(array_buffer, offset, size);
|
||||
v8::Local<v8::Uint8Array> BlinkUint8ArrayNew(
|
||||
v8::Local<v8::ArrayBuffer> ab, size_t offset, size_t size) {
|
||||
// Use the DOM's Uint8Array constructor to create Uint8Array.
|
||||
v8::Local<v8::Context> context = ab->CreationContext();
|
||||
v8::Isolate* isolate = context->GetIsolate();
|
||||
v8::Local<v8::Function> constructor =
|
||||
GetUint8ArrayConstructor(isolate, context);
|
||||
v8::Local<v8::Value> args[] = {
|
||||
ab, mate::ConvertToV8(isolate, offset), mate::ConvertToV8(isolate, size)
|
||||
};
|
||||
return v8::Local<v8::Uint8Array>::Cast(constructor->NewInstance(
|
||||
context, node::arraysize(args), args).ToLocalChecked());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void OverrideNodeArrayBuffer() {
|
||||
node::Buffer::SetArrayBufferCreator(
|
||||
BlinkArrayBufferNew, BlinkArrayBufferNewWith, BlinkUint8ArrayNew);
|
||||
}
|
||||
|
||||
} // namespace atom
|
|
@ -1,15 +0,0 @@
|
|||
// Copyright (c) 2015 GitHub, Inc.
|
||||
// Use of this source code is governed by the MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef ATOM_RENDERER_NODE_ARRAY_BUFFER_BRIDGE_H_
|
||||
#define ATOM_RENDERER_NODE_ARRAY_BUFFER_BRIDGE_H_
|
||||
|
||||
namespace atom {
|
||||
|
||||
// Override Node's ArrayBuffer with DOM's ArrayBuffer.
|
||||
void OverrideNodeArrayBuffer();
|
||||
|
||||
} // namespace atom
|
||||
|
||||
#endif // ATOM_RENDERER_NODE_ARRAY_BUFFER_BRIDGE_H_
|
Loading…
Add table
Add a link
Reference in a new issue