Merge remote-tracking branch 'refs/remotes/atom/master'
This commit is contained in:
commit
456154a6a2
20 changed files with 1151 additions and 38 deletions
|
@ -62,21 +62,6 @@ struct Converter<Browser::UserTask> {
|
|||
};
|
||||
#endif
|
||||
|
||||
template<>
|
||||
struct Converter<scoped_refptr<net::X509Certificate>> {
|
||||
static v8::Local<v8::Value> ToV8(
|
||||
v8::Isolate* isolate,
|
||||
const scoped_refptr<net::X509Certificate>& val) {
|
||||
mate::Dictionary dict(isolate, v8::Object::New(isolate));
|
||||
std::string encoded_data;
|
||||
net::X509Certificate::GetPEMEncoded(
|
||||
val->os_cert_handle(), &encoded_data);
|
||||
dict.Set("data", encoded_data);
|
||||
dict.Set("issuerName", val->issuer().GetDisplayName());
|
||||
return dict.GetHandle();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace mate
|
||||
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "atom/common/native_mate_converters/callback.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/net_converter.h"
|
||||
#include "atom/common/node_includes.h"
|
||||
#include "base/files/file_path.h"
|
||||
#include "base/prefs/pref_service.h"
|
||||
|
@ -237,11 +238,21 @@ void SetProxyInIO(net::URLRequestContextGetter* getter,
|
|||
RunCallbackInUI(callback);
|
||||
}
|
||||
|
||||
void PassVerificationResult(
|
||||
scoped_refptr<AtomCertVerifier::CertVerifyRequest> request,
|
||||
bool success) {
|
||||
int result = net::OK;
|
||||
if (!success)
|
||||
result = net::ERR_FAILED;
|
||||
request->ContinueWithResult(result);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Session::Session(AtomBrowserContext* browser_context)
|
||||
: browser_context_(browser_context) {
|
||||
AttachAsUserData(browser_context);
|
||||
browser_context->cert_verifier()->SetDelegate(this);
|
||||
|
||||
// Observe DownloadManger to get download notifications.
|
||||
content::BrowserContext::GetDownloadManager(browser_context)->
|
||||
|
@ -254,6 +265,18 @@ Session::~Session() {
|
|||
Destroy();
|
||||
}
|
||||
|
||||
void Session::RequestCertVerification(
|
||||
const scoped_refptr<AtomCertVerifier::CertVerifyRequest>& request) {
|
||||
bool prevent_default = Emit(
|
||||
"verify-certificate",
|
||||
request->hostname(),
|
||||
request->certificate(),
|
||||
base::Bind(&PassVerificationResult, request));
|
||||
|
||||
if (!prevent_default)
|
||||
request->ContinueWithResult(net::ERR_IO_PENDING);
|
||||
}
|
||||
|
||||
void Session::OnDownloadCreated(content::DownloadManager* manager,
|
||||
content::DownloadItem* item) {
|
||||
auto web_contents = item->GetWebContents();
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <string>
|
||||
|
||||
#include "atom/browser/api/trackable_object.h"
|
||||
#include "atom/browser/atom_cert_verifier.h"
|
||||
#include "content/public/browser/download_manager.h"
|
||||
#include "native_mate/handle.h"
|
||||
#include "net/base/completion_callback.h"
|
||||
|
@ -34,6 +35,7 @@ class AtomBrowserContext;
|
|||
namespace api {
|
||||
|
||||
class Session: public mate::TrackableObject<Session>,
|
||||
public AtomCertVerifier::Delegate,
|
||||
public content::DownloadManager::Observer {
|
||||
public:
|
||||
using ResolveProxyCallback = base::Callback<void(std::string)>;
|
||||
|
@ -52,6 +54,10 @@ class Session: public mate::TrackableObject<Session>,
|
|||
explicit Session(AtomBrowserContext* browser_context);
|
||||
~Session();
|
||||
|
||||
// AtomCertVerifier::Delegate:
|
||||
void RequestCertVerification(
|
||||
const scoped_refptr<AtomCertVerifier::CertVerifyRequest>&) override;
|
||||
|
||||
// content::DownloadManager::Observer:
|
||||
void OnDownloadCreated(content::DownloadManager* manager,
|
||||
content::DownloadItem* item) override;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "atom/browser/atom_browser_context.h"
|
||||
|
||||
#include "atom/browser/atom_browser_main_parts.h"
|
||||
#include "atom/browser/atom_cert_verifier.h"
|
||||
#include "atom/browser/atom_download_manager_delegate.h"
|
||||
#include "atom/browser/atom_ssl_config_service.h"
|
||||
#include "atom/browser/browser.h"
|
||||
|
@ -60,6 +61,7 @@ std::string RemoveWhitespace(const std::string& str) {
|
|||
AtomBrowserContext::AtomBrowserContext(const std::string& partition,
|
||||
bool in_memory)
|
||||
: brightray::BrowserContext(partition, in_memory),
|
||||
cert_verifier_(new AtomCertVerifier),
|
||||
job_factory_(new AtomURLRequestJobFactory),
|
||||
allow_ntlm_everywhere_(false) {
|
||||
}
|
||||
|
@ -158,6 +160,10 @@ content::BrowserPluginGuestManager* AtomBrowserContext::GetGuestManager() {
|
|||
return guest_manager_.get();
|
||||
}
|
||||
|
||||
net::CertVerifier* AtomBrowserContext::CreateCertVerifier() {
|
||||
return cert_verifier_;
|
||||
}
|
||||
|
||||
net::SSLConfigService* AtomBrowserContext::CreateSSLConfigService() {
|
||||
return new AtomSSLConfigService;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
namespace atom {
|
||||
|
||||
class AtomDownloadManagerDelegate;
|
||||
class AtomCertVerifier;
|
||||
class AtomURLRequestJobFactory;
|
||||
class WebViewManager;
|
||||
|
||||
|
@ -27,6 +28,7 @@ class AtomBrowserContext : public brightray::BrowserContext {
|
|||
content::URLRequestInterceptorScopedVector* interceptors) override;
|
||||
net::HttpCache::BackendFactory* CreateHttpCacheBackendFactory(
|
||||
const base::FilePath& base_path) override;
|
||||
net::CertVerifier* CreateCertVerifier() override;
|
||||
net::SSLConfigService* CreateSSLConfigService() override;
|
||||
bool AllowNTLMCredentialsForDomain(const GURL& auth_origin) override;
|
||||
|
||||
|
@ -39,6 +41,8 @@ class AtomBrowserContext : public brightray::BrowserContext {
|
|||
|
||||
void AllowNTLMCredentialsForAllDomains(bool should_allow);
|
||||
|
||||
AtomCertVerifier* cert_verifier() const { return cert_verifier_; }
|
||||
|
||||
AtomURLRequestJobFactory* job_factory() const { return job_factory_; }
|
||||
|
||||
private:
|
||||
|
@ -46,6 +50,7 @@ class AtomBrowserContext : public brightray::BrowserContext {
|
|||
scoped_ptr<WebViewManager> guest_manager_;
|
||||
|
||||
// Managed by brightray::BrowserContext.
|
||||
AtomCertVerifier* cert_verifier_;
|
||||
AtomURLRequestJobFactory* job_factory_;
|
||||
|
||||
bool allow_ntlm_everywhere_;
|
||||
|
|
176
atom/browser/atom_cert_verifier.cc
Normal file
176
atom/browser/atom_cert_verifier.cc
Normal file
|
@ -0,0 +1,176 @@
|
|||
// 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/browser/atom_cert_verifier.h"
|
||||
|
||||
#include "atom/browser/browser.h"
|
||||
#include "atom/common/native_mate_converters/net_converter.h"
|
||||
#include "base/sha1.h"
|
||||
#include "base/stl_util.h"
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "net/base/net_errors.h"
|
||||
|
||||
using content::BrowserThread;
|
||||
|
||||
namespace atom {
|
||||
|
||||
AtomCertVerifier::RequestParams::RequestParams(
|
||||
const net::SHA1HashValue cert_fingerprint,
|
||||
const net::SHA1HashValue ca_fingerprint,
|
||||
const std::string& hostname_arg,
|
||||
const std::string& ocsp_response_arg,
|
||||
int flags_arg)
|
||||
: hostname(hostname_arg),
|
||||
ocsp_response(ocsp_response_arg),
|
||||
flags(flags_arg) {
|
||||
hash_values.reserve(3);
|
||||
net::SHA1HashValue ocsp_hash;
|
||||
base::SHA1HashBytes(
|
||||
reinterpret_cast<const unsigned char*>(ocsp_response.data()),
|
||||
ocsp_response.size(), ocsp_hash.data);
|
||||
hash_values.push_back(ocsp_hash);
|
||||
hash_values.push_back(cert_fingerprint);
|
||||
hash_values.push_back(ca_fingerprint);
|
||||
}
|
||||
|
||||
bool AtomCertVerifier::RequestParams::operator<(
|
||||
const RequestParams& other) const {
|
||||
if (flags != other.flags)
|
||||
return flags < other.flags;
|
||||
if (hostname != other.hostname)
|
||||
return hostname < other.hostname;
|
||||
return std::lexicographical_compare(
|
||||
hash_values.begin(),
|
||||
hash_values.end(),
|
||||
other.hash_values.begin(),
|
||||
other.hash_values.end(),
|
||||
net::SHA1HashValueLessThan());
|
||||
}
|
||||
|
||||
void AtomCertVerifier::CertVerifyRequest::RunResult(int result) {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
||||
|
||||
for (auto& callback : callbacks_)
|
||||
callback.Run(result);
|
||||
cert_verifier_->RemoveRequest(this);
|
||||
}
|
||||
|
||||
void AtomCertVerifier::CertVerifyRequest::DelegateToDefaultVerifier() {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
||||
|
||||
int rv = cert_verifier_->default_cert_verifier()->Verify(
|
||||
certificate_.get(),
|
||||
key_.hostname,
|
||||
key_.ocsp_response,
|
||||
key_.flags,
|
||||
crl_set_.get(),
|
||||
verify_result_,
|
||||
base::Bind(&CertVerifyRequest::RunResult,
|
||||
weak_ptr_factory_.GetWeakPtr()),
|
||||
out_req_,
|
||||
net_log_);
|
||||
|
||||
if (rv != net::ERR_IO_PENDING)
|
||||
RunResult(rv);
|
||||
}
|
||||
|
||||
void AtomCertVerifier::CertVerifyRequest::ContinueWithResult(int result) {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
|
||||
if (handled_)
|
||||
return;
|
||||
|
||||
handled_ = true;
|
||||
|
||||
if (result != net::ERR_IO_PENDING) {
|
||||
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
||||
base::Bind(&CertVerifyRequest::RunResult,
|
||||
weak_ptr_factory_.GetWeakPtr(),
|
||||
result));
|
||||
return;
|
||||
}
|
||||
|
||||
BrowserThread::PostTask(
|
||||
BrowserThread::IO, FROM_HERE,
|
||||
base::Bind(&CertVerifyRequest::DelegateToDefaultVerifier,
|
||||
weak_ptr_factory_.GetWeakPtr()));
|
||||
}
|
||||
|
||||
AtomCertVerifier::AtomCertVerifier()
|
||||
: delegate_(nullptr) {
|
||||
default_cert_verifier_.reset(net::CertVerifier::CreateDefault());
|
||||
}
|
||||
|
||||
AtomCertVerifier::~AtomCertVerifier() {
|
||||
}
|
||||
|
||||
int AtomCertVerifier::Verify(
|
||||
net::X509Certificate* cert,
|
||||
const std::string& hostname,
|
||||
const std::string& ocsp_response,
|
||||
int flags,
|
||||
net::CRLSet* crl_set,
|
||||
net::CertVerifyResult* verify_result,
|
||||
const net::CompletionCallback& callback,
|
||||
scoped_ptr<Request>* out_req,
|
||||
const net::BoundNetLog& net_log) {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
||||
|
||||
if (callback.is_null() || !verify_result || hostname.empty() || !delegate_)
|
||||
return net::ERR_INVALID_ARGUMENT;
|
||||
|
||||
const RequestParams key(cert->fingerprint(),
|
||||
cert->ca_fingerprint(),
|
||||
hostname,
|
||||
ocsp_response,
|
||||
flags);
|
||||
|
||||
CertVerifyRequest* request = FindRequest(key);
|
||||
|
||||
if (!request) {
|
||||
request = new CertVerifyRequest(this,
|
||||
key,
|
||||
cert,
|
||||
crl_set,
|
||||
verify_result,
|
||||
out_req,
|
||||
net_log);
|
||||
requests_.insert(make_scoped_refptr(request));
|
||||
|
||||
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
||||
base::Bind(&Delegate::RequestCertVerification,
|
||||
base::Unretained(delegate_),
|
||||
make_scoped_refptr(request)));
|
||||
}
|
||||
|
||||
request->AddCompletionCallback(callback);
|
||||
|
||||
return net::ERR_IO_PENDING;
|
||||
}
|
||||
|
||||
bool AtomCertVerifier::SupportsOCSPStapling() {
|
||||
return true;
|
||||
}
|
||||
|
||||
AtomCertVerifier::CertVerifyRequest* AtomCertVerifier::FindRequest(
|
||||
const RequestParams& key) {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
||||
|
||||
auto it = std::lower_bound(requests_.begin(),
|
||||
requests_.end(),
|
||||
key,
|
||||
CertVerifyRequestToRequestParamsComparator());
|
||||
if (it != requests_.end() && !(key < (*it)->key()))
|
||||
return (*it).get();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void AtomCertVerifier::RemoveRequest(CertVerifyRequest* request) {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
||||
|
||||
bool erased = requests_.erase(request) == 1;
|
||||
DCHECK(erased);
|
||||
}
|
||||
|
||||
} // namespace atom
|
165
atom/browser/atom_cert_verifier.h
Normal file
165
atom/browser/atom_cert_verifier.h
Normal file
|
@ -0,0 +1,165 @@
|
|||
// 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_BROWSER_ATOM_CERT_VERIFIER_H_
|
||||
#define ATOM_BROWSER_ATOM_CERT_VERIFIER_H_
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "base/memory/ref_counted.h"
|
||||
#include "net/base/hash_value.h"
|
||||
#include "net/cert/cert_verifier.h"
|
||||
#include "net/cert/crl_set.h"
|
||||
#include "net/cert/x509_certificate.h"
|
||||
#include "net/log/net_log.h"
|
||||
|
||||
namespace atom {
|
||||
|
||||
class AtomCertVerifier : public net::CertVerifier {
|
||||
public:
|
||||
struct RequestParams {
|
||||
RequestParams(
|
||||
const net::SHA1HashValue cert_fingerprint,
|
||||
const net::SHA1HashValue ca_fingerprint,
|
||||
const std::string& hostname_arg,
|
||||
const std::string& ocsp_response,
|
||||
int flags);
|
||||
~RequestParams() {}
|
||||
|
||||
bool operator<(const RequestParams& other) const;
|
||||
|
||||
std::string hostname;
|
||||
std::string ocsp_response;
|
||||
int flags;
|
||||
std::vector<net::SHA1HashValue> hash_values;
|
||||
};
|
||||
|
||||
class CertVerifyRequest
|
||||
: public base::RefCountedThreadSafe<CertVerifyRequest> {
|
||||
public:
|
||||
CertVerifyRequest(
|
||||
AtomCertVerifier* cert_verifier,
|
||||
const RequestParams& key,
|
||||
scoped_refptr<net::X509Certificate> cert,
|
||||
scoped_refptr<net::CRLSet> crl_set,
|
||||
net::CertVerifyResult* verify_result,
|
||||
scoped_ptr<Request>* out_req,
|
||||
const net::BoundNetLog& net_log)
|
||||
: cert_verifier_(cert_verifier),
|
||||
key_(key),
|
||||
certificate_(cert),
|
||||
crl_set_(crl_set),
|
||||
verify_result_(verify_result),
|
||||
out_req_(out_req),
|
||||
net_log_(net_log),
|
||||
handled_(false),
|
||||
weak_ptr_factory_(this) {
|
||||
}
|
||||
|
||||
void RunResult(int result);
|
||||
void DelegateToDefaultVerifier();
|
||||
void ContinueWithResult(int result);
|
||||
|
||||
void AddCompletionCallback(net::CompletionCallback callback) {
|
||||
callbacks_.push_back(callback);
|
||||
}
|
||||
|
||||
const RequestParams key() const { return key_; }
|
||||
|
||||
std::string hostname() const { return key_.hostname; }
|
||||
|
||||
scoped_refptr<net::X509Certificate> certificate() const {
|
||||
return certificate_;
|
||||
}
|
||||
|
||||
private:
|
||||
friend class base::RefCountedThreadSafe<CertVerifyRequest>;
|
||||
~CertVerifyRequest() {}
|
||||
|
||||
AtomCertVerifier* cert_verifier_;
|
||||
const RequestParams key_;
|
||||
|
||||
scoped_refptr<net::X509Certificate> certificate_;
|
||||
scoped_refptr<net::CRLSet> crl_set_;
|
||||
net::CertVerifyResult* verify_result_;
|
||||
scoped_ptr<Request>* out_req_;
|
||||
const net::BoundNetLog net_log_;
|
||||
|
||||
std::vector<net::CompletionCallback> callbacks_;
|
||||
bool handled_;
|
||||
|
||||
base::WeakPtrFactory<CertVerifyRequest> weak_ptr_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CertVerifyRequest);
|
||||
};
|
||||
|
||||
class Delegate {
|
||||
public:
|
||||
Delegate() {}
|
||||
virtual ~Delegate() {}
|
||||
|
||||
// Called on UI thread.
|
||||
virtual void RequestCertVerification(
|
||||
const scoped_refptr<CertVerifyRequest>& request) {}
|
||||
};
|
||||
|
||||
AtomCertVerifier();
|
||||
virtual ~AtomCertVerifier();
|
||||
|
||||
void SetDelegate(Delegate* delegate) {
|
||||
delegate_ = delegate;
|
||||
}
|
||||
|
||||
protected:
|
||||
// net::CertVerifier:
|
||||
int Verify(net::X509Certificate* cert,
|
||||
const std::string& hostname,
|
||||
const std::string& ocsp_response,
|
||||
int flags,
|
||||
net::CRLSet* crl_set,
|
||||
net::CertVerifyResult* verify_result,
|
||||
const net::CompletionCallback& callback,
|
||||
scoped_ptr<Request>* out_req,
|
||||
const net::BoundNetLog& net_log) override;
|
||||
bool SupportsOCSPStapling() override;
|
||||
|
||||
net::CertVerifier* default_cert_verifier() const {
|
||||
return default_cert_verifier_.get();
|
||||
}
|
||||
|
||||
private:
|
||||
CertVerifyRequest* FindRequest(const RequestParams& key);
|
||||
void RemoveRequest(CertVerifyRequest* request);
|
||||
|
||||
struct CertVerifyRequestToRequestParamsComparator {
|
||||
bool operator()(const scoped_refptr<CertVerifyRequest> request,
|
||||
const RequestParams& key) const {
|
||||
return request->key() < key;
|
||||
}
|
||||
};
|
||||
|
||||
struct CertVerifyRequestComparator {
|
||||
bool operator()(const scoped_refptr<CertVerifyRequest> req1,
|
||||
const scoped_refptr<CertVerifyRequest> req2) const {
|
||||
return req1->key() < req2->key();
|
||||
}
|
||||
};
|
||||
|
||||
using ActiveRequestSet =
|
||||
std::set<scoped_refptr<CertVerifyRequest>,
|
||||
CertVerifyRequestComparator>;
|
||||
ActiveRequestSet requests_;
|
||||
|
||||
Delegate* delegate_;
|
||||
|
||||
scoped_ptr<net::CertVerifier> default_cert_verifier_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(AtomCertVerifier);
|
||||
};
|
||||
|
||||
} // namespace atom
|
||||
|
||||
#endif // ATOM_BROWSER_ATOM_CERT_VERIFIER_H_
|
|
@ -4,7 +4,11 @@
|
|||
|
||||
#include "atom/common/native_mate_converters/net_converter.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "atom/common/node_includes.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
#include "net/cert/x509_certificate.h"
|
||||
#include "net/url_request/url_request.h"
|
||||
|
||||
namespace mate {
|
||||
|
@ -31,4 +35,19 @@ v8::Local<v8::Value> Converter<const net::AuthChallengeInfo*>::ToV8(
|
|||
return mate::ConvertToV8(isolate, dict);
|
||||
}
|
||||
|
||||
// static
|
||||
v8::Local<v8::Value> Converter<scoped_refptr<net::X509Certificate>>::ToV8(
|
||||
v8::Isolate* isolate, const scoped_refptr<net::X509Certificate>& val) {
|
||||
mate::Dictionary dict(isolate, v8::Object::New(isolate));
|
||||
std::string encoded_data;
|
||||
net::X509Certificate::GetPEMEncoded(
|
||||
val->os_cert_handle(), &encoded_data);
|
||||
auto buffer = node::Buffer::Copy(isolate,
|
||||
encoded_data.data(),
|
||||
encoded_data.size()).ToLocalChecked();
|
||||
dict.Set("data", buffer);
|
||||
dict.Set("issuerName", val->issuer().GetDisplayName());
|
||||
return dict.GetHandle();
|
||||
}
|
||||
|
||||
} // namespace mate
|
||||
|
|
|
@ -5,11 +5,13 @@
|
|||
#ifndef ATOM_COMMON_NATIVE_MATE_CONVERTERS_NET_CONVERTER_H_
|
||||
#define ATOM_COMMON_NATIVE_MATE_CONVERTERS_NET_CONVERTER_H_
|
||||
|
||||
#include "base/memory/ref_counted.h"
|
||||
#include "native_mate/converter.h"
|
||||
|
||||
namespace net {
|
||||
class AuthChallengeInfo;
|
||||
class URLRequest;
|
||||
class X509Certificate;
|
||||
}
|
||||
|
||||
namespace mate {
|
||||
|
@ -26,6 +28,12 @@ struct Converter<const net::AuthChallengeInfo*> {
|
|||
const net::AuthChallengeInfo* val);
|
||||
};
|
||||
|
||||
template<>
|
||||
struct Converter<scoped_refptr<net::X509Certificate>> {
|
||||
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
|
||||
const scoped_refptr<net::X509Certificate>& val);
|
||||
};
|
||||
|
||||
} // namespace mate
|
||||
|
||||
#endif // ATOM_COMMON_NATIVE_MATE_CONVERTERS_NET_CONVERTER_H_
|
||||
|
|
|
@ -22,7 +22,7 @@ Con el fin de evitar la complejidad de la construcción de todo Chromium, Electr
|
|||
|
||||
In NW.js, the Node integration in web pages requires patching Chromium to work, while in Electron we chose a different way to integrate the libuv loop with each platform's message loop to avoid hacking Chromium. See the node_bindings code for how that was done.
|
||||
|
||||
En NW.js, la integración de Node en las páginas web requiere parchear Chromium para que funcione, mientras que en Electron elegimos una manera diferente para integrar el cilco libuv con cada ciclo de mensaje de las plataformas para evitar el hacking en Chromium. Ver el código `node_bindings` de cómo se hizo.
|
||||
En NW.js, la integración de Node en las páginas web requiere parchear Chromium para que funcione, mientras que en Electron elegimos una manera diferente para integrar el cilco libuv con cada ciclo de mensaje de las plataformas para evitar el hacking en Chromium. Ver el código [`node_bindings`][node-bindings] de cómo se hizo.
|
||||
|
||||
|
||||
**4. Multi-contexto**
|
||||
|
@ -31,4 +31,4 @@ Si usted es un usuario experimentado NW.js, usted debe estar familiarizado con e
|
|||
|
||||
Mediante el uso de la característica [multi-contexto](http://strongloop.com/strongblog/whats-new-node-js-v0-12-multiple-context-execution/) de Node, Electron no introduce un nuevo contexto JavaScript en páginas web.Resultados de búsqueda
|
||||
|
||||
|
||||
[node-bindings]: https://github.com/atom/electron/tree/master/atom/common
|
||||
|
|
|
@ -25,11 +25,10 @@
|
|||
* `id` String - 현재 메뉴 아이템에 대해 유일키를 지정합니다. 이 키는 이후 `position` 옵션에서 사용할 수 있습니다.
|
||||
* `position` String - 미리 지정한 `id`를 이용하여 메뉴 아이템의 위치를 세밀하게 조정합니다.
|
||||
|
||||
When creating menu items, it is recommended to specify `role` instead of
|
||||
manually implementing the behavior if there is matching action, so menu can have
|
||||
best native experience.
|
||||
메뉴 아이템을 생성할 때, 매칭되는 액션이 있다면 수동으로 직접 구현하는 대신 `role`을 설정하여,
|
||||
고유 OS 경험을 최대한 살릴 것을 권장합니다.
|
||||
|
||||
The `role` property can have following values:
|
||||
`role` 속성은 다음 값을 가질 수 있습니다.:
|
||||
|
||||
* `undo`
|
||||
* `redo`
|
||||
|
@ -37,16 +36,16 @@ The `role` property can have following values:
|
|||
* `copy`
|
||||
* `paste`
|
||||
* `selectall`
|
||||
* `minimize` - Minimize current window
|
||||
* `close` - Close current window
|
||||
* `minimize` - 현재 윈도우를 최소화 합니다.
|
||||
* `close` - 현재 윈도우를 닫습니다.
|
||||
|
||||
On OS X `role` can also have following additional values:
|
||||
OS X에서 `role`은 다음 값을 추가로 가질 수 있습니다.
|
||||
|
||||
* `about` - Map to the `orderFrontStandardAboutPanel` action
|
||||
* `hide` - Map to the `hide` action
|
||||
* `hideothers` - Map to the `hideOtherApplications` action
|
||||
* `unhide` - Map to the `unhideAllApplications` action
|
||||
* `front` - Map to the `arrangeInFront` action
|
||||
* `window` - The submenu is a "Window" menu
|
||||
* `help` - The submenu is a "Help" menu
|
||||
* `services` - The submenu is a "Services" menu
|
||||
* `about` - `orderFrontStandardAboutPanel` 액션에 매핑합니다.
|
||||
* `hide` - `hide` 액션에 매핑합니다.
|
||||
* `hideothers` - `hideOtherApplications` 액션에 매핑합니다.
|
||||
* `unhide` - `unhideAllApplications` 액션에 매핑합니다.
|
||||
* `front` - `arrangeInFront` 액션에 매핑합니다.
|
||||
* `window` - 부메뉴가 "Window" 메뉴입니다.
|
||||
* `help` - 부메뉴가 "Help" 메뉴입니다.
|
||||
* `services` - 부메뉴가 "Services" 메뉴입니다.
|
||||
|
|
660
docs-translations/ko-KR/api/web-contents.md
Normal file
660
docs-translations/ko-KR/api/web-contents.md
Normal file
|
@ -0,0 +1,660 @@
|
|||
# webContents
|
||||
|
||||
`webContents`는
|
||||
[EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)입니다.
|
||||
|
||||
웹페이지의 렌더링과 관리를 책임지며 [`BrowserWindow`](browser-window.md)의 속성입니다. 다음은 `webContents` 객체를 접근하는 예입니다:
|
||||
|
||||
```javascript
|
||||
const BrowserWindow = require('electron').BrowserWindow;
|
||||
|
||||
var win = new BrowserWindow({width: 800, height: 1500});
|
||||
win.loadURL("http://github.com");
|
||||
|
||||
var webContents = win.webContents;
|
||||
```
|
||||
|
||||
## Events
|
||||
|
||||
`webContents` 객체는 다음과 같은 이벤트들을 발생시킵니다:
|
||||
|
||||
### Event: 'did-finish-load'
|
||||
|
||||
네비게이션이 끝났을 때 발생하는 이벤트입니다. 즉, 탭의 스피너가 멈추고 `onload` 이벤트가 발생했을 때를 얘기합니다.
|
||||
|
||||
### Event: 'did-fail-load'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `errorCode` Integer
|
||||
* `errorDescription` String
|
||||
* `validatedURL` String
|
||||
|
||||
이 이벤트는 `did-finish-load`와 비슷하나, 로드가 실패했거나 취소되었을 때도 발생합니다. 예를들면 `window.stop()`이 실행되었을 때 발생합니다.
|
||||
모든 에러 코드들의 목록과 설명은 [여기](https://code.google.com/p/chromium/codesearch#chromium/src/net/base/net_error_list.h)서 확인 가능합니다.
|
||||
|
||||
### Event: 'did-frame-finish-load'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `isMainFrame` Boolean
|
||||
|
||||
프레임(Frame)이 네비게이션을 끝냈을 때 발생하는 이벤트입니다.
|
||||
|
||||
### Event: 'did-start-loading'
|
||||
|
||||
탭의 스피너가 회전을 시작한 시점과 같습니다.
|
||||
|
||||
### Event: 'did-stop-loading'
|
||||
|
||||
탭의 스피너가 회전을 멈추었을 떄의 시점과 같습니다.
|
||||
|
||||
### Event: 'did-get-response-details'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `status` Boolean
|
||||
* `newURL` String
|
||||
* `originalURL` String
|
||||
* `httpResponseCode` Integer
|
||||
* `requestMethod` String
|
||||
* `referrer` String
|
||||
* `headers` Object
|
||||
|
||||
요청한 리소스의 정보가 존재할 때 발생하는 이벤트입니다.
|
||||
`status`는 리소스를 다운로드하기 위한 소켓 연결을 나타냅니다.
|
||||
|
||||
### Event: 'did-get-redirect-request'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `oldURL` String
|
||||
* `newURL` String
|
||||
* `isMainFrame` Boolean
|
||||
* `httpResponseCode` Integer
|
||||
* `requestMethod` String
|
||||
* `referrer` String
|
||||
* `headers` Object
|
||||
|
||||
리소스를 요청할 때 리다이렉트 응답을 받았을 때 발생하는 이벤트입니다.
|
||||
|
||||
### Event: 'dom-ready'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
|
||||
주어진 프레임의 문서가 로드되었을 때 발생하는 이벤트입니다.
|
||||
|
||||
### Event: 'page-favicon-updated'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `favicons` Array - Array of URLs
|
||||
|
||||
페이지가 favicon을 받았을 때 발생하는 이벤트입니다.
|
||||
|
||||
### Event: 'new-window'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `url` String
|
||||
* `frameName` String
|
||||
* `disposition` String - `default`, `foreground-tab`, `background-tab`,
|
||||
`new-window`, `other`중 하나일 수 있습니다.
|
||||
* `options` Object - 새로운 `BrowserWindow`를 만들 때 사용되는 옵션들입니다.
|
||||
|
||||
페이지가 `url`에 대하여 새로운 윈도우를 열기위해 요청한 경우 발생하는 이벤트입니다.
|
||||
`window.open`이나 `<a target='_blank'>`과 같은 외부 링크 등에 의해 요청될 수 있습니다.
|
||||
|
||||
기본값으로 `BrowserWindow`는 `url`로 생성됩니다.
|
||||
|
||||
`event.preventDefault()`를 호출하면 새로운 창을 만드는 것을 방지할 수 있습니다.
|
||||
|
||||
### Event: 'will-navigate'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `url` String
|
||||
|
||||
사용자 또는 페이지가 새로운 네비게이션을 원할 때 발생하는 이벤트입니다.
|
||||
`window.location` 객체가 변경되거나 사용자가 페이지의 링크를 클릭했을 때 발생합니다.
|
||||
|
||||
이 이벤트는 `webContents.loadURL`과 `webContents.back` 같은 API를 이용하여 프로그램적으로
|
||||
시작된 네비게이션에 대해서는 발생하지 않습니다.
|
||||
|
||||
`event.preventDefault()`를 호출하면 네비게이션을 방지할 수 있습니다.
|
||||
|
||||
### Event: 'crashed'
|
||||
|
||||
렌더러 프로세스가 예기치 못하게 종료되었을 때 발생되는 이벤트입니다.
|
||||
|
||||
### Event: 'plugin-crashed'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `name` String
|
||||
* `version` String
|
||||
|
||||
플러그인 프로세스가 예기치 못하게 종료되었을 때 발생되는 이벤트입니다.
|
||||
|
||||
### Event: 'destroyed'
|
||||
|
||||
`webContents`가 소멸될 때 발생되는 이벤트입니다.
|
||||
|
||||
### Event: 'devtools-opened'
|
||||
|
||||
DevTools가 열렸을 때 발생되는 이벤트입니다.
|
||||
|
||||
### Event: 'devtools-closed'
|
||||
|
||||
DevTools가 닫혔을 때 발생되는 이벤트입니다.
|
||||
|
||||
### Event: 'devtools-focused'
|
||||
|
||||
DevTools에 포커스가 가거나 DevTools가 열렸을 때 발생되는 이벤트입니다.
|
||||
|
||||
### Event: 'login'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `request` Object
|
||||
* `method` String
|
||||
* `url` URL
|
||||
* `referrer` URL
|
||||
* `authInfo` Object
|
||||
* `isProxy` Boolean
|
||||
* `scheme` String
|
||||
* `host` String
|
||||
* `port` Integer
|
||||
* `realm` String
|
||||
* `callback` Function
|
||||
|
||||
`webContents`가 기본 인증을 수행하길 원할 때 발생되는 이벤트입니다.
|
||||
|
||||
[`app`의 `login`이벤트](app.md#event-login)와 사용 방법은 같습니다.
|
||||
|
||||
## Instance Methods
|
||||
|
||||
`webContents`객체는 다음과 같은 인스턴스 메소드들을 가지고 있습니다.
|
||||
|
||||
### `webContents.session`
|
||||
|
||||
webContents에서 사용되는 `session`객체를 반환합니다.
|
||||
|
||||
[session 문서](session.md)에서 이 객체의 메소드들을 확인할 수 있습니다.
|
||||
|
||||
### `webContents.loadURL(url[, options])`
|
||||
|
||||
* `url` URL
|
||||
* `options` Object (optional), 속성들:
|
||||
* `httpReferrer` String - HTTP Referrer url.
|
||||
* `userAgent` String - 요청을 시작한 유저 에이전트.
|
||||
* `extraHeaders` String - "\n"로 구분된 Extra 헤더들.
|
||||
|
||||
윈도우에 `url`을 로드합니다. `url`은 `http://` or `file://`과 같은 프로토콜 접두사를
|
||||
가지고 있어야 합니다.
|
||||
|
||||
### `webContents.getURL()`
|
||||
|
||||
현재 웹 페이지의 URL을 반환합니다.
|
||||
|
||||
```javascript
|
||||
var win = new BrowserWindow({width: 800, height: 600});
|
||||
win.loadURL("http://github.com");
|
||||
|
||||
var currentURL = win.webContents.getURL();
|
||||
```
|
||||
|
||||
### `webContents.getTitle()`
|
||||
|
||||
현재 웹 페이지의 제목을 반환합니다.
|
||||
|
||||
### `webContents.isLoading()`
|
||||
|
||||
현재 웹 페이지가 리소스를 로드중인지 여부를 반환합니다.
|
||||
|
||||
### `webContents.isWaitingForResponse()`
|
||||
|
||||
현재 웹 페이지가 페이지의 메인 리소스로부터 첫 응답을 기다리고있는지 여부를 반환합니다.
|
||||
|
||||
### `webContents.stop()`
|
||||
|
||||
대기중인 네비게이션들을 모두 멈춥니다.
|
||||
|
||||
### `webContents.reload()`
|
||||
|
||||
현재 웹 페이지를 새로고침합니다.
|
||||
|
||||
### `webContents.reloadIgnoringCache()`
|
||||
|
||||
현재 페이지를 캐시를 무시한채로 새로고침합니다.
|
||||
|
||||
### `webContents.canGoBack()`
|
||||
|
||||
브라우저가 이전의 웹 페이지로 돌아갈 수 있는지 여부를 반환합니다.
|
||||
|
||||
### `webContents.canGoForward()`
|
||||
|
||||
브라우저가 다음 웹 페이지로 이동할 수 있는지 여부를 반환합니다.
|
||||
|
||||
### `webContents.canGoToOffset(offset)`
|
||||
|
||||
* `offset` Integer
|
||||
|
||||
웹 페이지가 `offset`로 이동할 수 있는지 여부를 반환합니다.
|
||||
|
||||
### `webContents.clearHistory()`
|
||||
|
||||
네비게이션 기록을 삭제합니다.
|
||||
|
||||
### `webContents.goBack()`
|
||||
|
||||
브라우저가 이전 웹 페이지로 이동하게 합니다.
|
||||
|
||||
### `webContents.goForward()`
|
||||
|
||||
브라우저가 다음 웹 페이지로 이동하게 합니다.
|
||||
|
||||
### `webContents.goToIndex(index)`
|
||||
|
||||
* `index` Integer
|
||||
|
||||
브라우저가 지정된 절대 웹 페이지 인덱스로 네비게이트하게 합니다.
|
||||
|
||||
### `webContents.goToOffset(offset)`
|
||||
|
||||
* `offset` Integer
|
||||
|
||||
"current entry"에서 지정된 offset으로 네비게이트 합니다.
|
||||
|
||||
### `webContents.isCrashed()`
|
||||
|
||||
렌더러 프로세스가 예기치 않게 종료되었는지 여부를 반환합니다.
|
||||
|
||||
### `webContents.setUserAgent(userAgent)`
|
||||
|
||||
* `userAgent` String
|
||||
|
||||
현재의 웹 페이지의 유저 에이전트를 오버라이드 합니다.
|
||||
|
||||
### `webContents.getUserAgent()`
|
||||
|
||||
현재 웹 페이지의 유저 에이전트 `String`을 반환합니다.
|
||||
|
||||
### `webContents.insertCSS(css)`
|
||||
|
||||
* `css` String
|
||||
|
||||
Injects CSS into the current web page.
|
||||
|
||||
### `webContents.executeJavaScript(code[, userGesture])`
|
||||
|
||||
* `code` String
|
||||
* `userGesture` Boolean (optional)
|
||||
|
||||
페이지에서 코드를 실행합니다.
|
||||
|
||||
브라우저 윈도우에서 `requestFullScreen`와 같은 몇몇 HTML API들은 사용자의 행동으로만 호출될 수
|
||||
있습니다. `userGesture`를 `true`로 설정하면 이런 제약을 무시할 수 있습니다.
|
||||
|
||||
### `webContents.setAudioMuted(muted)`
|
||||
|
||||
+ `muted` Boolean
|
||||
|
||||
현재 웹 페이지의 소리를 음소거합니다.
|
||||
|
||||
### `webContents.isAudioMuted()`
|
||||
|
||||
현재 페이지가 음소거 되어있는지 여부를 반환합니다.
|
||||
|
||||
### `webContents.undo()`
|
||||
|
||||
웹 페이지에서 `undo` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.redo()`
|
||||
|
||||
웹 페이지에서 `redo` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.cut()`
|
||||
|
||||
웹 페이지에서 `cut` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.copy()`
|
||||
|
||||
웹 페이지에서 `copy` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.paste()`
|
||||
|
||||
웹 페이지에서 `paste` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.pasteAndMatchStyle()`
|
||||
|
||||
웹 페이지에서 `pasteAndMatchStyle` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.delete()`
|
||||
|
||||
웹 페이지에서 `delete` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.selectAll()`
|
||||
|
||||
웹 페이지에서 `selectAll` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.unselect()`
|
||||
|
||||
웹 페이지에서 `unselect` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.replace(text)`
|
||||
|
||||
* `text` String
|
||||
|
||||
웹 페이지에서 `replace` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.replaceMisspelling(text)`
|
||||
|
||||
* `text` String
|
||||
|
||||
웹 페이지에서 `replaceMisspelling` 에디팅 커맨드를 실행합니다.
|
||||
|
||||
### `webContents.hasServiceWorker(callback)`
|
||||
|
||||
* `callback` Function
|
||||
|
||||
ServiceWorker가 등록되어있는지 확인하고 `callback`에 대한 응답으로 boolean을 반환합니다.
|
||||
|
||||
### `webContents.unregisterServiceWorker(callback)`
|
||||
|
||||
* `callback` Function
|
||||
|
||||
ServiceWorker가 존재하면 모두 등록을 해제하고 JS promise가 만족될 때 `callback`에 대한
|
||||
응답으로 boolean을 반환하거나 JS promise가 만족되지 않을 때 false를 반환합니다.
|
||||
|
||||
### `webContents.print([options])`
|
||||
|
||||
`options` Object (optional), properties:
|
||||
|
||||
* `silent` Boolean - 사용자에게 프린트 설정을 묻지 않습니다. 기본값을 `false`입니다.
|
||||
* `printBackground` Boolean - 웹 페이지의 배경 색과 이미지를 출력합니다. 기본값은
|
||||
`false`입니다.
|
||||
|
||||
윈도우의 웹 페이지를 프린트합니다. `silent`가 `false`로 지정되어있을 땐, Electron이 시스템의
|
||||
기본 프린터와 기본 프린터 설정을 가져옵니다.
|
||||
|
||||
웹 페이지에서 `window.print()`를 호출하는 것은
|
||||
`webContents.print({silent: false, printBackground: false})`를 호출하는 것과 같습니다.
|
||||
|
||||
**Note:** 윈도우즈에서 print API는 `pdf.dll`에 의존합니다. 당신의 어플리케이션이 print 기능을
|
||||
필요로 하지 않는다면 바이너리 크기를 줄이기 위해 `pdf.dll`을 삭제하셔도 안전합니다.
|
||||
|
||||
### `webContents.printToPDF(options, callback)`
|
||||
|
||||
`options` Object, properties:
|
||||
|
||||
* `marginsType` Integer - 사용할 마진의 종류를 지정합니다.
|
||||
* 0 - default
|
||||
* 1 - none
|
||||
* 2 - minimum
|
||||
* `pageSize` String - 생성되는 PDF의 페이지 크기를 지정합니다.
|
||||
* `A4`
|
||||
* `A3`
|
||||
* `Legal`
|
||||
* `Letter`
|
||||
* `Tabloid`
|
||||
* `printBackground` Boolean - CSS 배경을 프린트할지 여부를 정합니다.
|
||||
* `printSelectionOnly` Boolean - 선택된 영역만 프린트할지 여부를 정합니다.
|
||||
* `landscape` Boolean - landscape을 위해선 `true`를, portrait를 위해선 `false`를
|
||||
사용합니다.
|
||||
|
||||
`callback` Function - `function(error, data) {}`
|
||||
|
||||
* `error` Error
|
||||
* `data` Buffer - PDF 파일 내용.
|
||||
|
||||
Chromium의 미리보기 프린팅 커스텀 설정을 이용하여 윈도우의 웹 페이지를 PDF로 프린트합니다.
|
||||
|
||||
기본으로 비어있는 `options`은 다음과 같이 여겨지게 됩니다:
|
||||
|
||||
```javascript
|
||||
{
|
||||
marginsType: 0,
|
||||
printBackground: false,
|
||||
printSelectionOnly: false,
|
||||
landscape: false
|
||||
}
|
||||
```
|
||||
|
||||
```javascript
|
||||
const BrowserWindow = require('electron').BrowserWindow;
|
||||
const fs = require('fs');
|
||||
|
||||
var win = new BrowserWindow({width: 800, height: 600});
|
||||
win.loadURL("http://github.com");
|
||||
|
||||
win.webContents.on("did-finish-load", function() {
|
||||
// Use default printing options
|
||||
win.webContents.printToPDF({}, function(error, data) {
|
||||
if (error) throw error;
|
||||
fs.writeFile("/tmp/print.pdf", data, function(error) {
|
||||
if (error)
|
||||
throw error;
|
||||
console.log("Write PDF successfully.");
|
||||
})
|
||||
})
|
||||
});
|
||||
```
|
||||
|
||||
### `webContents.addWorkSpace(path)`
|
||||
|
||||
* `path` String
|
||||
|
||||
특정 경로를 DevTools의 워크스페이스에 추가합니다.
|
||||
|
||||
### `webContents.removeWorkSpace(path)`
|
||||
|
||||
* `path` String
|
||||
|
||||
특정 경로를 DevTools의 워크스페이스에서 제거합니다.
|
||||
|
||||
### `webContents.openDevTools([options])`
|
||||
|
||||
* `options` Object (optional). Properties:
|
||||
* `detach` Boolean - 새 창에서 DevTools를 엽니다.
|
||||
|
||||
개발자 도구를 엽니다.
|
||||
|
||||
### `webContents.closeDevTools()`
|
||||
|
||||
개발자 도구를 닫습니다.
|
||||
|
||||
### `webContents.isDevToolsOpened()`
|
||||
|
||||
개발자 도구가 열려있는지 여부를 반환합니다.
|
||||
|
||||
### `webContents.toggleDevTools()`
|
||||
|
||||
개발자 도구를 토글합니다.
|
||||
|
||||
### `webContents.isDevToolsFocused()`
|
||||
|
||||
개발자 도구에 포커스가 가있는지 여부를 반화합니다.
|
||||
|
||||
### `webContents.inspectElement(x, y)`
|
||||
|
||||
* `x` Integer
|
||||
* `y` Integer
|
||||
|
||||
(`x`, `y`)위치의 엘레먼트를 조사합니다.
|
||||
|
||||
### `webContents.inspectServiceWorker()`
|
||||
|
||||
서비스 워커 컨텍스트(service worker context)를 위한 개발자 도구를 엽니다.
|
||||
|
||||
### `webContents.send(channel[, arg1][, arg2][, ...])`
|
||||
|
||||
* `channel` String
|
||||
* `arg` (optional)
|
||||
|
||||
`channel`을 통하여 렌더러 프로세스에 비동기 메시지를 보냅ㄹ니다. 임의의 아규먼트를 보낼수도 있습니다.
|
||||
렌더러 프로세스는 `ipcRenderer` 모듈을 통하여 `channel`를 리슨하여 메시지를 처리할 수 있습니다.
|
||||
|
||||
메인 프로세스에서 렌더러 프로세스로 메시지를 보내는 예시 입니다:
|
||||
|
||||
```javascript
|
||||
// In the main process.
|
||||
var window = null;
|
||||
app.on('ready', function() {
|
||||
window = new BrowserWindow({width: 800, height: 600});
|
||||
window.loadURL('file://' + __dirname + '/index.html');
|
||||
window.webContents.on('did-finish-load', function() {
|
||||
window.webContents.send('ping', 'whoooooooh!');
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
```html
|
||||
<!-- index.html -->
|
||||
<html>
|
||||
<body>
|
||||
<script>
|
||||
require('electron').ipcRenderer.on('ping', function(event, message) {
|
||||
console.log(message); // Prints "whoooooooh!"
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
### `webContents.enableDeviceEmulation(parameters)`
|
||||
|
||||
`parameters` Object, properties:
|
||||
|
||||
* `screenPosition` String - 에뮬레이트 할 화면 종료를 지정합니다
|
||||
(default: `desktop`)
|
||||
* `desktop`
|
||||
* `mobile`
|
||||
* `screenSize` Object - 에뮬레이트 화면의 크기를 지정합니다 (screenPosition == mobile)
|
||||
* `width` Integer - 에뮬레이트 화면의 너비를 지정합니다
|
||||
* `height` Integer - 에뮬레이트 화면의 높이를 지정합니다
|
||||
* `viewPosition` Object - 화면에서 뷰의 위치
|
||||
(screenPosition == mobile) (default: `{x: 0, y: 0}`)
|
||||
* `x` Integer - 좌상단 모서리로부터의 x 축의 오프셋
|
||||
* `y` Integer - 좌상단 모서리로부터의 y 축의 오프셋
|
||||
* `deviceScaleFactor` Integer - 디바이스의 스케일 팩터(scale factor)를 지정합니다.
|
||||
(0일 경우 기본 디바이스 스케일 팩터를 기본으로 사용합니다) (default: `0`)
|
||||
* `viewSize` Object - 에뮬레이트 된 뷰의 크기를 지정합니다 (빈 값은 오버라이드 하지 않는 다는
|
||||
것을 의미합니다)
|
||||
* `width` Integer - 에뮬레이트 된 뷰의 너비를 지정합니다
|
||||
* `height` Integer - 에뮬레이트 된 뷰의 높이를 지정합니다
|
||||
* `fitToView` Boolean - 에뮬레이트의 뷰가 사용 가능한 공간에 맞추어 스케일 다운 될지 여부를
|
||||
지정합니다 (기본값: `false`)
|
||||
* `offset` Object - 사용 가능한 공간에서 에뮬레이트 된 뷰의 오프셋을 지정합니다
|
||||
(fit to view 모드 외에서) (기본값: `{x: 0, y: 0}`)
|
||||
* `x` Float - 좌상단 모서리에서 x 축의 오프셋을 지정합니다
|
||||
* `y` Float - 좌상단 모서리에서 y 축의 오프셋을 지정합니다
|
||||
* `scale` Float - 사용 가능한 공간에서 에뮬레이드 된 뷰의 스케일 (fit to view 모드 외에서)
|
||||
(기본값: `1`)
|
||||
|
||||
주어진 파라미터로 디바이스 에뮬레이션을 사용합니다.
|
||||
|
||||
### `webContents.disableDeviceEmulation()`
|
||||
|
||||
`webContents.enableDeviceEmulation`로 사용가능해진 디바이스 에뮬레이선을 비활성화 합니다.
|
||||
|
||||
### `webContents.sendInputEvent(event)`
|
||||
|
||||
* `event` Object
|
||||
* `type` String (**required**) - 이벤트의 타입. 다음 값들이 가능합니다. `mouseDown`,
|
||||
`mouseUp`, `mouseEnter`, `mouseLeave`, `contextMenu`, `mouseWheel`,
|
||||
`keyDown`, `keyUp`, `char`.
|
||||
* `modifiers` Array - 이벤트의 수정자(modifier)들에 대한 배열. 다음 값들을 포함 할 수
|
||||
있습니다. `shift`, `control`, `alt`, `meta`, `isKeypad`, `isAutoRepeat`,
|
||||
`leftButtonDown`, `middleButtonDown`, `rightButtonDown`, `capsLock`,
|
||||
`numLock`, `left`, `right`.
|
||||
|
||||
input `event`를 페이지로 보냅니다.
|
||||
|
||||
키보드 이벤트들에 대해서는 `event` 객체는 다음 속성들을 추가적으로 가지고 있습니다:
|
||||
|
||||
* `keyCode` String (**required**) - 키보드 이벤트로 보낼 수 있는 단일 캐릭터. 모든 UTF-8가
|
||||
사용 가능합니다.
|
||||
|
||||
마우스 이벤트들에 대해서는 `event` 객체는 다음 속성들을 추가적으로 가지고 있습니다:
|
||||
|
||||
* `x` Integer (**required**)
|
||||
* `y` Integer (**required**)
|
||||
* `button` String - 눌린 버튼. 다음 값들이 가능합니다. `left`, `middle`, `right`
|
||||
* `globalX` Integer
|
||||
* `globalY` Integer
|
||||
* `movementX` Integer
|
||||
* `movementY` Integer
|
||||
* `clickCount` Integer
|
||||
|
||||
`mouseWheel` 이벤트에 대해서는 `event` 객체는 다음 속성들을 추가적으로 가지고 있습니다:
|
||||
|
||||
* `deltaX` Integer
|
||||
* `deltaY` Integer
|
||||
* `wheelTicksX` Integer
|
||||
* `wheelTicksY` Integer
|
||||
* `accelerationRatioX` Integer
|
||||
* `accelerationRatioY` Integer
|
||||
* `hasPreciseScrollingDeltas` Boolean
|
||||
* `canScroll` Boolean
|
||||
|
||||
### `webContents.beginFrameSubscription(callback)`
|
||||
|
||||
* `callback` Function
|
||||
|
||||
프레젠테이션 이벤트들과 캡쳐된 프레임들에 대한 구독을 시작하면 `callback`이 프레젠테이션 이벤트가
|
||||
발생할 때 `callback(frameBuffer)`과 같은 형식으로 호출됩니다.
|
||||
|
||||
`frameBuffer`는 raw 픽셀 데이터를 포함한 `Buffer`입니다. 대부분의 기계에서 픽셀 데이터는 32bit
|
||||
BGRA 포맷으로 효율적으로 저장됩니다. 하지만 실제 재프리젠테이션은 프로세서의 endianness에 의존성을
|
||||
가지고 있습니다(대부분의 현재 프로세스들은 little-endian입니다. big-endian 프로세서들를 가진
|
||||
기계들에서 data는 32bit ARGB format입니다).
|
||||
|
||||
### `webContents.endFrameSubscription()`
|
||||
|
||||
프레임 프레젠테이션 이벤트들에 대한 구독을 중지합니다.
|
||||
|
||||
## Instance Properties
|
||||
|
||||
`WebContents`객체들은 다음 속성들을 가지고 있습니다:
|
||||
|
||||
### `webContents.devToolsWebContents`
|
||||
|
||||
이 `WebContents`에 대한 DevTools의 `WebContents`를 가져옵니다.
|
||||
|
||||
**Note:** 사용자가 절대로 이 객체를 저장해서는 안됩니다. 그럴경우 DevTools가 닫혔을 때, `null`이
|
||||
될 수도 있습니다.
|
||||
|
||||
### `webContents.savePage(fullPath, saveType, callback)`
|
||||
|
||||
* `fullPath` String - 전체 파일 경로.
|
||||
* `saveType` String - 저장 타입을 지정합니다.
|
||||
* `HTMLOnly` - 페이지의 HTML만 저장합니다.
|
||||
* `HTMLComplete` - 페이지의 완성된 HTML을 저장합니다.
|
||||
* `MHTML` - 페이지의 완성된 HTML을 MHTML로 저장합니다.
|
||||
* `callback` Function - `function(error) {}`.
|
||||
* `error` Error
|
||||
|
||||
만약 페이지를 저장하는 프로세스가 성공적으로 끝났을 경우 true를 반환합니다.
|
||||
|
||||
```javascript
|
||||
win.loadURL('https://github.com');
|
||||
|
||||
win.webContents.on('did-finish-load', function() {
|
||||
win.webContents.savePage('/tmp/test.html', 'HTMLComplete', function(error) {
|
||||
if (!error)
|
||||
console.log("Save page successfully");
|
||||
});
|
||||
});
|
||||
```
|
|
@ -26,10 +26,12 @@ Chromium의 Content API에 접근합니다. libchromiumcontent은 단일 공유
|
|||
__3. Node 통합__
|
||||
|
||||
NW.js는 웹 페이지에서 require를 사용할 수 있도록 Chromium을 패치했습니다. 한편 Electron은 Chromium의 해킹을 방지하기 위해 libuv loop와 각 플랫폼의 메시지 루프에 통합하는 등의 다른 방법을 채택하였습니다.
|
||||
[`node_bindings`](../../../atom/common/) 코드를 보면 이 부분이 어떻게 구현됬는지를 알 수 있습니다.
|
||||
[`node_bindings`][node-bindings] 코드를 보면 이 부분이 어떻게 구현됬는지를 알 수 있습니다.
|
||||
|
||||
__4. 다중 컨텍스트__
|
||||
|
||||
만약 NW.js를 사용해본적이 있다면 Node context와 Web context의 개념을 잘 알고 있을겁니다. 이 개념은 NW.js가 구현된 방식에 따라 만들어졌습니다.
|
||||
|
||||
Node의 [다중 컨텍스트](http://strongloop.com/strongblog/whats-new-node-js-v0-12-multiple-context-execution/)를 사용할 경우 Electron은 웹 페이지에서 새로운 JavaScript 컨텍스트를 생성하지 않습니다.
|
||||
|
||||
[node-bindings]: https://github.com/atom/electron/tree/master/atom/common
|
||||
|
|
29
docs-translations/pt-BR/development/coding-style.md
Normal file
29
docs-translations/pt-BR/development/coding-style.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Estilo de Codificação
|
||||
|
||||
Estas são as diretrizes de estilo para codificar no Electron.
|
||||
|
||||
## C++ and Python
|
||||
|
||||
Para C ++ e Python, seguimos os padrões do projeto Chromium [Estilo de Codificação](http://www.chromium.org/developers/coding-style). Há também um
|
||||
script `script/cpplint.py` para verificar se todos os arquivos estão em conformidade.
|
||||
|
||||
A versão Python que estamos usando agora é a Python 2.7.
|
||||
|
||||
O código C ++ usa do Chromium's um monte de tipos e abstrações, por isso é recomendada para se familiarizar com eles. Um bom lugar para começar com a documentação do Chromium's [Important Abstractions and Data Structures](https://www.chromium.org/developers/coding-style/important-abstractions-and-data-structures). O documento menciona alguns tipos especiais, com escopo tipos (que automaticamente libera sua memória quando sai do escopo), registrando mecanismos etc.
|
||||
|
||||
## CoffeeScript
|
||||
|
||||
For CoffeeScript, we follow GitHub's [Style
|
||||
Guide](https://github.com/styleguide/javascript) and the following rules:
|
||||
|
||||
Para CoffeeScript, seguimos o estilo do GitHub [Guia de Estilo] (https://github.com/styleguide/javascript) com as seguintes regras:
|
||||
|
||||
* Os arquivos devem **NÃO DEVEM** com nova linha no final, porque queremos corresponder aos padrões de estilo Google.
|
||||
|
||||
* Os nomes dos arquivos devem ser concatenados com o `-` em vez de`_`, por exemplo, `file-name.coffee` em vez de`file_name.coffee`, porque no [github/atom](https://github.com/github/atom) os nomes dos módulos são geralmente em o formulário `module-name`. Esta regra só se aplica aos arquivos com extensão `.coffee`.
|
||||
*
|
||||
## API Names
|
||||
|
||||
Ao criar uma nova API, devemos preferencialmente utilizar métodos getters e setters em vez de
|
||||
estilo de uma função do jQuery. Por exemplo, `.getText()` e `.setText(text)` utilize `.text([text])`. Existe uma
|
||||
[discussão](https://github.com/atom/electron/issues/46) sobre este assunto.
|
|
@ -20,10 +20,12 @@ __2. 构建系统__
|
|||
|
||||
__3. Node 集成__
|
||||
|
||||
在 NW.js,网页中的 Node 集成需要通过给 Chromium 打补丁来实现。但在 Electron 中,我们选择了另一种方式:通过各个平台的消息循环与 libuv 的循环集成,避免了直接在 Chromium 上做改动。你可以看 [`node_bindings`](../../atom/common/) 来了解这是如何完成的。
|
||||
在 NW.js,网页中的 Node 集成需要通过给 Chromium 打补丁来实现。但在 Electron 中,我们选择了另一种方式:通过各个平台的消息循环与 libuv 的循环集成,避免了直接在 Chromium 上做改动。你可以看 [`node_bindings`][node-bindings] 来了解这是如何完成的。
|
||||
|
||||
__4. 多上下文__
|
||||
|
||||
如果你是有经验的 NW.js 用户,你应该会熟悉 Node 上下文和 web 上下文的概念。这些概念的产生源于 NW.js 的实现方式。
|
||||
|
||||
通过使用 Node 的[多上下文](http://strongloop.com/strongblog/whats-new-node-js-v0-12-multiple-context-execution/)特性,Electron不需要在网页中引入新的 JavaScript 上下文。
|
||||
|
||||
[node-bindings]: https://github.com/atom/electron/tree/master/atom/common
|
||||
|
|
|
@ -139,8 +139,8 @@ Returns:
|
|||
* `webContents` [WebContents](web-contents.md)
|
||||
* `url` URL
|
||||
* `certificateList` [Objects]
|
||||
* `data` PEM encoded data
|
||||
* `issuerName` Issuer's Common Name
|
||||
* `data` Buffer - PEM encoded data
|
||||
* `issuerName` String - Issuer's Common Name
|
||||
* `callback` Function
|
||||
|
||||
Emitted when a client certificate is requested.
|
||||
|
|
|
@ -34,6 +34,30 @@ session.on('will-download', function(event, item, webContents) {
|
|||
});
|
||||
```
|
||||
|
||||
### Event: 'verify-certificate'
|
||||
|
||||
* `event` Event
|
||||
* `hostname` String
|
||||
* `certificate` Object
|
||||
* `data` Buffer - PEM encoded data
|
||||
* `issuerName` String
|
||||
* `callback` Function
|
||||
|
||||
Fired whenever a server certificate verification is requested by the
|
||||
network layer with `hostname`, `certificate` and `callback`.
|
||||
`callback` should be called with a boolean response to
|
||||
indicate continuation or cancellation of the request.
|
||||
|
||||
```js
|
||||
session.on('verify-certificate', function(event, hostname, certificate, callback) {
|
||||
if (hostname == "github.com") {
|
||||
// verification logic
|
||||
callback(true);
|
||||
}
|
||||
callback(false);
|
||||
});
|
||||
```
|
||||
|
||||
## Methods
|
||||
|
||||
The `session` object has the following methods:
|
||||
|
|
|
@ -35,7 +35,7 @@ __3. Node Integration__
|
|||
In NW.js, the Node integration in web pages requires patching Chromium to
|
||||
work, while in Electron we chose a different way to integrate the libuv loop
|
||||
with each platform's message loop to avoid hacking Chromium. See the
|
||||
[`node_bindings`](../../../atom/common/) code for how that was done.
|
||||
[`node_bindings`][node-bindings] code for how that was done.
|
||||
|
||||
__4. Multi-context__
|
||||
|
||||
|
@ -46,3 +46,5 @@ of how NW.js was implemented.
|
|||
By using the [multi-context](http://strongloop.com/strongblog/whats-new-node-js-v0-12-multiple-context-execution/)
|
||||
feature of Node, Electron doesn't introduce a new JavaScript context in web
|
||||
pages.
|
||||
|
||||
[node-bindings]: https://github.com/atom/electron/tree/master/atom/common
|
||||
|
|
|
@ -131,6 +131,8 @@
|
|||
'atom/browser/atom_download_manager_delegate.h',
|
||||
'atom/browser/atom_browser_main_parts.cc',
|
||||
'atom/browser/atom_browser_main_parts.h',
|
||||
'atom/browser/atom_cert_verifier.cc',
|
||||
'atom/browser/atom_cert_verifier.h',
|
||||
'atom/browser/atom_browser_main_parts_mac.mm',
|
||||
'atom/browser/atom_browser_main_parts_posix.cc',
|
||||
'atom/browser/atom_javascript_dialog_manager.cc',
|
||||
|
|
2
vendor/brightray
vendored
2
vendor/brightray
vendored
|
@ -1 +1 @@
|
|||
Subproject commit d788bdfe0bcd4672e62ed0e777876e76897e4613
|
||||
Subproject commit 57472ef51d5bd70c65c5e304ba4626395b5d92aa
|
Loading…
Reference in a new issue