Merge remote-tracking branch 'refs/remotes/atom/master'
This commit is contained in:
		
				commit
				
					
						f7a9b02c63
					
				
			
		
					 27 changed files with 181 additions and 57 deletions
				
			
		| 
						 | 
					@ -53,6 +53,11 @@ contains documents describing how to build and contribute to Electron.
 | 
				
			||||||
- [Simplified Chinese](https://github.com/atom/electron/tree/master/docs-translations/zh-CN)
 | 
					- [Simplified Chinese](https://github.com/atom/electron/tree/master/docs-translations/zh-CN)
 | 
				
			||||||
- [Traditional Chinese](https://github.com/atom/electron/tree/master/docs-translations/zh-TW)
 | 
					- [Traditional Chinese](https://github.com/atom/electron/tree/master/docs-translations/zh-TW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Quick Start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Clone and run the [`atom/electron-quick-start`](https://github.com/atom/electron-quick-start)
 | 
				
			||||||
 | 
					repository to see a minimal Electron app in action.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Community
 | 
					## Community
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can ask questions and interact with the community in the following
 | 
					You can ask questions and interact with the community in the following
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,7 +59,9 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
 | 
				
			||||||
#endif  // !defined(OS_WIN)
 | 
					#endif  // !defined(OS_WIN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Only enable logging when --enable-logging is specified.
 | 
					  // Only enable logging when --enable-logging is specified.
 | 
				
			||||||
  if (!command_line->HasSwitch(switches::kEnableLogging)) {
 | 
					  scoped_ptr<base::Environment> env(base::Environment::Create());
 | 
				
			||||||
 | 
					  if (!command_line->HasSwitch(switches::kEnableLogging) &&
 | 
				
			||||||
 | 
					      !env->HasVar("ELECTRON_ENABLE_LOGGING")) {
 | 
				
			||||||
    settings.logging_dest = logging::LOG_NONE;
 | 
					    settings.logging_dest = logging::LOG_NONE;
 | 
				
			||||||
    logging::SetMinLogLevel(logging::LOG_NUM_SEVERITIES);
 | 
					    logging::SetMinLogLevel(logging::LOG_NUM_SEVERITIES);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -69,10 +71,13 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
 | 
				
			||||||
  // Logging with pid and timestamp.
 | 
					  // Logging with pid and timestamp.
 | 
				
			||||||
  logging::SetLogItems(true, false, true, false);
 | 
					  logging::SetLogItems(true, false, true, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(DEBUG) && defined(OS_LINUX)
 | 
					 | 
				
			||||||
  // Enable convient stack printing.
 | 
					  // Enable convient stack printing.
 | 
				
			||||||
  base::debug::EnableInProcessStackDumping();
 | 
					  bool enable_stack_dumping = env->HasVar("ELECTRON_ENABLE_STACK_DUMPING");
 | 
				
			||||||
 | 
					#if defined(DEBUG) && defined(OS_LINUX)
 | 
				
			||||||
 | 
					  enable_stack_dumping = true;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					  if (enable_stack_dumping)
 | 
				
			||||||
 | 
					    base::debug::EnableInProcessStackDumping();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return brightray::MainDelegate::BasicStartupComplete(exit_code);
 | 
					  return brightray::MainDelegate::BasicStartupComplete(exit_code);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -251,6 +251,12 @@ void App::SetAppUserModelId(const std::string& app_id) {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void App::AllowNTLMCredentialsForAllDomains(bool should_allow) {
 | 
				
			||||||
 | 
					  auto browser_context = static_cast<AtomBrowserContext*>(
 | 
				
			||||||
 | 
					        AtomBrowserMainParts::Get()->browser_context());
 | 
				
			||||||
 | 
					  browser_context->AllowNTLMCredentialsForAllDomains(should_allow);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::string App::GetLocale() {
 | 
					std::string App::GetLocale() {
 | 
				
			||||||
  return l10n_util::GetApplicationLocale("");
 | 
					  return l10n_util::GetApplicationLocale("");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -285,6 +291,8 @@ mate::ObjectTemplateBuilder App::GetObjectTemplateBuilder(
 | 
				
			||||||
      .SetMethod("getPath", &App::GetPath)
 | 
					      .SetMethod("getPath", &App::GetPath)
 | 
				
			||||||
      .SetMethod("setDesktopName", &App::SetDesktopName)
 | 
					      .SetMethod("setDesktopName", &App::SetDesktopName)
 | 
				
			||||||
      .SetMethod("setAppUserModelId", &App::SetAppUserModelId)
 | 
					      .SetMethod("setAppUserModelId", &App::SetAppUserModelId)
 | 
				
			||||||
 | 
					      .SetMethod("allowNTLMCredentialsForAllDomains",
 | 
				
			||||||
 | 
					                 &App::AllowNTLMCredentialsForAllDomains)
 | 
				
			||||||
      .SetMethod("getLocale", &App::GetLocale)
 | 
					      .SetMethod("getLocale", &App::GetLocale)
 | 
				
			||||||
      .SetProperty("defaultSession", &App::DefaultSession);
 | 
					      .SetProperty("defaultSession", &App::DefaultSession);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,6 +65,8 @@ class App : public mate::EventEmitter,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void SetDesktopName(const std::string& desktop_name);
 | 
					  void SetDesktopName(const std::string& desktop_name);
 | 
				
			||||||
  void SetAppUserModelId(const std::string& app_id);
 | 
					  void SetAppUserModelId(const std::string& app_id);
 | 
				
			||||||
 | 
					  void AllowNTLMCredentialsForAllDomains(bool should_allow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::string GetLocale();
 | 
					  std::string GetLocale();
 | 
				
			||||||
  v8::Local<v8::Value> DefaultSession(v8::Isolate* isolate);
 | 
					  v8::Local<v8::Value> DefaultSession(v8::Isolate* isolate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,8 +36,13 @@ bool SavePageHandler::Handle(const base::FilePath& full_path,
 | 
				
			||||||
  auto download_manager = content::BrowserContext::GetDownloadManager(
 | 
					  auto download_manager = content::BrowserContext::GetDownloadManager(
 | 
				
			||||||
      web_contents_->GetBrowserContext());
 | 
					      web_contents_->GetBrowserContext());
 | 
				
			||||||
  download_manager->AddObserver(this);
 | 
					  download_manager->AddObserver(this);
 | 
				
			||||||
 | 
					  // Chromium will create a 'foo_files' directory under the directory of saving
 | 
				
			||||||
 | 
					  // page 'foo.html' for holding other resource files of 'foo.html'.
 | 
				
			||||||
 | 
					  base::FilePath saved_main_directory_path = full_path.DirName().Append(
 | 
				
			||||||
 | 
					      full_path.RemoveExtension().BaseName().value() +
 | 
				
			||||||
 | 
					      FILE_PATH_LITERAL("_files"));
 | 
				
			||||||
  bool result = web_contents_->SavePage(full_path,
 | 
					  bool result = web_contents_->SavePage(full_path,
 | 
				
			||||||
                                        full_path.DirName(),
 | 
					                                        saved_main_directory_path,
 | 
				
			||||||
                                        save_type);
 | 
					                                        save_type);
 | 
				
			||||||
  download_manager->RemoveObserver(this);
 | 
					  download_manager->RemoveObserver(this);
 | 
				
			||||||
  // If initialization fails which means fail to create |DownloadItem|, we need
 | 
					  // If initialization fails which means fail to create |DownloadItem|, we need
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,8 @@ std::string RemoveWhitespace(const std::string& str) {
 | 
				
			||||||
AtomBrowserContext::AtomBrowserContext(const std::string& partition,
 | 
					AtomBrowserContext::AtomBrowserContext(const std::string& partition,
 | 
				
			||||||
                                       bool in_memory)
 | 
					                                       bool in_memory)
 | 
				
			||||||
    : brightray::BrowserContext(partition, in_memory),
 | 
					    : brightray::BrowserContext(partition, in_memory),
 | 
				
			||||||
      job_factory_(new AtomURLRequestJobFactory) {
 | 
					      job_factory_(new AtomURLRequestJobFactory),
 | 
				
			||||||
 | 
					      allow_ntlm_everywhere_(false) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AtomBrowserContext::~AtomBrowserContext() {
 | 
					AtomBrowserContext::~AtomBrowserContext() {
 | 
				
			||||||
| 
						 | 
					@ -168,6 +169,16 @@ void AtomBrowserContext::RegisterPrefs(PrefRegistrySimple* pref_registry) {
 | 
				
			||||||
                                      base::FilePath());
 | 
					                                      base::FilePath());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool AtomBrowserContext::AllowNTLMCredentialsForDomain(const GURL& origin) {
 | 
				
			||||||
 | 
					  if (allow_ntlm_everywhere_)
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  return Delegate::AllowNTLMCredentialsForDomain(origin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void AtomBrowserContext::AllowNTLMCredentialsForAllDomains(bool should_allow) {
 | 
				
			||||||
 | 
					  allow_ntlm_everywhere_ = should_allow;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace atom
 | 
					}  // namespace atom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace brightray {
 | 
					namespace brightray {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,7 @@ class AtomBrowserContext : public brightray::BrowserContext {
 | 
				
			||||||
  net::HttpCache::BackendFactory* CreateHttpCacheBackendFactory(
 | 
					  net::HttpCache::BackendFactory* CreateHttpCacheBackendFactory(
 | 
				
			||||||
      const base::FilePath& base_path) override;
 | 
					      const base::FilePath& base_path) override;
 | 
				
			||||||
  net::SSLConfigService* CreateSSLConfigService() override;
 | 
					  net::SSLConfigService* CreateSSLConfigService() override;
 | 
				
			||||||
 | 
					  bool AllowNTLMCredentialsForDomain(const GURL& auth_origin) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // content::BrowserContext:
 | 
					  // content::BrowserContext:
 | 
				
			||||||
  content::DownloadManagerDelegate* GetDownloadManagerDelegate() override;
 | 
					  content::DownloadManagerDelegate* GetDownloadManagerDelegate() override;
 | 
				
			||||||
| 
						 | 
					@ -36,6 +37,8 @@ class AtomBrowserContext : public brightray::BrowserContext {
 | 
				
			||||||
  // brightray::BrowserContext:
 | 
					  // brightray::BrowserContext:
 | 
				
			||||||
  void RegisterPrefs(PrefRegistrySimple* pref_registry) override;
 | 
					  void RegisterPrefs(PrefRegistrySimple* pref_registry) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void AllowNTLMCredentialsForAllDomains(bool should_allow);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AtomURLRequestJobFactory* job_factory() const { return job_factory_; }
 | 
					  AtomURLRequestJobFactory* job_factory() const { return job_factory_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
| 
						 | 
					@ -45,6 +48,8 @@ class AtomBrowserContext : public brightray::BrowserContext {
 | 
				
			||||||
  // Managed by brightray::BrowserContext.
 | 
					  // Managed by brightray::BrowserContext.
 | 
				
			||||||
  AtomURLRequestJobFactory* job_factory_;
 | 
					  AtomURLRequestJobFactory* job_factory_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool allow_ntlm_everywhere_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DISALLOW_COPY_AND_ASSIGN(AtomBrowserContext);
 | 
					  DISALLOW_COPY_AND_ASSIGN(AtomBrowserContext);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,11 +5,14 @@
 | 
				
			||||||
#include "atom/browser/atom_ssl_config_service.h"
 | 
					#include "atom/browser/atom_ssl_config_service.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "base/command_line.h"
 | 
					#include "base/command_line.h"
 | 
				
			||||||
 | 
					#include "base/strings/string_split.h"
 | 
				
			||||||
#include "atom/common/options_switches.h"
 | 
					#include "atom/common/options_switches.h"
 | 
				
			||||||
#include "content/public/browser/browser_thread.h"
 | 
					#include "content/public/browser/browser_thread.h"
 | 
				
			||||||
#include "net/socket/ssl_client_socket.h"
 | 
					#include "net/socket/ssl_client_socket.h"
 | 
				
			||||||
 | 
					#include "net/ssl/ssl_cipher_suite_names.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace atom {
 | 
					namespace atom {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +29,23 @@ uint16 GetSSLProtocolVersion(const std::string& version_string) {
 | 
				
			||||||
  return version;
 | 
					  return version;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::vector<uint16> ParseCipherSuites(
 | 
				
			||||||
 | 
					    const std::vector<std::string>& cipher_strings) {
 | 
				
			||||||
 | 
					  std::vector<uint16> cipher_suites;
 | 
				
			||||||
 | 
					  cipher_suites.reserve(cipher_strings.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (auto& cipher_string : cipher_strings) {
 | 
				
			||||||
 | 
					    uint16 cipher_suite = 0;
 | 
				
			||||||
 | 
					    if (!net::ParseSSLCipherString(cipher_string, &cipher_suite)) {
 | 
				
			||||||
 | 
					      LOG(ERROR) << "Ignoring unrecognised cipher suite : "
 | 
				
			||||||
 | 
					                 << cipher_string;
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    cipher_suites.push_back(cipher_suite);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return cipher_suites;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AtomSSLConfigService::AtomSSLConfigService() {
 | 
					AtomSSLConfigService::AtomSSLConfigService() {
 | 
				
			||||||
| 
						 | 
					@ -35,6 +55,13 @@ AtomSSLConfigService::AtomSSLConfigService() {
 | 
				
			||||||
        cmd_line->GetSwitchValueASCII(switches::kSSLVersionFallbackMin);
 | 
					        cmd_line->GetSwitchValueASCII(switches::kSSLVersionFallbackMin);
 | 
				
			||||||
    config_.version_fallback_min = GetSSLProtocolVersion(version_string);
 | 
					    config_.version_fallback_min = GetSSLProtocolVersion(version_string);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (cmd_line->HasSwitch(switches::kCipherSuiteBlacklist)) {
 | 
				
			||||||
 | 
					    auto cipher_strings = base::SplitString(
 | 
				
			||||||
 | 
					        cmd_line->GetSwitchValueASCII(switches::kCipherSuiteBlacklist),
 | 
				
			||||||
 | 
					        ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
 | 
				
			||||||
 | 
					    config_.disabled_cipher_suites = ParseCipherSuites(cipher_strings);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AtomSSLConfigService::~AtomSSLConfigService() {
 | 
					AtomSSLConfigService::~AtomSSLConfigService() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,7 @@ void TrayIcon::NotifyRightClicked(const gfx::Rect& bounds, int modifiers) {
 | 
				
			||||||
                    OnRightClicked(bounds, modifiers));
 | 
					                    OnRightClicked(bounds, modifiers));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TrayIcon::NotfiyDropFiles(const std::vector<std::string>& files) {
 | 
					void TrayIcon::NotifyDropFiles(const std::vector<std::string>& files) {
 | 
				
			||||||
  FOR_EACH_OBSERVER(TrayIconObserver, observers_, OnDropFiles(files));
 | 
					  FOR_EACH_OBSERVER(TrayIconObserver, observers_, OnDropFiles(files));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,7 +61,7 @@ class TrayIcon {
 | 
				
			||||||
  void NotifyBalloonClosed();
 | 
					  void NotifyBalloonClosed();
 | 
				
			||||||
  void NotifyRightClicked(const gfx::Rect& bounds = gfx::Rect(),
 | 
					  void NotifyRightClicked(const gfx::Rect& bounds = gfx::Rect(),
 | 
				
			||||||
                          int modifiers = 0);
 | 
					                          int modifiers = 0);
 | 
				
			||||||
  void NotfiyDropFiles(const std::vector<std::string>& files);
 | 
					  void NotifyDropFiles(const std::vector<std::string>& files);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  TrayIcon();
 | 
					  TrayIcon();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -265,7 +265,7 @@ const CGFloat kVerticalTitleMargin = 2;
 | 
				
			||||||
    NSArray* files = [pboard propertyListForType:NSFilenamesPboardType];
 | 
					    NSArray* files = [pboard propertyListForType:NSFilenamesPboardType];
 | 
				
			||||||
    for (NSString* file in files)
 | 
					    for (NSString* file in files)
 | 
				
			||||||
      dropFiles.push_back(base::SysNSStringToUTF8(file));
 | 
					      dropFiles.push_back(base::SysNSStringToUTF8(file));
 | 
				
			||||||
    trayIcon_->NotfiyDropFiles(dropFiles);
 | 
					    trayIcon_->NotifyDropFiles(dropFiles);
 | 
				
			||||||
    return YES;
 | 
					    return YES;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return NO;
 | 
					  return NO;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -263,7 +263,9 @@ exports.wrapFsWithAsar = (fs) ->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    info = archive.getFileInfo filePath
 | 
					    info = archive.getFileInfo filePath
 | 
				
			||||||
    notFoundError asarPath, filePath unless info
 | 
					    notFoundError asarPath, filePath unless info
 | 
				
			||||||
    return new Buffer(0) if info.size is 0
 | 
					
 | 
				
			||||||
 | 
					    if info.size is 0
 | 
				
			||||||
 | 
					      return if options then '' else new Buffer(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if info.unpacked
 | 
					    if info.unpacked
 | 
				
			||||||
      realPath = archive.copyFileOut filePath
 | 
					      realPath = archive.copyFileOut filePath
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -116,6 +116,9 @@ const char kRegisterStandardSchemes[] = "register-standard-schemes";
 | 
				
			||||||
// TLS fallback will accept.
 | 
					// TLS fallback will accept.
 | 
				
			||||||
const char kSSLVersionFallbackMin[] = "ssl-version-fallback-min";
 | 
					const char kSSLVersionFallbackMin[] = "ssl-version-fallback-min";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Comma-separated list of SSL cipher suites to disable.
 | 
				
			||||||
 | 
					const char kCipherSuiteBlacklist[] = "cipher-suite-blacklist";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The browser process app model ID
 | 
					// The browser process app model ID
 | 
				
			||||||
const char kAppUserModelId[] = "app-user-model-id";
 | 
					const char kAppUserModelId[] = "app-user-model-id";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,6 +59,7 @@ extern const char kPageVisibility[];
 | 
				
			||||||
extern const char kDisableHttpCache[];
 | 
					extern const char kDisableHttpCache[];
 | 
				
			||||||
extern const char kRegisterStandardSchemes[];
 | 
					extern const char kRegisterStandardSchemes[];
 | 
				
			||||||
extern const char kSSLVersionFallbackMin[];
 | 
					extern const char kSSLVersionFallbackMin[];
 | 
				
			||||||
 | 
					extern const char kCipherSuiteBlacklist[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const char kAppUserModelId[];
 | 
					extern const char kAppUserModelId[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,9 @@
 | 
				
			||||||
## 導引
 | 
					## 導引
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [支援平台](tutorial/supported-platforms.md)
 | 
				
			||||||
* [應用程式發布](tutorial/application-distribution.md)
 | 
					* [應用程式發布](tutorial/application-distribution.md)
 | 
				
			||||||
* [應用程式打包](tutorial/application-packaging.md)
 | 
					* [應用程式打包](tutorial/application-packaging.md)
 | 
				
			||||||
 | 
					* [Mac App Store 上架指引](tutorial/mac-app-store-submission-guide.md)
 | 
				
			||||||
* [使用原生 node 模組](tutorial/using-native-node-modules.md)
 | 
					* [使用原生 node 模組](tutorial/using-native-node-modules.md)
 | 
				
			||||||
* [主行程 Debug](tutorial/debugging-main-process.md)
 | 
					* [主行程 Debug](tutorial/debugging-main-process.md)
 | 
				
			||||||
* [使用 Selenium 和 WebDriver](tutorial/using-selenium-and-webdriver.md)
 | 
					* [使用 Selenium 和 WebDriver](tutorial/using-selenium-and-webdriver.md)
 | 
				
			||||||
| 
						 | 
					@ -64,7 +66,7 @@
 | 
				
			||||||
* [源碼目錄結構](development/source-code-directory-structure.md)
 | 
					* [源碼目錄結構](development/source-code-directory-structure.md)
 | 
				
			||||||
* [與 NW.js (原名node-webkit) 在技術上的差異](development/atom-shell-vs-node-webkit.md)
 | 
					* [與 NW.js (原名node-webkit) 在技術上的差異](development/atom-shell-vs-node-webkit.md)
 | 
				
			||||||
* [構建系統概況](development/build-system-overview.md)
 | 
					* [構建系統概況](development/build-system-overview.md)
 | 
				
			||||||
* [構建步驟 (Mac)](development/build-instructions-mac.md)
 | 
					* [構建步驟 (OS X)](development/build-instructions-osx.md)
 | 
				
			||||||
* [構建步驟 (Windows)](development/build-instructions-windows.md)
 | 
					* [構建步驟 (Windows)](development/build-instructions-windows.md)
 | 
				
			||||||
* [構建步驟 (Linux)](development/build-instructions-linux.md)
 | 
					* [構建步驟 (Linux)](development/build-instructions-linux.md)
 | 
				
			||||||
* [在 debugger 中使用 symbol server](development/setting-up-symbol-server.md)
 | 
					* [在 debugger 中使用 symbol server](development/setting-up-symbol-server.md)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
## 簡介
 | 
					## 簡介
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Electron 可以讓你使用純 JavaScript 提供豐富的原生的 APIs 來創造桌面應用程式。
 | 
					Electron 可以讓你使用純 JavaScript 提供豐富的原生的 APIs 來創造桌面應用程式。
 | 
				
			||||||
你可以把它視為一個 io.js 的變體,專注於桌面應用程式而不是 web 伺服器。
 | 
					你可以把它視為一個 Node.js 的變體,專注於桌面應用程式而不是 web 伺服器。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
這不表示 Electron 是一個用 JavaScript 去綁定 GUI 函式庫。取而代之的,Electron 是使用網頁介面來作為它的 GUI ,
 | 
					這不表示 Electron 是一個用 JavaScript 去綁定 GUI 函式庫。取而代之的,Electron 是使用網頁介面來作為它的 GUI ,
 | 
				
			||||||
所以你可以把它看作是一個被 JavaScript 所控制且精簡化的 Chromium 瀏覽器。
 | 
					所以你可以把它看作是一個被 JavaScript 所控制且精簡化的 Chromium 瀏覽器。
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ Electron 可以讓你使用純 JavaScript 提供豐富的原生的 APIs 來創
 | 
				
			||||||
每一個網頁在 Electron 裏執行各自的行程,被稱為 __渲染行程__。
 | 
					每一個網頁在 Electron 裏執行各自的行程,被稱為 __渲染行程__。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
在一般瀏覽器中,網頁通常會在沙盒環境下運行,並且不允許存取原生資源。然而,
 | 
					在一般瀏覽器中,網頁通常會在沙盒環境下運行,並且不允許存取原生資源。然而,
 | 
				
			||||||
Electron 的用戶擁有在網頁中呼叫 io.js APIs 的能力,允許低級別操作與作業系統的交互作用。
 | 
					Electron 的用戶擁有在網頁中呼叫 Node.js APIs 的能力,允許低級別操作與作業系統的交互作用。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 主行程與渲染行程的區別
 | 
					## 主行程與渲染行程的區別
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,7 @@ app.on('ready', function() {
 | 
				
			||||||
  </head>
 | 
					  </head>
 | 
				
			||||||
  <body>
 | 
					  <body>
 | 
				
			||||||
    <h1>Hello World!</h1>
 | 
					    <h1>Hello World!</h1>
 | 
				
			||||||
    We are using io.js <script>document.write(process.version)</script>
 | 
					    We are using Node.js <script>document.write(process.version)</script>
 | 
				
			||||||
    and Electron <script>document.write(process.versions['electron'])</script>.
 | 
					    and Electron <script>document.write(process.versions['electron'])</script>.
 | 
				
			||||||
  </body>
 | 
					  </body>
 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@
 | 
				
			||||||
* [Source Code Directory Structure](development/source-code-directory-structure.md)
 | 
					* [Source Code Directory Structure](development/source-code-directory-structure.md)
 | 
				
			||||||
* [Technical Differences to NW.js (formerly node-webkit)](development/atom-shell-vs-node-webkit.md)
 | 
					* [Technical Differences to NW.js (formerly node-webkit)](development/atom-shell-vs-node-webkit.md)
 | 
				
			||||||
* [Build System Overview](development/build-system-overview.md)
 | 
					* [Build System Overview](development/build-system-overview.md)
 | 
				
			||||||
* [Build Instructions (Mac)](development/build-instructions-osx.md)
 | 
					* [Build Instructions (OS X)](development/build-instructions-osx.md)
 | 
				
			||||||
* [Build Instructions (Windows)](development/build-instructions-windows.md)
 | 
					* [Build Instructions (Windows)](development/build-instructions-windows.md)
 | 
				
			||||||
* [Build Instructions (Linux)](development/build-instructions-linux.md)
 | 
					* [Build Instructions (Linux)](development/build-instructions-linux.md)
 | 
				
			||||||
* [Setting Up Symbol Server in debugger](development/setting-up-symbol-server.md)
 | 
					* [Setting Up Symbol Server in debugger](development/setting-up-symbol-server.md)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,7 +99,7 @@ You should call `event.preventDefault()` if you want to handle this event.
 | 
				
			||||||
Returns:
 | 
					Returns:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `event` Event
 | 
					* `event` Event
 | 
				
			||||||
* `hasVisibleWindows` Bool
 | 
					* `hasVisibleWindows` Boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Emitted when the application is activated, which usually happens when clicks on
 | 
					Emitted when the application is activated, which usually happens when clicks on
 | 
				
			||||||
the applications's dock icon.
 | 
					the applications's dock icon.
 | 
				
			||||||
| 
						 | 
					@ -280,6 +280,13 @@ Adds `tasks` to the [Tasks][tasks] category of the JumpList on Windows.
 | 
				
			||||||
  consists of two or more icons, set this value to identify the icon. If an
 | 
					  consists of two or more icons, set this value to identify the icon. If an
 | 
				
			||||||
  icon file consists of one icon, this value is 0.
 | 
					  icon file consists of one icon, this value is 0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `app.allowNTLMCredentialsForAllDomains(allow)`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `allow` Boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Dynamically sets whether to always send credentials for HTTP NTLM or Negotiate
 | 
				
			||||||
 | 
					authentication.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### `app.commandLine.appendSwitch(switch[, value])`
 | 
					### `app.commandLine.appendSwitch(switch[, value])`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Append a switch (with optional `value`) to Chromium's command line.
 | 
					Append a switch (with optional `value`) to Chromium's command line.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -92,11 +92,17 @@ Enables net log events to be saved and writes them to `path`.
 | 
				
			||||||
Sets the minimum SSL/TLS version ("tls1", "tls1.1" or "tls1.2") that TLS
 | 
					Sets the minimum SSL/TLS version ("tls1", "tls1.1" or "tls1.2") that TLS
 | 
				
			||||||
fallback will accept.
 | 
					fallback will accept.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## --cipher-suite-blacklist=`cipher_suites`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Specify comma-separated list of SSL cipher suites to disable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## --enable-logging
 | 
					## --enable-logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Prints Chromium's logging into console.
 | 
					Prints Chromium's logging into console.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This switch can not be used in `app.commandLine.appendSwitch` since it is parsed earlier than user's app is loaded.
 | 
					This switch can not be used in `app.commandLine.appendSwitch` since it is parsed
 | 
				
			||||||
 | 
					earlier than user's app is loaded, but you can set the `ELECTRON_ENABLE_LOGGING`
 | 
				
			||||||
 | 
					environment variable to achieve the same effect.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## --v=`log_level`
 | 
					## --v=`log_level`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
# Frameless Window
 | 
					# Frameless Window
 | 
				
			||||||
 | 
					
 | 
				
			||||||
A frameless window is a window that has no [chrome](https://developer.mozilla.org/en-US/docs/Glossary/Chrome), the parts of the window, like toolbars, that are not a part of the webp page. These are options on the [`BrowserWindow`](browser-window.md) class.
 | 
					A frameless window is a window that has no [chrome](https://developer.mozilla.org/en-US/docs/Glossary/Chrome), the parts of the window, like toolbars, that are not a part of the web page. These are options on the [`BrowserWindow`](browser-window.md) class.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Create a frameless window
 | 
					## Create a frameless window
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ var BrowserWindow = require('browser-window');
 | 
				
			||||||
var win = new BrowserWindow({ width: 800, height: 600, frame: false });
 | 
					var win = new BrowserWindow({ width: 800, height: 600, frame: false });
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Alternatives on Mac
 | 
					### Alternatives on OS X
 | 
				
			||||||
 | 
					
 | 
				
			||||||
On Mac OS X 10.10 Yosemite and newer, there's an alternative way to specify
 | 
					On Mac OS X 10.10 Yosemite and newer, there's an alternative way to specify
 | 
				
			||||||
a chromeless window. Instead of setting `frame` to `false` which disables
 | 
					a chromeless window. Instead of setting `frame` to `false` which disables
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,29 +1,29 @@
 | 
				
			||||||
# Mac App Store Submission Guide
 | 
					# Mac App Store Submission Guide
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Since v0.34.0, Electron allows submitting packaged apps to Mac App Store (MAS),
 | 
					Since v0.34.0, Electron allows submitting packaged apps to the Mac App Store 
 | 
				
			||||||
this guide provides information on how to submit your app, and the limitations
 | 
					(MAS). This guide provides information on: how to submit your app and the 
 | 
				
			||||||
of the MAS build.
 | 
					limitations of the MAS build.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## How to submit your app
 | 
					## How to Submit Your App
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Following steps introduces a simple way to submit your app to Mac App Store, but
 | 
					The following steps introduce a simple way to submit your app to Mac App Store. 
 | 
				
			||||||
it doesn't make sure your app gets approved by Apple, you still have to read
 | 
					However, these steps do not ensure sure your app will be approved by Apple; you 
 | 
				
			||||||
apple's [Submitting Your App][submitting-your-app] guide on how to meet Mac
 | 
					still need to read Apple's [Submitting Your App][submitting-your-app] guide on 
 | 
				
			||||||
App Store's requirements.
 | 
					how to meet the Mac App Store requirements.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Get certificate
 | 
					### Get Certificate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To submit your app to Mac App Store, you have to get a certificate from Apple
 | 
					To submit your app to the Mac App Store, you first must get a certificate from 
 | 
				
			||||||
first, you can follow [existing guides][nwjs-guide] on web.
 | 
					Apple. You can follow these [existing guides][nwjs-guide] on web.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Sign your app
 | 
					### Sign Your App
 | 
				
			||||||
 | 
					
 | 
				
			||||||
After getting the certificate, you can package your app by following
 | 
					After getting the certificate from Apple, you can package your app by following
 | 
				
			||||||
[Application Distribution](application-distribution.md), and then sign your app.
 | 
					[Application Distribution](application-distribution.md), and then proceed to 
 | 
				
			||||||
The step is basically the same with other programs, the key is to sign every
 | 
					signing your app. This step is basically the same with other programs, but the 
 | 
				
			||||||
dependency of Electron one by one.
 | 
					key is to sign every dependency of Electron one by one.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
First you need to prepare two entitlements files.
 | 
					First, you need to prepare two entitlements files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`child.plist`:
 | 
					`child.plist`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +53,7 @@ First you need to prepare two entitlements files.
 | 
				
			||||||
</plist>
 | 
					</plist>
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
And then sign your app with following script:
 | 
					And then sign your app with the following script:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
| 
						 | 
					@ -79,33 +79,34 @@ codesign --deep -fs "$APP_KEY" --entitlements child.plist "$FRAMEWORKS_PATH/$APP
 | 
				
			||||||
codesign  -fs "$APP_KEY" --entitlements parent.plist "$APP_PATH"
 | 
					codesign  -fs "$APP_KEY" --entitlements parent.plist "$APP_PATH"
 | 
				
			||||||
productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$APP_PATH"
 | 
					productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$APP_PATH"
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					a
 | 
				
			||||||
 | 
					If you are new to app sandboxing under OS X, you should also read through 
 | 
				
			||||||
 | 
					Apple's [Enabling App Sandbox][enable-app-sandbox] to have a basic idea, then 
 | 
				
			||||||
 | 
					add keys for the permissions needed by your app to the entitlements files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you are new to app sandboxing of OS X, you should also go through Apple's
 | 
					### Upload Your App and Submit for Review
 | 
				
			||||||
[Enabling App Sandbox][enable-app-sandbox] to have a basic idea, and add keys
 | 
					 | 
				
			||||||
for the permissions needed by your app to the entitlements files.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Upload your app and submit for review
 | 
					After signing your app, you can use Application Loader to upload it to iTunes
 | 
				
			||||||
 | 
					Connect for processing, making sure you have [created a record][create-record]
 | 
				
			||||||
After signing your app you can use Application Loader to upload it to iTunes
 | 
					 | 
				
			||||||
Connect for processing, make sure you have [created a record][create-record]
 | 
					 | 
				
			||||||
before uploading. Then you can [submit your app for review][submit-for-review].
 | 
					before uploading. Then you can [submit your app for review][submit-for-review].
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Limitations of MAS build
 | 
					## Limitations of MAS Build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In order to satisfy requirements for app sandboxing, following modules have been
 | 
					In order to satisfy all requirements for app sandboxing, the following modules 
 | 
				
			||||||
disabled in MAS build:
 | 
					have been disabled in the MAS build:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `crash-reporter`
 | 
					* `crash-reporter`
 | 
				
			||||||
* `auto-updater`
 | 
					* `auto-updater`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
and following behaviors have been changed:
 | 
					and the following behaviors have been changed:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Video capture may not work for some machines.
 | 
					* Video capture may not work for some machines.
 | 
				
			||||||
* Certain accessibility features may not work.
 | 
					* Certain accessibility features may not work.
 | 
				
			||||||
* Apps will not be aware of DNS changes.
 | 
					* Apps will not be aware of DNS changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Also due to the usage of app sandboxing, the resources can be accessed by the
 | 
					Also, due to the usage of app sandboxing, the resources which can be accessed by
 | 
				
			||||||
app is strictly limited, you can read [App Sandboxing][app-sandboxing] for more.
 | 
					 the app are strictly limited; you can read [App Sandboxing][app-sandboxing] for
 | 
				
			||||||
 | 
					 more information.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[submitting-your-app]: https://developer.apple.com/library/mac/documentation/IDEs/Conceptual/AppDistributionGuide/SubmittingYourApp/SubmittingYourApp.html
 | 
					[submitting-your-app]: https://developer.apple.com/library/mac/documentation/IDEs/Conceptual/AppDistributionGuide/SubmittingYourApp/SubmittingYourApp.html
 | 
				
			||||||
[nwjs-guide]: https://github.com/nwjs/nw.js/wiki/Mac-App-Store-%28MAS%29-Submission-Guideline#first-steps
 | 
					[nwjs-guide]: https://github.com/nwjs/nw.js/wiki/Mac-App-Store-%28MAS%29-Submission-Guideline#first-steps
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,8 +130,9 @@ Finally the `index.html` is the web page you want to show:
 | 
				
			||||||
  </head>
 | 
					  </head>
 | 
				
			||||||
  <body>
 | 
					  <body>
 | 
				
			||||||
    <h1>Hello World!</h1>
 | 
					    <h1>Hello World!</h1>
 | 
				
			||||||
    We are using Node.js <script>document.write(process.version)</script>
 | 
					    We are using node <script>document.write(process.versions.node)</script>,
 | 
				
			||||||
    and Electron <script>document.write(process.versions['electron'])</script>.
 | 
					    Chrome <script>document.write(process.versions.chrome)</script>,
 | 
				
			||||||
 | 
					    and Electron <script>document.write(process.versions.electron)</script>.
 | 
				
			||||||
  </body>
 | 
					  </body>
 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
| 
						 | 
					@ -188,3 +189,19 @@ it from [here](https://github.com/atom/electron/releases).
 | 
				
			||||||
After you're done writing your app, you can create a distribution by
 | 
					After you're done writing your app, you can create a distribution by
 | 
				
			||||||
following the [Application Distribution](./application-distribution.md) guide
 | 
					following the [Application Distribution](./application-distribution.md) guide
 | 
				
			||||||
and then executing the packaged app.
 | 
					and then executing the packaged app.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Try this Example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Clone and run the code in this tutorial by using the [`atom/electron-quick-start`](https://github.com/atom/electron-quick-start)
 | 
				
			||||||
 | 
					repository.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Note**: Running this requires [Git](https://git-scm.com) and [Node.js](https://nodejs.org/en/download/) (which includes [npm](https://npmjs.org)) on your system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					# Clone the repository
 | 
				
			||||||
 | 
					$ git clone https://github.com/atom/electron-quick-start
 | 
				
			||||||
 | 
					# Go into the repository
 | 
				
			||||||
 | 
					$ cd electron-quick-start
 | 
				
			||||||
 | 
					# Install dependencies and run the app
 | 
				
			||||||
 | 
					$ npm install && npm start
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -303,13 +303,22 @@ describe 'browser-window module', ->
 | 
				
			||||||
        done()
 | 
					        done()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe 'save page', ->
 | 
					  describe 'save page', ->
 | 
				
			||||||
    savePagePath = path.join fixtures, 'save_page.html'
 | 
					    savePageDir = path.join fixtures, 'save_page'
 | 
				
			||||||
 | 
					    savePageHtmlPath = path.join savePageDir, 'save_page.html'
 | 
				
			||||||
 | 
					    savePageJsPath = path.join savePageDir, 'save_page_files', 'test.js'
 | 
				
			||||||
 | 
					    savePageCssPath = path.join savePageDir, 'save_page_files', 'test.css'
 | 
				
			||||||
    it 'should save page', (done) ->
 | 
					    it 'should save page', (done) ->
 | 
				
			||||||
      w.webContents.on 'did-finish-load', ->
 | 
					      w.webContents.on 'did-finish-load', ->
 | 
				
			||||||
        w.webContents.savePage savePagePath, 'HTMLComplete', (error) ->
 | 
					        w.webContents.savePage savePageHtmlPath, 'HTMLComplete', (error) ->
 | 
				
			||||||
          assert.equal error, null
 | 
					          assert.equal error, null
 | 
				
			||||||
          assert fs.existsSync savePagePath
 | 
					          assert fs.existsSync savePageHtmlPath
 | 
				
			||||||
          fs.unlinkSync savePagePath
 | 
					          assert fs.existsSync savePageJsPath
 | 
				
			||||||
 | 
					          assert fs.existsSync savePageCssPath
 | 
				
			||||||
 | 
					          fs.unlinkSync savePageCssPath
 | 
				
			||||||
 | 
					          fs.unlinkSync savePageJsPath
 | 
				
			||||||
 | 
					          fs.unlinkSync savePageHtmlPath
 | 
				
			||||||
 | 
					          fs.rmdirSync path.join savePageDir, 'save_page_files'
 | 
				
			||||||
 | 
					          fs.rmdirSync savePageDir
 | 
				
			||||||
          done()
 | 
					          done()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      w.loadUrl "file://#{fixtures}/api/blank.html"
 | 
					      w.loadUrl "file://#{fixtures}/pages/save_page/index.html"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								spec/fixtures/pages/save_page/index.html
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								spec/fixtures/pages/save_page/index.html
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="test.js"></script>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="test.css"></script>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										1
									
								
								spec/fixtures/pages/save_page/test.css
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								spec/fixtures/pages/save_page/test.css
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					h1 { }
 | 
				
			||||||
							
								
								
									
										1
									
								
								spec/fixtures/pages/save_page/test.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								spec/fixtures/pages/save_page/test.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					console.log('save_page');
 | 
				
			||||||
							
								
								
									
										2
									
								
								vendor/brightray
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/brightray
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
Subproject commit fe2dd437c9ef7877bf9d454db8ae401965cd7cb0
 | 
					Subproject commit f1cbfd1d457f9b40bca23a2f30948a093d6048a9
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue