Browse Source

Merge pull request #8406 from electron/use_gn-chrome54

Use gn chrome54
Kevin Sawicki 8 years ago
parent
commit
22b21d04bd
79 changed files with 530 additions and 428 deletions
  1. 1 1
      .node-version
  2. 3 2
      atom/app/node_main.cc
  3. 17 4
      atom/browser/api/atom_api_app.cc
  4. 2 2
      atom/browser/api/atom_api_app.h
  5. 3 2
      atom/browser/api/atom_api_download_item.cc
  6. 4 4
      atom/browser/api/atom_api_power_save_blocker.cc
  7. 2 2
      atom/browser/api/atom_api_session.cc
  8. 3 1
      atom/browser/api/atom_api_tray.cc
  9. 4 9
      atom/browser/api/atom_api_web_contents.cc
  10. 4 2
      atom/browser/api/atom_api_window.cc
  11. 5 5
      atom/browser/atom_access_token_store.cc
  12. 3 3
      atom/browser/atom_access_token_store.h
  13. 1 1
      atom/browser/atom_blob_reader.cc
  14. 5 25
      atom/browser/atom_browser_client.cc
  15. 3 4
      atom/browser/atom_browser_client.h
  16. 23 1
      atom/browser/atom_browser_main_parts.cc
  17. 109 53
      atom/browser/atom_permission_manager.cc
  18. 15 13
      atom/browser/atom_permission_manager.h
  19. 4 9
      atom/browser/atom_security_state_model_client.cc
  20. 2 2
      atom/browser/browser.cc
  21. 4 11
      atom/browser/common_web_contents_delegate.cc
  22. 6 2
      atom/browser/lib/bluetooth_chooser.cc
  23. 6 2
      atom/browser/lib/bluetooth_chooser.h
  24. 3 2
      atom/browser/native_window.cc
  25. 9 9
      atom/browser/net/atom_network_delegate.cc
  26. 5 5
      atom/browser/net/atom_url_request_job_factory.cc
  27. 6 4
      atom/browser/node_debugger.cc
  28. 17 40
      atom/browser/osr/osr_render_widget_host_view.cc
  29. 10 6
      atom/browser/osr/osr_render_widget_host_view.h
  30. 4 9
      atom/browser/osr/osr_render_widget_host_view_mac.mm
  31. 14 0
      atom/browser/osr/osr_web_contents_view.cc
  32. 1 0
      atom/browser/osr/osr_web_contents_view.h
  33. 1 1
      atom/browser/ui/accelerator_util.cc
  34. 1 1
      atom/browser/ui/atom_menu_model.cc
  35. 1 1
      atom/browser/ui/atom_menu_model.h
  36. 1 1
      atom/browser/ui/views/submenu_button.cc
  37. 2 1
      atom/browser/ui/win/notify_icon_host.cc
  38. 1 1
      atom/browser/web_contents_permission_helper.cc
  39. 0 6
      atom/browser/web_contents_preferences.cc
  40. 4 4
      atom/browser/web_view_manager.cc
  41. 4 4
      atom/common/api/atom_api_asar.cc
  42. 1 1
      atom/common/chrome_version.h
  43. 4 5
      atom/common/native_mate_converters/blink_converter.cc
  44. 8 16
      atom/common/node_bindings.cc
  45. 1 1
      atom/common/node_bindings.h
  46. 0 13
      atom/renderer/api/atom_api_spell_check_client.cc
  47. 0 4
      atom/renderer/api/atom_api_spell_check_client.h
  48. 5 0
      atom/renderer/api/atom_api_web_frame.cc
  49. 1 0
      atom/renderer/api/atom_api_web_frame.h
  50. 2 2
      atom/renderer/atom_renderer_client.cc
  51. 2 2
      atom/renderer/atom_sandboxed_renderer_client.cc
  52. 2 2
      atom/renderer/guest_view_container.cc
  53. 2 1
      atom/utility/atom_content_utility_client.cc
  54. 11 4
      chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc
  55. 7 4
      chromium_src/chrome/browser/printing/print_job.cc
  56. 2 1
      chromium_src/chrome/browser/printing/print_job_worker.cc
  57. 2 1
      chromium_src/chrome/browser/printing/print_view_manager_base.cc
  58. 1 1
      chromium_src/chrome/browser/renderer_host/pepper/pepper_broker_message_filter.cc
  59. 3 3
      chromium_src/chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc
  60. 1 1
      chromium_src/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc
  61. 55 73
      chromium_src/chrome/renderer/printing/print_web_view_helper.cc
  62. 8 9
      chromium_src/chrome/renderer/printing/print_web_view_helper.h
  63. 3 3
      chromium_src/chrome/renderer/printing/print_web_view_helper_linux.cc
  64. 3 3
      chromium_src/chrome/renderer/printing/print_web_view_helper_mac.mm
  65. 3 3
      chromium_src/chrome/renderer/printing/print_web_view_helper_pdf_win.cc
  66. 8 2
      common.gypi
  67. 2 10
      electron.gyp
  68. 1 0
      lib/browser/api/web-contents.js
  69. 1 1
      script/lib/config.py
  70. 2 0
      spec/api-browser-window-spec.js
  71. 1 1
      spec/api-debugger-spec.js
  72. 29 1
      spec/api-session-spec.js
  73. 17 0
      spec/api-web-contents-spec.js
  74. 5 0
      spec/fixtures/pages/permissions/midi-sysex.html
  75. 1 1
      spec/fixtures/pages/permissions/midi.html
  76. 20 1
      spec/webview-spec.js
  77. 1 1
      vendor/brightray
  78. 1 1
      vendor/crashpad
  79. 1 1
      vendor/node

+ 1 - 1
.node-version

@@ -1 +1 @@
-v6.3.0
+v7.4.0

+ 3 - 2
atom/app/node_main.cc

@@ -48,14 +48,15 @@ int NodeMain(int argc, char *argv[]) {
     const char** exec_argv;
     node::Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv);
 
+    node::IsolateData isolate_data(gin_env.isolate(), loop);
     node::Environment* env = node::CreateEnvironment(
-        gin_env.isolate(), loop, gin_env.context(), argc, argv,
+        &isolate_data, gin_env.context(), argc, argv,
         exec_argc, exec_argv);
 
     // Start our custom debugger implementation.
     NodeDebugger node_debugger(gin_env.isolate());
     if (node_debugger.IsRunning())
-      env->AssignToContext(v8::Debug::GetDebugContext());
+      env->AssignToContext(v8::Debug::GetDebugContext(gin_env.isolate()));
 
 #if defined(OS_WIN)
     mate::Dictionary process(gin_env.isolate(), env->process_object());

+ 17 - 4
atom/browser/api/atom_api_app.cc

@@ -312,8 +312,21 @@ struct Converter<Browser::LoginItemSettings> {
     return dict.GetHandle();
   }
 };
-}  // namespace mate
 
+template<>
+struct Converter<content::CertificateRequestResultType> {
+  static bool FromV8(v8::Isolate* isolate, v8::Local<v8::Value> val,
+                     content::CertificateRequestResultType* out) {
+    bool b;
+    if (!ConvertFromV8(isolate, val, &b))
+      return false;
+    *out = b ? content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE :
+               content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL;
+    return true;
+  }
+};
+
+}  // namespace mate
 
 namespace atom {
 
@@ -573,8 +586,8 @@ void App::AllowCertificateError(
     bool overridable,
     bool strict_enforcement,
     bool expired_previous_decision,
-    const base::Callback<void(bool)>& callback,
-    content::CertificateRequestResultType* request) {
+    const base::Callback<void(content::CertificateRequestResultType)>&
+        callback) {
   v8::Locker locker(isolate());
   v8::HandleScope handle_scope(isolate());
   bool prevent_default = Emit("certificate-error",
@@ -586,7 +599,7 @@ void App::AllowCertificateError(
 
   // Deny the certificate by default.
   if (!prevent_default)
-    *request = content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY;
+    callback.Run(content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY);
 }
 
 void App::SelectClientCertificate(

+ 2 - 2
atom/browser/api/atom_api_app.h

@@ -98,8 +98,8 @@ class App : public AtomBrowserClient::Delegate,
       bool overridable,
       bool strict_enforcement,
       bool expired_previous_decision,
-      const base::Callback<void(bool)>& callback,
-      content::CertificateRequestResultType* request) override;
+      const base::Callback<void(content::CertificateRequestResultType)>&
+          callback) override;
   void SelectClientCertificate(
       content::WebContents* web_contents,
       net::SSLCertRequestInfo* cert_request_info,

+ 3 - 2
atom/browser/api/atom_api_download_item.cc

@@ -10,8 +10,8 @@
 #include "atom/common/native_mate_converters/callback.h"
 #include "atom/common/native_mate_converters/file_path_converter.h"
 #include "atom/common/native_mate_converters/gurl_converter.h"
-#include "base/message_loop/message_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "native_mate/dictionary.h"
 #include "net/base/filename_util.h"
 
@@ -80,7 +80,8 @@ void DownloadItem::OnDownloadUpdated(content::DownloadItem* item) {
     Emit("done", item->GetState());
 
     // Destroy the item once item is downloaded.
-    base::MessageLoop::current()->PostTask(FROM_HERE, GetDestroyClosure());
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, GetDestroyClosure());
   } else {
     Emit("updated", item->GetState());
   }

+ 4 - 4
atom/browser/api/atom_api_power_save_blocker.cc

@@ -11,6 +11,8 @@
 
 #include "atom/common/node_includes.h"
 
+using content::BrowserThread;
+
 namespace mate {
 
 template<>
@@ -76,10 +78,8 @@ void PowerSaveBlocker::UpdatePowerSaveBlocker() {
             new_blocker_type,
             device::PowerSaveBlocker::kReasonOther,
             ATOM_PRODUCT_NAME,
-            content::BrowserThread::GetMessageLoopProxyForThread(
-                content::BrowserThread::UI),
-            content::BrowserThread::GetMessageLoopProxyForThread(
-                content::BrowserThread::FILE)));
+            BrowserThread::GetTaskRunnerForThread(BrowserThread::UI),
+            BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE)));
     power_save_blocker_.swap(new_blocker);
     current_blocker_type_ = new_blocker_type;
   }

+ 2 - 2
atom/browser/api/atom_api_session.cc

@@ -254,8 +254,8 @@ class ResolveProxyHelper {
 
     // Start the request.
     int result = proxy_service->ResolveProxy(
-        url, "GET", net::LOAD_NORMAL, &proxy_info_, completion_callback,
-        &pac_req_, nullptr, net::BoundNetLog());
+        url, "GET", &proxy_info_, completion_callback, &pac_req_, nullptr,
+        net::BoundNetLog());
 
     // Completed synchronously.
     if (result != net::ERR_IO_PENDING)

+ 3 - 1
atom/browser/api/atom_api_tray.cc

@@ -13,6 +13,7 @@
 #include "atom/common/native_mate_converters/image_converter.h"
 #include "atom/common/native_mate_converters/string16_converter.h"
 #include "atom/common/node_includes.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "native_mate/constructor.h"
 #include "native_mate/dictionary.h"
 #include "ui/gfx/image/image.h"
@@ -71,7 +72,8 @@ Tray::Tray(v8::Isolate* isolate, v8::Local<v8::Object> wrapper,
 
 Tray::~Tray() {
   // Destroy the native tray in next tick.
-  base::MessageLoop::current()->DeleteSoon(FROM_HERE, tray_icon_.release());
+  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(
+      FROM_HERE, tray_icon_.release());
 }
 
 // static

+ 4 - 9
atom/browser/api/atom_api_web_contents.cc

@@ -40,6 +40,7 @@
 #include "atom/common/native_mate_converters/value_converter.h"
 #include "atom/common/options_switches.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "brightray/browser/inspectable_web_contents.h"
 #include "brightray/browser/inspectable_web_contents_view.h"
 #include "chrome/browser/printing/print_preview_message_handler.h"
@@ -830,7 +831,8 @@ void WebContents::WebContentsDestroyed() {
   Emit("destroyed");
 
   // Destroy the native class in next tick.
-  base::MessageLoop::current()->PostTask(FROM_HERE, GetDestroyClosure());
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, GetDestroyClosure());
 }
 
 void WebContents::NavigationEntryCommitted(
@@ -975,10 +977,6 @@ std::string WebContents::GetUserAgent() {
   return web_contents()->GetUserAgentOverride();
 }
 
-void WebContents::InsertCSS(const std::string& css) {
-  web_contents()->InsertCSS(css);
-}
-
 bool WebContents::SavePage(const base::FilePath& full_file_path,
                            const content::SavePageType& save_type,
                            const SavePageHandler::SavePageCallback& callback) {
@@ -1064,9 +1062,7 @@ void WebContents::InspectElement(int x, int y) {
 
   if (!managed_web_contents()->GetDevToolsWebContents())
     OpenDevTools(nullptr);
-  scoped_refptr<content::DevToolsAgentHost> agent(
-    content::DevToolsAgentHost::GetOrCreateFor(web_contents()));
-  agent->InspectElement(x, y);
+  managed_web_contents()->InspectElement(x, y);
 }
 
 void WebContents::InspectServiceWorker() {
@@ -1558,7 +1554,6 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
       .SetMethod("isCrashed", &WebContents::IsCrashed)
       .SetMethod("setUserAgent", &WebContents::SetUserAgent)
       .SetMethod("getUserAgent", &WebContents::GetUserAgent)
-      .SetMethod("insertCSS", &WebContents::InsertCSS)
       .SetMethod("savePage", &WebContents::SavePage)
       .SetMethod("openDevTools", &WebContents::OpenDevTools)
       .SetMethod("closeDevTools", &WebContents::CloseDevTools)

+ 4 - 2
atom/browser/api/atom_api_window.cc

@@ -17,6 +17,7 @@
 #include "atom/common/native_mate_converters/string16_converter.h"
 #include "atom/common/options_switches.h"
 #include "base/command_line.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_switches.h"
 #include "native_mate/constructor.h"
@@ -152,7 +153,7 @@ Window::~Window() {
 
   // Destroy the native window in next tick because the native code might be
   // iterating all windows.
-  base::MessageLoop::current()->DeleteSoon(FROM_HERE, window_.release());
+  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, window_.release());
 }
 
 void Window::WillCloseWindow(bool* prevent_default) {
@@ -185,7 +186,8 @@ void Window::OnWindowClosed() {
   RemoveFromParentChildWindows();
 
   // Destroy the native class when window is closed.
-  base::MessageLoop::current()->PostTask(FROM_HERE, GetDestroyClosure());
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, GetDestroyClosure());
 }
 
 void Window::OnWindowBlur() {

+ 5 - 5
atom/browser/atom_access_token_store.cc

@@ -11,7 +11,7 @@
 #include "atom/common/google_api_key.h"
 #include "base/environment.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/geolocation_provider.h"
+#include "device/geolocation/geolocation_provider.h"
 
 using content::BrowserThread;
 
@@ -24,7 +24,7 @@ namespace internal {
 class TokenLoadingJob : public base::RefCountedThreadSafe<TokenLoadingJob> {
  public:
   explicit TokenLoadingJob(
-      const content::AccessTokenStore::LoadAccessTokensCallback& callback)
+      const device::AccessTokenStore::LoadAccessTokensCallback& callback)
       : callback_(callback), request_context_getter_(nullptr) {}
 
   void Run(AtomBrowserContext* browser_context) {
@@ -47,7 +47,7 @@ class TokenLoadingJob : public base::RefCountedThreadSafe<TokenLoadingJob> {
     // Equivalent to access_token_map[kGeolocationProviderURL].
     // Somehow base::string16 is causing compilation errors when used in a pair
     // of std::map on Linux, this can work around it.
-    content::AccessTokenStore::AccessTokenMap access_token_map;
+    device::AccessTokenStore::AccessTokenMap access_token_map;
     std::pair<GURL, base::string16> token_pair;
     token_pair.first = GURL(GOOGLEAPIS_ENDPOINT + api_key_);
     access_token_map.insert(token_pair);
@@ -55,7 +55,7 @@ class TokenLoadingJob : public base::RefCountedThreadSafe<TokenLoadingJob> {
     callback_.Run(access_token_map, request_context_getter_);
   }
 
-  content::AccessTokenStore::LoadAccessTokensCallback callback_;
+  device::AccessTokenStore::LoadAccessTokensCallback callback_;
   net::URLRequestContextGetter* request_context_getter_;
   std::string api_key_;
 };
@@ -64,7 +64,7 @@ class TokenLoadingJob : public base::RefCountedThreadSafe<TokenLoadingJob> {
 
 AtomAccessTokenStore::AtomAccessTokenStore() {
   browser_context_ = AtomBrowserContext::From("", false);
-  content::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices();
+  device::GeolocationProvider::GetInstance()->UserDidOptIntoLocationServices();
 }
 
 AtomAccessTokenStore::~AtomAccessTokenStore() {

+ 3 - 3
atom/browser/atom_access_token_store.h

@@ -5,7 +5,7 @@
 #ifndef ATOM_BROWSER_ATOM_ACCESS_TOKEN_STORE_H_
 #define ATOM_BROWSER_ATOM_ACCESS_TOKEN_STORE_H_
 
-#include "content/public/browser/access_token_store.h"
+#include "device/geolocation/access_token_store.h"
 
 namespace atom {
 
@@ -15,12 +15,12 @@ namespace internal {
 class TokenLoadingJob;
 }
 
-class AtomAccessTokenStore : public content::AccessTokenStore {
+class AtomAccessTokenStore : public device::AccessTokenStore {
  public:
   AtomAccessTokenStore();
   ~AtomAccessTokenStore();
 
-  // content::AccessTokenStore:
+  // device::AccessTokenStore:
   void LoadAccessTokens(
       const LoadAccessTokensCallback& callback) override;
   void SaveAccessToken(const GURL& server_url,

+ 1 - 1
atom/browser/atom_blob_reader.cc

@@ -73,7 +73,7 @@ void AtomBlobReader::StartReading(
 
   auto blob_reader = blob_data_handle->CreateReader(
       file_system_context_.get(),
-      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE).get());
+      BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE).get());
   BlobReadHelper* blob_read_helper =
       new BlobReadHelper(std::move(blob_reader), callback);
   blob_read_helper->Read();

+ 5 - 25
atom/browser/atom_browser_client.cc

@@ -10,7 +10,6 @@
 
 #include "atom/browser/api/atom_api_app.h"
 #include "atom/browser/api/atom_api_protocol.h"
-#include "atom/browser/atom_access_token_store.h"
 #include "atom/browser/atom_browser_context.h"
 #include "atom/browser/atom_browser_main_parts.h"
 #include "atom/browser/atom_quota_permission_context.h"
@@ -33,7 +32,6 @@
 #include "content/common/resource_request_body_impl.h"
 #include "content/public/browser/browser_ppapi_host.h"
 #include "content/public/browser/client_certificate_delegate.h"
-#include "content/public/browser/geolocation_delegate.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/resource_dispatcher_host.h"
@@ -56,19 +54,6 @@ bool g_suppress_renderer_process_restart = false;
 // Custom schemes to be registered to handle service worker.
 std::string g_custom_service_worker_schemes = "";
 
-// A provider of Geolocation services to override AccessTokenStore.
-class AtomGeolocationDelegate : public content::GeolocationDelegate {
- public:
-  AtomGeolocationDelegate() = default;
-
-  content::AccessTokenStore* CreateAccessTokenStore() final {
-    return new AtomAccessTokenStore();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AtomGeolocationDelegate);
-};
-
 void Noop(scoped_refptr<content::SiteInstance>) {
 }
 
@@ -93,7 +78,7 @@ AtomBrowserClient::~AtomBrowserClient() {
 content::WebContents* AtomBrowserClient::GetWebContentsFromProcessID(
     int process_id) {
   // If the process is a pending process, we should use the old one.
-  if (ContainsKey(pending_processes_, process_id))
+  if (base::ContainsKey(pending_processes_, process_id))
     process_id = pending_processes_[process_id];
 
   // Certain render process will be created with no associated render view,
@@ -160,11 +145,6 @@ content::SpeechRecognitionManagerDelegate*
   return new AtomSpeechRecognitionManagerDelegate;
 }
 
-content::GeolocationDelegate*
-AtomBrowserClient::CreateGeolocationDelegate() {
-  return new AtomGeolocationDelegate();
-}
-
 void AtomBrowserClient::OverrideWebkitPrefs(
     content::RenderViewHost* host, content::WebPreferences* prefs) {
   prefs->javascript_enabled = true;
@@ -283,13 +263,13 @@ void AtomBrowserClient::AllowCertificateError(
     bool overridable,
     bool strict_enforcement,
     bool expired_previous_decision,
-    const base::Callback<void(bool)>& callback,
-    content::CertificateRequestResultType* request) {
+    const base::Callback<void(content::CertificateRequestResultType)>&
+        callback) {
   if (delegate_) {
     delegate_->AllowCertificateError(
         web_contents, cert_error, ssl_info, request_url,
         resource_type, overridable, strict_enforcement,
-        expired_previous_decision, callback, request);
+        expired_previous_decision, callback);
   }
 }
 
@@ -315,9 +295,9 @@ bool AtomBrowserClient::CanCreateWindow(
     const GURL& opener_top_level_frame_url,
     const GURL& source_origin,
     WindowContainerType container_type,
-    const std::string& frame_name,
     const GURL& target_url,
     const content::Referrer& referrer,
+    const std::string& frame_name,
     WindowOpenDisposition disposition,
     const blink::WebWindowFeatures& features,
     const std::vector<base::string16>& additional_features,

+ 3 - 4
atom/browser/atom_browser_client.h

@@ -50,7 +50,6 @@ class AtomBrowserClient : public brightray::BrowserClient,
   void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
   content::SpeechRecognitionManagerDelegate*
       CreateSpeechRecognitionManagerDelegate() override;
-  content::GeolocationDelegate* CreateGeolocationDelegate() override;
   void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
                            content::WebPreferences* prefs) override;
   std::string GetApplicationLocale() override;
@@ -72,8 +71,8 @@ class AtomBrowserClient : public brightray::BrowserClient,
       bool overridable,
       bool strict_enforcement,
       bool expired_previous_decision,
-      const base::Callback<void(bool)>& callback,
-      content::CertificateRequestResultType* request) override;
+      const base::Callback<void(content::CertificateRequestResultType)>&
+          callback) override;
   void SelectClientCertificate(
       content::WebContents* web_contents,
       net::SSLCertRequestInfo* cert_request_info,
@@ -84,9 +83,9 @@ class AtomBrowserClient : public brightray::BrowserClient,
       const GURL& opener_top_level_frame_url,
       const GURL& source_origin,
       WindowContainerType container_type,
-      const std::string& frame_name,
       const GURL& target_url,
       const content::Referrer& referrer,
+      const std::string& frame_name,
       WindowOpenDisposition disposition,
       const blink::WebWindowFeatures& features,
       const std::vector<base::string16>& additional_features,

+ 23 - 1
atom/browser/atom_browser_main_parts.cc

@@ -5,6 +5,7 @@
 #include "atom/browser/atom_browser_main_parts.h"
 
 #include "atom/browser/api/trackable_object.h"
+#include "atom/browser/atom_access_token_store.h"
 #include "atom/browser/atom_browser_client.h"
 #include "atom/browser/atom_browser_context.h"
 #include "atom/browser/bridge_task_runner.h"
@@ -18,6 +19,8 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "content/public/browser/child_process_security_policy.h"
+#include "device/geolocation/geolocation_delegate.h"
+#include "device/geolocation/geolocation_provider.h"
 #include "v8/include/v8-debug.h"
 
 #if defined(USE_X11)
@@ -27,11 +30,28 @@
 
 namespace atom {
 
+namespace {
+
+// A provider of Geolocation services to override AccessTokenStore.
+class AtomGeolocationDelegate : public device::GeolocationDelegate {
+ public:
+  AtomGeolocationDelegate() = default;
+
+  scoped_refptr<device::AccessTokenStore> CreateAccessTokenStore() final {
+    return new AtomAccessTokenStore();
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AtomGeolocationDelegate);
+};
+
 template<typename T>
 void Erase(T* container, typename T::iterator iter) {
   container->erase(iter);
 }
 
+}  // namespace
+
 // static
 AtomBrowserMainParts* AtomBrowserMainParts::self_ = nullptr;
 
@@ -115,7 +135,7 @@ void AtomBrowserMainParts::PostEarlyInitialization() {
 
   // Make sure node can get correct environment when debugging.
   if (node_debugger_->IsRunning())
-    env->AssignToContext(v8::Debug::GetDebugContext());
+    env->AssignToContext(v8::Debug::GetDebugContext(js_env_->isolate()));
 
   // Add Electron extended APIs.
   atom_bindings_->BindTo(js_env_->isolate(), env->process_object());
@@ -171,6 +191,8 @@ void AtomBrowserMainParts::PostMainMessageLoopStart() {
 #if defined(OS_POSIX)
   HandleShutdownSignals();
 #endif
+  device::GeolocationProvider::SetGeolocationDelegate(
+      new AtomGeolocationDelegate());
 }
 
 void AtomBrowserMainParts::PostMainMessageLoopRun() {

+ 109 - 53
atom/browser/atom_permission_manager.cc

@@ -26,10 +26,52 @@ bool WebContentsDestroyed(int process_id) {
   return contents->IsBeingDestroyed();
 }
 
+void PermissionRequestResponseCallbackWrapper(
+    const AtomPermissionManager::StatusCallback& callback,
+    const std::vector<blink::mojom::PermissionStatus>& vector) {
+  callback.Run(vector[0]);
+}
+
 }  // namespace
 
-AtomPermissionManager::AtomPermissionManager()
-    : request_id_(0) {
+class AtomPermissionManager::PendingRequest {
+ public:
+  PendingRequest(content::RenderFrameHost* render_frame_host,
+                 const std::vector<content::PermissionType>& permissions,
+                 const StatusesCallback& callback)
+      : render_process_id_(render_frame_host->GetProcess()->GetID()),
+        callback_(callback),
+        results_(permissions.size(), blink::mojom::PermissionStatus::DENIED),
+        remaining_results_(permissions.size()) {}
+
+  void SetPermissionStatus(int permission_id,
+                           blink::mojom::PermissionStatus status) {
+    DCHECK(!IsComplete());
+
+    results_[permission_id] = status;
+    --remaining_results_;
+  }
+
+  int render_process_id() const {
+    return render_process_id_;
+  }
+
+  bool IsComplete() const {
+    return remaining_results_ == 0;
+  }
+
+  void RunCallback() const {
+    callback_.Run(results_);
+  }
+
+ private:
+  int render_process_id_;
+  const StatusesCallback callback_;
+  std::vector<blink::mojom::PermissionStatus> results_;
+  size_t remaining_results_;
+};
+
+AtomPermissionManager::AtomPermissionManager() {
 }
 
 AtomPermissionManager::~AtomPermissionManager() {
@@ -37,12 +79,14 @@ AtomPermissionManager::~AtomPermissionManager() {
 
 void AtomPermissionManager::SetPermissionRequestHandler(
     const RequestHandler& handler) {
-  if (handler.is_null() && !pending_requests_.empty()) {
-    for (const auto& request : pending_requests_) {
-      if (!WebContentsDestroyed(request.second.render_process_id))
-        request.second.callback.Run(blink::mojom::PermissionStatus::DENIED);
+  if (handler.is_null() && !pending_requests_.IsEmpty()) {
+    for (PendingRequestsMap::const_iterator iter(&pending_requests_);
+         !iter.IsAtEnd(); iter.Advance()) {
+      auto request = iter.GetCurrentValue();
+      if (!WebContentsDestroyed(request->render_process_id()))
+        request->RunCallback();
     }
-    pending_requests_.clear();
+    pending_requests_.Clear();
   }
   request_handler_ = handler;
 }
@@ -51,71 +95,83 @@ int AtomPermissionManager::RequestPermission(
     content::PermissionType permission,
     content::RenderFrameHost* render_frame_host,
     const GURL& requesting_origin,
-    const ResponseCallback& response_callback) {
-  int process_id = render_frame_host->GetProcess()->GetID();
-
-  if (permission == content::PermissionType::MIDI_SYSEX) {
-    content::ChildProcessSecurityPolicy::GetInstance()->
-        GrantSendMidiSysExMessage(process_id);
-  }
-
-  if (!request_handler_.is_null()) {
-    auto web_contents =
-        content::WebContents::FromRenderFrameHost(render_frame_host);
-    ++request_id_;
-    auto callback = base::Bind(&AtomPermissionManager::OnPermissionResponse,
-                               base::Unretained(this),
-                               request_id_,
-                               requesting_origin,
-                               response_callback);
-    pending_requests_[request_id_] = { process_id, callback };
-    request_handler_.Run(web_contents, permission, callback);
-    return request_id_;
-  }
-
-  response_callback.Run(blink::mojom::PermissionStatus::GRANTED);
-  return kNoPendingOperation;
+    bool user_gesture,
+    const StatusCallback& response_callback) {
+  return RequestPermissions(
+      std::vector<content::PermissionType>(1, permission),
+      render_frame_host,
+      requesting_origin,
+      user_gesture,
+      base::Bind(&PermissionRequestResponseCallbackWrapper, response_callback));
 }
 
 int AtomPermissionManager::RequestPermissions(
     const std::vector<content::PermissionType>& permissions,
     content::RenderFrameHost* render_frame_host,
     const GURL& requesting_origin,
-    const base::Callback<void(
-    const std::vector<blink::mojom::PermissionStatus>&)>& callback) {
-  // FIXME(zcbenz): Just ignore multiple permissions request for now.
-  std::vector<blink::mojom::PermissionStatus> permissionStatuses;
-  for (auto permission : permissions) {
+    bool user_gesture,
+    const StatusesCallback& response_callback) {
+  if (permissions.empty()) {
+    response_callback.Run(std::vector<blink::mojom::PermissionStatus>());
+    return kNoPendingOperation;
+  }
+
+  if (request_handler_.is_null()) {
+    std::vector<blink::mojom::PermissionStatus> statuses;
+    for (auto permission : permissions) {
+      if (permission == content::PermissionType::MIDI_SYSEX) {
+        content::ChildProcessSecurityPolicy::GetInstance()->
+            GrantSendMidiSysExMessage(render_frame_host->GetProcess()->GetID());
+      }
+      statuses.push_back(blink::mojom::PermissionStatus::GRANTED);
+    }
+    response_callback.Run(statuses);
+    return kNoPendingOperation;
+  }
+
+  auto web_contents =
+      content::WebContents::FromRenderFrameHost(render_frame_host);
+  int request_id = pending_requests_.Add(new PendingRequest(
+      render_frame_host, permissions, response_callback));
+
+  for (size_t i = 0; i < permissions.size(); ++i) {
+    auto permission = permissions[i];
     if (permission == content::PermissionType::MIDI_SYSEX) {
       content::ChildProcessSecurityPolicy::GetInstance()->
           GrantSendMidiSysExMessage(render_frame_host->GetProcess()->GetID());
     }
-    permissionStatuses.push_back(blink::mojom::PermissionStatus::GRANTED);
+    const auto callback =
+        base::Bind(&AtomPermissionManager::OnPermissionResponse,
+                   base::Unretained(this), request_id, i);
+    request_handler_.Run(web_contents, permission, callback);
   }
-  callback.Run(permissionStatuses);
-  return kNoPendingOperation;
+
+  return request_id;
 }
 
 void AtomPermissionManager::OnPermissionResponse(
     int request_id,
-    const GURL& origin,
-    const ResponseCallback& callback,
+    int permission_id,
     blink::mojom::PermissionStatus status) {
-  auto request = pending_requests_.find(request_id);
-  if (request != pending_requests_.end()) {
-    if (!WebContentsDestroyed(request->second.render_process_id))
-      callback.Run(status);
-    pending_requests_.erase(request);
+  auto pending_request = pending_requests_.Lookup(request_id);
+  if (!pending_request)
+    return;
+
+  pending_request->SetPermissionStatus(permission_id, status);
+  if (pending_request->IsComplete()) {
+    pending_request->RunCallback();
+    pending_requests_.Remove(request_id);
   }
 }
 
 void AtomPermissionManager::CancelPermissionRequest(int request_id) {
-  auto request = pending_requests_.find(request_id);
-  if (request != pending_requests_.end()) {
-    if (!WebContentsDestroyed(request->second.render_process_id))
-      request->second.callback.Run(blink::mojom::PermissionStatus::DENIED);
-    pending_requests_.erase(request);
-  }
+  auto pending_request = pending_requests_.Lookup(request_id);
+  if (!pending_request)
+    return;
+
+  if (!WebContentsDestroyed(pending_request->render_process_id()))
+    pending_request->RunCallback();
+  pending_requests_.Remove(request_id);
 }
 
 void AtomPermissionManager::ResetPermission(
@@ -141,7 +197,7 @@ int AtomPermissionManager::SubscribePermissionStatusChange(
     content::PermissionType permission,
     const GURL& requesting_origin,
     const GURL& embedding_origin,
-    const ResponseCallback& callback) {
+    const StatusCallback& callback) {
   return -1;
 }
 

+ 15 - 13
atom/browser/atom_permission_manager.h

@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/callback.h"
+#include "base/id_map.h"
 #include "content/public/browser/permission_manager.h"
 
 namespace content {
@@ -22,12 +23,14 @@ class AtomPermissionManager : public content::PermissionManager {
   AtomPermissionManager();
   ~AtomPermissionManager() override;
 
-  using ResponseCallback =
+  using StatusCallback =
       base::Callback<void(blink::mojom::PermissionStatus)>;
+  using StatusesCallback =
+      base::Callback<void(const std::vector<blink::mojom::PermissionStatus>&)>;
   using RequestHandler =
       base::Callback<void(content::WebContents*,
                           content::PermissionType,
-                          const ResponseCallback&)>;
+                          const StatusCallback&)>;
 
   // Handler to dispatch permission requests in JS.
   void SetPermissionRequestHandler(const RequestHandler& handler);
@@ -37,18 +40,21 @@ class AtomPermissionManager : public content::PermissionManager {
       content::PermissionType permission,
       content::RenderFrameHost* render_frame_host,
       const GURL& requesting_origin,
-      const ResponseCallback& callback) override;
+      bool user_gesture,
+      const base::Callback<void(blink::mojom::PermissionStatus)>& callback)
+      override;
   int RequestPermissions(
       const std::vector<content::PermissionType>& permissions,
       content::RenderFrameHost* render_frame_host,
       const GURL& requesting_origin,
+      bool user_gesture,
       const base::Callback<void(
-      const std::vector<blink::mojom::PermissionStatus>&)>& callback) override;
+          const std::vector<blink::mojom::PermissionStatus>&)>& callback)
+      override;
 
  protected:
   void OnPermissionResponse(int request_id,
-                            const GURL& url,
-                            const ResponseCallback& callback,
+                            int permission_id,
                             blink::mojom::PermissionStatus status);
 
   // content::PermissionManager:
@@ -72,16 +78,12 @@ class AtomPermissionManager : public content::PermissionManager {
   void UnsubscribePermissionStatusChange(int subscription_id) override;
 
  private:
-  struct RequestInfo {
-    int render_process_id;
-    ResponseCallback callback;
-  };
+  class PendingRequest;
+  using PendingRequestsMap = IDMap<PendingRequest, IDMapOwnPointer>;
 
   RequestHandler request_handler_;
 
-  std::map<int, RequestInfo> pending_requests_;
-
-  int request_id_;
+  PendingRequestsMap pending_requests_;
 
   DISALLOW_COPY_AND_ASSIGN(AtomPermissionManager);
 };

+ 4 - 9
atom/browser/atom_security_state_model_client.cc

@@ -81,7 +81,7 @@ void AtomSecurityStateModelClient::GetVisibleSecurityState(
     return;
   }
 
-  state->initialized = true;
+  state->connection_info_initialized = true;
   state->url = entry->GetURL();
   const content::SSLStatus& ssl = entry->GetSSL();
   state->initial_security_level =
@@ -91,14 +91,9 @@ void AtomSecurityStateModelClient::GetVisibleSecurityState(
   state->connection_status = ssl.connection_status;
   state->security_bits = ssl.security_bits;
   state->sct_verify_statuses.clear();
-  state->sct_verify_statuses.insert(state->sct_verify_statuses.end(),
-                                    ssl.num_unknown_scts,
-                                    net::ct::SCT_STATUS_LOG_UNKNOWN);
-  state->sct_verify_statuses.insert(state->sct_verify_statuses.end(),
-                                    ssl.num_invalid_scts,
-                                    net::ct::SCT_STATUS_INVALID);
-  state->sct_verify_statuses.insert(state->sct_verify_statuses.end(),
-                                    ssl.num_valid_scts, net::ct::SCT_STATUS_OK);
+  state->sct_verify_statuses.insert(state->sct_verify_statuses.begin(),
+                                    ssl.sct_statuses.begin(),
+                                    ssl.sct_statuses.end());
   state->displayed_mixed_content =
       (ssl.content_status & content::SSLStatus::DISPLAYED_INSECURE_CONTENT)
           ? true

+ 2 - 2
atom/browser/browser.cc

@@ -10,8 +10,8 @@
 #include "atom/browser/native_window.h"
 #include "atom/browser/window_list.h"
 #include "base/files/file_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/path_service.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "brightray/browser/brightray_paths.h"
 
 namespace atom {
@@ -85,7 +85,7 @@ void Browser::Shutdown() {
   FOR_EACH_OBSERVER(BrowserObserver, observers_, OnQuit());
 
   if (base::MessageLoop::current()) {
-    base::MessageLoop::current()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
   } else {
     // There is no message loop available so we are in early stage.

+ 4 - 11
atom/browser/common_web_contents_delegate.cc

@@ -331,14 +331,14 @@ content::SecurityStyle CommonWebContentsDelegate::GetSecurityStyle(
 
   explanations->ran_insecure_content =
       security_info.mixed_content_status ==
-          SecurityStateModel::RAN_MIXED_CONTENT ||
+          security_state::SecurityStateModel::CONTENT_STATUS_RAN ||
       security_info.mixed_content_status ==
-          SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT;
+          security_state::SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN;
   explanations->displayed_insecure_content =
       security_info.mixed_content_status ==
-          SecurityStateModel::DISPLAYED_MIXED_CONTENT ||
+          security_state::SecurityStateModel::CONTENT_STATUS_DISPLAYED ||
       security_info.mixed_content_status ==
-          SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT;
+          security_state::SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN;
 
   if (net::IsCertStatusError(security_info.cert_status)) {
     std::string error_string = net::ErrorToString(
@@ -364,13 +364,6 @@ content::SecurityStyle CommonWebContentsDelegate::GetSecurityStyle(
     }
   }
 
-  if (security_info.is_secure_protocol_and_ciphersuite) {
-    explanations->secure_explanations.push_back(
-        content::SecurityStyleExplanation(
-            kSecureProtocol,
-            kSecureProtocolDescription));
-  }
-
   return security_style;
 }
 

+ 6 - 2
atom/browser/lib/bluetooth_chooser.cc

@@ -89,8 +89,12 @@ void BluetoothChooser::ShowDiscoveryState(DiscoveryState state) {
   }
 }
 
-void BluetoothChooser::AddDevice(const std::string& device_id,
-                                 const base::string16& device_name) {
+void BluetoothChooser::AddOrUpdateDevice(const std::string& device_id,
+                                         bool should_update_name,
+                                         const base::string16& device_name,
+                                         bool is_gatt_connected,
+                                         bool is_paired,
+                                         int signal_strength_level) {
   DeviceInfo info = {device_id, device_name};
   device_list_.push_back(info);
 }

+ 6 - 2
atom/browser/lib/bluetooth_chooser.h

@@ -27,8 +27,12 @@ class BluetoothChooser : public content::BluetoothChooser {
   // content::BluetoothChooser:
   void SetAdapterPresence(AdapterPresence presence) override;
   void ShowDiscoveryState(DiscoveryState state) override;
-  void AddDevice(const std::string& device_id,
-                 const base::string16& device_name) override;
+  void AddOrUpdateDevice(const std::string& device_id,
+                         bool should_update_name,
+                         const base::string16& device_name,
+                         bool is_gatt_connected,
+                         bool is_paired,
+                         int signal_strength_level) override;
   void RemoveDevice(const std::string& device_id) override;
 
  private:

+ 3 - 2
atom/browser/native_window.cc

@@ -20,6 +20,7 @@
 #include "base/json/json_writer.h"
 #include "base/message_loop/message_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "brightray/browser/inspectable_web_contents.h"
 #include "brightray/browser/inspectable_web_contents_view.h"
 #include "components/prefs/pref_service.h"
@@ -604,7 +605,7 @@ void NativeWindow::DidFirstVisuallyNonEmptyPaint() {
   view->SetSize(GetContentSize());
 
   // Emit the ReadyToShow event in next tick in case of pending drawing work.
-  base::MessageLoop::current()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::Bind(&NativeWindow::NotifyReadyToShow, GetWeakPtr()));
 }
@@ -635,7 +636,7 @@ void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
   window_unresposive_closure_.Reset(
       base::Bind(&NativeWindow::NotifyWindowUnresponsive,
                  weak_factory_.GetWeakPtr()));
-  base::MessageLoop::current()->PostDelayedTask(
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
       window_unresposive_closure_.callback(),
       base::TimeDelta::FromMilliseconds(ms));

+ 9 - 9
atom/browser/net/atom_network_delegate.cc

@@ -232,7 +232,7 @@ int AtomNetworkDelegate::OnBeforeURLRequest(
     net::URLRequest* request,
     const net::CompletionCallback& callback,
     GURL* new_url) {
-  if (!ContainsKey(response_listeners_, kOnBeforeRequest))
+  if (!base::ContainsKey(response_listeners_, kOnBeforeRequest))
     return brightray::NetworkDelegate::OnBeforeURLRequest(
         request, callback, new_url);
 
@@ -253,7 +253,7 @@ int AtomNetworkDelegate::OnBeforeStartTransaction(
     headers->SetHeader(
         DevToolsNetworkTransaction::kDevToolsEmulateNetworkConditionsClientId,
         client_id);
-  if (!ContainsKey(response_listeners_, kOnBeforeSendHeaders))
+  if (!base::ContainsKey(response_listeners_, kOnBeforeSendHeaders))
     return brightray::NetworkDelegate::OnBeforeStartTransaction(
         request, callback, headers);
 
@@ -264,7 +264,7 @@ int AtomNetworkDelegate::OnBeforeStartTransaction(
 void AtomNetworkDelegate::OnStartTransaction(
     net::URLRequest* request,
     const net::HttpRequestHeaders& headers) {
-  if (!ContainsKey(simple_listeners_, kOnSendHeaders)) {
+  if (!base::ContainsKey(simple_listeners_, kOnSendHeaders)) {
     brightray::NetworkDelegate::OnStartTransaction(request, headers);
     return;
   }
@@ -278,7 +278,7 @@ int AtomNetworkDelegate::OnHeadersReceived(
     const net::HttpResponseHeaders* original,
     scoped_refptr<net::HttpResponseHeaders>* override,
     GURL* allowed) {
-  if (!ContainsKey(response_listeners_, kOnHeadersReceived))
+  if (!base::ContainsKey(response_listeners_, kOnHeadersReceived))
     return brightray::NetworkDelegate::OnHeadersReceived(
         request, callback, original, override, allowed);
 
@@ -289,7 +289,7 @@ int AtomNetworkDelegate::OnHeadersReceived(
 
 void AtomNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
                                            const GURL& new_location) {
-  if (!ContainsKey(simple_listeners_, kOnBeforeRedirect)) {
+  if (!base::ContainsKey(simple_listeners_, kOnBeforeRedirect)) {
     brightray::NetworkDelegate::OnBeforeRedirect(request, new_location);
     return;
   }
@@ -300,7 +300,7 @@ void AtomNetworkDelegate::OnBeforeRedirect(net::URLRequest* request,
 }
 
 void AtomNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
-  if (!ContainsKey(simple_listeners_, kOnResponseStarted)) {
+  if (!base::ContainsKey(simple_listeners_, kOnResponseStarted)) {
     brightray::NetworkDelegate::OnResponseStarted(request);
     return;
   }
@@ -329,7 +329,7 @@ void AtomNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
     return;
   }
 
-  if (!ContainsKey(simple_listeners_, kOnCompleted)) {
+  if (!base::ContainsKey(simple_listeners_, kOnCompleted)) {
     brightray::NetworkDelegate::OnCompleted(request, started);
     return;
   }
@@ -344,7 +344,7 @@ void AtomNetworkDelegate::OnURLRequestDestroyed(net::URLRequest* request) {
 
 void AtomNetworkDelegate::OnErrorOccurred(
     net::URLRequest* request, bool started) {
-  if (!ContainsKey(simple_listeners_, kOnErrorOccurred)) {
+  if (!base::ContainsKey(simple_listeners_, kOnErrorOccurred)) {
     brightray::NetworkDelegate::OnCompleted(request, started);
     return;
   }
@@ -399,7 +399,7 @@ template<typename T>
 void AtomNetworkDelegate::OnListenerResultInIO(
     uint64_t id, T out, std::unique_ptr<base::DictionaryValue> response) {
   // The request has been destroyed.
-  if (!ContainsKey(callbacks_, id))
+  if (!base::ContainsKey(callbacks_, id))
     return;
 
   ReadFromResponseObject(*response.get(), out);

+ 5 - 5
atom/browser/net/atom_url_request_job_factory.cc

@@ -36,7 +36,7 @@ bool AtomURLRequestJobFactory::SetProtocolHandler(
     return true;
   }
 
-  if (ContainsKey(protocol_handler_map_, scheme))
+  if (base::ContainsKey(protocol_handler_map_, scheme))
     return false;
   protocol_handler_map_[scheme] = protocol_handler.release();
   return true;
@@ -45,8 +45,8 @@ bool AtomURLRequestJobFactory::SetProtocolHandler(
 bool AtomURLRequestJobFactory::InterceptProtocol(
     const std::string& scheme,
     std::unique_ptr<ProtocolHandler> protocol_handler) {
-  if (!ContainsKey(protocol_handler_map_, scheme) ||
-      ContainsKey(original_protocols_, scheme))
+  if (!base::ContainsKey(protocol_handler_map_, scheme) ||
+      base::ContainsKey(original_protocols_, scheme))
     return false;
   ProtocolHandler* original_protocol_handler = protocol_handler_map_[scheme];
   protocol_handler_map_[scheme] = protocol_handler.release();
@@ -74,11 +74,11 @@ ProtocolHandler* AtomURLRequestJobFactory::GetProtocolHandler(
 
 bool AtomURLRequestJobFactory::HasProtocolHandler(
     const std::string& scheme) const {
-  return ContainsKey(protocol_handler_map_, scheme);
+  return base::ContainsKey(protocol_handler_map_, scheme);
 }
 
 void AtomURLRequestJobFactory::Clear() {
-  STLDeleteValues(&protocol_handler_map_);
+  base::STLDeleteValues(&protocol_handler_map_);
 }
 
 net::URLRequestJob* AtomURLRequestJobFactory::MaybeCreateJobWithProtocolHandler(

+ 6 - 4
atom/browser/node_debugger.cc

@@ -51,8 +51,9 @@ NodeDebugger::NodeDebugger(v8::Isolate* isolate)
       base::StringToInt(port_str, &port);
 
     isolate_->SetData(kIsolateSlot, this);
-    v8::Debug::SetMessageHandler(DebugMessageHandler);
+    v8::Debug::SetMessageHandler(isolate_, DebugMessageHandler);
 
+    weak_up_ui_handle_.data = this;
     uv_async_init(uv_default_loop(), &weak_up_ui_handle_, ProcessMessageInUI);
 
     // Start a new IO thread.
@@ -64,7 +65,7 @@ NodeDebugger::NodeDebugger(v8::Isolate* isolate)
     }
 
     // Start the server in new IO thread.
-    thread_.message_loop()->PostTask(
+    thread_.task_runner()->PostTask(
         FROM_HERE,
         base::Bind(&NodeDebugger::StartServer, weak_factory_.GetWeakPtr(),
                    port));
@@ -126,7 +127,8 @@ void NodeDebugger::SendConnectMessage() {
 
 // static
 void NodeDebugger::ProcessMessageInUI(uv_async_t* handle) {
-  v8::Debug::ProcessDebugMessages();
+  NodeDebugger* self = static_cast<NodeDebugger*>(handle->data);
+  v8::Debug::ProcessDebugMessages(self->isolate_);
 }
 
 // static
@@ -136,7 +138,7 @@ void NodeDebugger::DebugMessageHandler(const v8::Debug::Message& message) {
 
   if (self) {
     std::string message8(*v8::String::Utf8Value(message.GetJSON()));
-    self->thread_.message_loop()->PostTask(
+    self->thread_.task_runner()->PostTask(
         FROM_HERE,
         base::Bind(&NodeDebugger::SendMessage, self->weak_factory_.GetWeakPtr(),
                    message8));

+ 17 - 40
atom/browser/osr/osr_render_widget_host_view.cc

@@ -302,8 +302,8 @@ class AtomBeginFrameTimer : public cc::DelayBasedTimeSourceClient {
                       const base::Closure& callback)
       : callback_(callback) {
     time_source_.reset(new cc::DelayBasedTimeSource(
-        content::BrowserThread::GetMessageLoopProxyForThread(
-          content::BrowserThread::UI).get()));
+        content::BrowserThread::GetTaskRunnerForThread(
+            content::BrowserThread::UI).get()));
     time_source_->SetClient(this);
   }
 
@@ -424,7 +424,7 @@ bool OffScreenRenderWidgetHostView::OnMessageReceived(
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(OffScreenRenderWidgetHostView, message)
     IPC_MESSAGE_HANDLER(ViewHostMsg_SetNeedsBeginFrames,
-                        OnSetNeedsBeginFrames)
+                        SetNeedsBeginFrames)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
 
@@ -678,22 +678,6 @@ bool OffScreenRenderWidgetHostView::HasAcceleratedSurface(const gfx::Size &) {
   return false;
 }
 
-void OffScreenRenderWidgetHostView::GetScreenInfo(
-    blink::WebScreenInfo* results) {
-  results->rect = gfx::Rect(size_);
-  results->availableRect = gfx::Rect(size_);
-  results->depth = 24;
-  results->depthPerComponent = 8;
-  results->deviceScaleFactor = scale_factor_;
-  results->orientationAngle = 0;
-  results->orientationType = blink::WebScreenOrientationLandscapePrimary;
-}
-
-bool OffScreenRenderWidgetHostView::GetScreenColorProfile(
-    blink::WebVector<char>*) {
-  return false;
-}
-
 gfx::Rect OffScreenRenderWidgetHostView::GetBoundsInRootWindow() {
   return gfx::Rect(size_);
 }
@@ -716,12 +700,7 @@ gfx::Size OffScreenRenderWidgetHostView::GetRequestedRendererSize() const {
   return size_;
 }
 
-int OffScreenRenderWidgetHostView::
-  DelegatedFrameHostGetGpuMemoryBufferClientId()
-    const {
-  return render_widget_host_->GetProcess()->GetID();
-}
-
+#if !defined(OS_MACOSX)
 ui::Layer* OffScreenRenderWidgetHostView::DelegatedFrameHostGetLayer() const {
   return const_cast<ui::Layer*>(root_layer_.get());
 }
@@ -754,19 +733,14 @@ void OffScreenRenderWidgetHostView::DelegatedFrameHostResizeLockWasReleased() {
   return render_widget_host_->WasResized();
 }
 
-void OffScreenRenderWidgetHostView::DelegatedFrameHostSendCompositorSwapAck(
-  int output_surface_id, const cc::CompositorFrameAck& ack) {
-  render_widget_host_->Send(new ViewMsg_SwapCompositorFrameAck(
-    render_widget_host_->GetRoutingID(),
-    output_surface_id, ack));
-}
-
-void OffScreenRenderWidgetHostView::
-  DelegatedFrameHostSendReclaimCompositorResources(
-    int output_surface_id, const cc::CompositorFrameAck& ack) {
+void
+OffScreenRenderWidgetHostView::DelegatedFrameHostSendReclaimCompositorResources(
+    int output_surface_id,
+    bool is_swap_ack,
+    const cc::ReturnedResourceArray& resources) {
   render_widget_host_->Send(new ViewMsg_ReclaimCompositorResources(
-    render_widget_host_->GetRoutingID(),
-    output_surface_id, ack));
+      render_widget_host_->GetRoutingID(), output_surface_id, is_swap_ack,
+      resources));
 }
 
 void OffScreenRenderWidgetHostView::
@@ -783,6 +757,8 @@ void OffScreenRenderWidgetHostView::SetBeginFrameSource(
     cc::BeginFrameSource* source) {
 }
 
+#endif  // !defined(OS_MACOSX)
+
 std::unique_ptr<cc::SoftwareOutputDevice>
   OffScreenRenderWidgetHostView::CreateSoftwareOutputDevice(
     ui::Compositor* compositor) {
@@ -814,13 +790,14 @@ bool OffScreenRenderWidgetHostView::IsAutoResizeEnabled() const {
   return false;
 }
 
-void OffScreenRenderWidgetHostView::OnSetNeedsBeginFrames(bool enabled) {
+void OffScreenRenderWidgetHostView::SetNeedsBeginFrames(
+    bool needs_begin_frames) {
   SetupFrameRate(false);
 
-  begin_frame_timer_->SetActive(enabled);
+  begin_frame_timer_->SetActive(needs_begin_frames);
 
   if (software_output_device_) {
-    software_output_device_->SetActive(enabled && painting_);
+    software_output_device_->SetActive(needs_begin_frames && painting_);
   }
 }
 

+ 10 - 6
atom/browser/osr/osr_render_widget_host_view.h

@@ -61,7 +61,9 @@ class MacHelper;
 class OffScreenRenderWidgetHostView
     : public content::RenderWidgetHostViewBase,
       public ui::CompositorDelegate,
+#if !defined(OS_MACOSX)
       public content::DelegatedFrameHostClient,
+#endif
       public NativeWindowObserver {
  public:
   OffScreenRenderWidgetHostView(bool transparent,
@@ -92,6 +94,7 @@ class OffScreenRenderWidgetHostView
   void SetBackgroundColor(SkColor color) override;
   bool LockMouse(void) override;
   void UnlockMouse(void) override;
+  void SetNeedsBeginFrames(bool needs_begin_frames) override;
 #if defined(OS_MACOSX)
   ui::AcceleratedWidgetMac* GetAcceleratedWidgetMac() const override;
   void SetActive(bool active) override;
@@ -137,8 +140,6 @@ class OffScreenRenderWidgetHostView
     std::unique_ptr<content::RenderWidgetHostViewFrameSubscriber>) override;
   void EndFrameSubscription() override;
   bool HasAcceleratedSurface(const gfx::Size &) override;
-  void GetScreenInfo(blink::WebScreenInfo *) override;
-  bool GetScreenColorProfile(blink::WebVector<char>*);
   gfx::Rect GetBoundsInRootWindow(void) override;
   void LockCompositingSurface(void) override;
   void UnlockCompositingSurface(void) override;
@@ -147,6 +148,7 @@ class OffScreenRenderWidgetHostView
   gfx::Size GetPhysicalBackingSize() const override;
   gfx::Size GetRequestedRendererSize() const override;
 
+#if !defined(OS_MACOSX)
   // content::DelegatedFrameHostClient:
   int DelegatedFrameHostGetGpuMemoryBufferClientId(void) const;
   ui::Layer *DelegatedFrameHostGetLayer(void) const override;
@@ -157,14 +159,15 @@ class OffScreenRenderWidgetHostView
   std::unique_ptr<content::ResizeLock> DelegatedFrameHostCreateResizeLock(
     bool defer_compositor_lock) override;
   void DelegatedFrameHostResizeLockWasReleased(void) override;
-  void DelegatedFrameHostSendCompositorSwapAck(
-    int, const cc::CompositorFrameAck &) override;
   void DelegatedFrameHostSendReclaimCompositorResources(
-    int, const cc::CompositorFrameAck &) override;
+    int output_surface_id,
+    bool is_swap_ack,
+    const cc::ReturnedResourceArray& resources) override;
   void DelegatedFrameHostOnLostCompositorResources(void) override;
   void DelegatedFrameHostUpdateVSyncParameters(
     const base::TimeTicks &, const base::TimeDelta &) override;
   void SetBeginFrameSource(cc::BeginFrameSource* source) override;
+#endif  // !defined(OS_MACOSX)
 
   // ui::CompositorDelegate:
   std::unique_ptr<cc::SoftwareOutputDevice> CreateSoftwareOutputDevice(
@@ -172,7 +175,6 @@ class OffScreenRenderWidgetHostView
 
   bool InstallTransparency();
   bool IsAutoResizeEnabled() const;
-  void OnSetNeedsBeginFrames(bool enabled);
 
   // NativeWindowObserver:
   void OnWindowResize() override;
@@ -204,6 +206,8 @@ class OffScreenRenderWidgetHostView
   content::RenderWidgetHostImpl* render_widget_host() const
       { return render_widget_host_; }
   NativeWindow* window() const { return native_window_; }
+  gfx::Size size() const { return size_; }
+  float scale_factor() const { return scale_factor_; }
 
  private:
   void SetupFrameRate(bool force);

+ 4 - 9
atom/browser/osr/osr_render_widget_host_view_mac.mm

@@ -38,18 +38,13 @@ class MacHelper :
     return color;
   }
 
-  void BrowserCompositorMacSendCompositorSwapAck(
-      int output_surface_id,
-      const cc::CompositorFrameAck& ack) override {
-    view_->render_widget_host()->Send(new ViewMsg_SwapCompositorFrameAck(
-        view_->render_widget_host()->GetRoutingID(), output_surface_id, ack));
-  }
-
   void BrowserCompositorMacSendReclaimCompositorResources(
       int output_surface_id,
-      const cc::CompositorFrameAck& ack) override {
+      bool is_swap_ack,
+      const cc::ReturnedResourceArray& resources) override {
     view_->render_widget_host()->Send(new ViewMsg_ReclaimCompositorResources(
-        view_->render_widget_host()->GetRoutingID(), output_surface_id, ack));
+        view_->render_widget_host()->GetRoutingID(), output_surface_id,
+        is_swap_ack, resources));
   }
 
   void BrowserCompositorMacOnLostCompositorResources() override {

+ 14 - 0
atom/browser/osr/osr_web_contents_view.cc

@@ -4,6 +4,8 @@
 
 #include "atom/browser/osr/osr_web_contents_view.h"
 
+#include "third_party/WebKit/public/platform/WebScreenInfo.h"
+
 namespace atom {
 
 OffScreenWebContentsView::OffScreenWebContentsView(
@@ -106,6 +108,18 @@ void OffScreenWebContentsView::RenderViewSwappedIn(
 void OffScreenWebContentsView::SetOverscrollControllerEnabled(bool enabled) {
 }
 
+void OffScreenWebContentsView::GetScreenInfo(
+    blink::WebScreenInfo* web_screen_info) const {
+  web_screen_info->rect = gfx::Rect(view_->size());
+  web_screen_info->availableRect = gfx::Rect(view_->size());
+  web_screen_info->depth = 24;
+  web_screen_info->depthPerComponent = 8;
+  web_screen_info->deviceScaleFactor = view_->scale_factor();
+  web_screen_info->orientationAngle = 0;
+  web_screen_info->orientationType =
+      blink::WebScreenOrientationLandscapePrimary;
+}
+
 #if defined(OS_MACOSX)
 void OffScreenWebContentsView::SetAllowOtherViews(bool allow) {
 }

+ 1 - 0
atom/browser/osr/osr_web_contents_view.h

@@ -51,6 +51,7 @@ class OffScreenWebContentsView : public content::WebContentsView,
   void RenderViewCreated(content::RenderViewHost* host) override;
   void RenderViewSwappedIn(content::RenderViewHost* host) override;
   void SetOverscrollControllerEnabled(bool enabled) override;
+  void GetScreenInfo(blink::WebScreenInfo* web_screen_info) const override;
 
 #if defined(OS_MACOSX)
   void SetAllowOtherViews(bool allow) override;

+ 1 - 1
atom/browser/ui/accelerator_util.cc

@@ -88,7 +88,7 @@ void GenerateAcceleratorTable(AcceleratorTable* table,
 
 bool TriggerAcceleratorTableCommand(AcceleratorTable* table,
                                     const ui::Accelerator& accelerator) {
-  if (ContainsKey(*table, accelerator)) {
+  if (base::ContainsKey(*table, accelerator)) {
     const accelerator_util::MenuItem& item = (*table)[accelerator];
     if (item.model->IsEnabledAt(item.position)) {
       item.model->ActivatedAt(item.position);

+ 1 - 1
atom/browser/ui/atom_menu_model.cc

@@ -23,7 +23,7 @@ void AtomMenuModel::SetRole(int index, const base::string16& role) {
 
 base::string16 AtomMenuModel::GetRoleAt(int index) {
   int command_id = GetCommandIdAt(index);
-  if (ContainsKey(roles_, command_id))
+  if (base::ContainsKey(roles_, command_id))
     return roles_[command_id];
   else
     return base::string16();

+ 1 - 1
atom/browser/ui/atom_menu_model.h

@@ -26,7 +26,7 @@ class AtomMenuModel : public ui::SimpleMenuModel {
    private:
     // ui::SimpleMenuModel::Delegate:
     bool GetAcceleratorForCommandId(int command_id,
-                                    ui::Accelerator* accelerator) {
+                                    ui::Accelerator* accelerator) const {
       return GetAcceleratorForCommandIdWithParams(
           command_id, false, accelerator);
     }

+ 1 - 1
atom/browser/ui/views/submenu_button.cc

@@ -49,7 +49,7 @@ SubmenuButton::SubmenuButton(const base::string16& title,
     gfx::Canvas::SizeStringInt(GetText(), GetFontList(), &text_width_,
                                &text_height_, 0, 0);
 
-  SetHasInkDrop(true);
+  SetInkDropMode(InkDropMode::ON);
   set_ink_drop_base_color(
       color_utils::BlendTowardOppositeLuma(background_color_, 0x61));
 }

+ 2 - 1
atom/browser/ui/win/notify_icon_host.cc

@@ -87,7 +87,8 @@ NotifyIconHost::~NotifyIconHost() {
     UnregisterClass(MAKEINTATOM(atom_), instance_);
 
   NotifyIcons copied_container(notify_icons_);
-  STLDeleteContainerPointers(copied_container.begin(), copied_container.end());
+  base::STLDeleteContainerPointers(
+      copied_container.begin(), copied_container.end());
 }
 
 NotifyIcon* NotifyIconHost::CreateNotifyIcon() {

+ 1 - 1
atom/browser/web_contents_permission_helper.cc

@@ -60,7 +60,7 @@ void WebContentsPermissionHelper::RequestPermission(
       web_contents_->GetBrowserContext()->GetPermissionManager());
   auto origin = web_contents_->GetLastCommittedURL();
   permission_manager->RequestPermission(
-      permission, rfh, origin,
+      permission, rfh, origin, false,
       base::Bind(&OnPermissionResponse, callback));
 }
 

+ 0 - 6
atom/browser/web_contents_preferences.cc

@@ -198,12 +198,6 @@ void WebContentsPreferences::AppendExtraCommandLineSwitches(
     if (!visible)  // Default state is visible.
       command_line->AppendSwitch(switches::kHiddenPage);
   }
-
-  // Use frame scheduling for offscreen renderers.
-  // TODO(zcbenz): Remove this after Chrome 54, on which it becomes default.
-  bool offscreen;
-  if (web_preferences.GetBoolean("offscreen", &offscreen) && offscreen)
-    command_line->AppendSwitch(cc::switches::kEnableBeginFrameScheduling);
 }
 
 bool WebContentsPreferences::IsSandboxed(content::WebContents* web_contents) {

+ 4 - 4
atom/browser/web_view_manager.cc

@@ -29,7 +29,7 @@ void WebViewManager::AddGuest(int guest_instance_id,
 }
 
 void WebViewManager::RemoveGuest(int guest_instance_id) {
-  if (!ContainsKey(web_contents_embedder_map_, guest_instance_id))
+  if (!base::ContainsKey(web_contents_embedder_map_, guest_instance_id))
     return;
 
   web_contents_embedder_map_.erase(guest_instance_id);
@@ -43,7 +43,7 @@ void WebViewManager::RemoveGuest(int guest_instance_id) {
 }
 
 content::WebContents* WebViewManager::GetEmbedder(int guest_instance_id) {
-  if (ContainsKey(web_contents_embedder_map_, guest_instance_id))
+  if (base::ContainsKey(web_contents_embedder_map_, guest_instance_id))
     return web_contents_embedder_map_[guest_instance_id].embedder;
   else
     return nullptr;
@@ -53,11 +53,11 @@ content::WebContents* WebViewManager::GetGuestByInstanceID(
     int owner_process_id,
     int element_instance_id) {
   ElementInstanceKey key(owner_process_id, element_instance_id);
-  if (!ContainsKey(element_instance_id_to_guest_map_, key))
+  if (!base::ContainsKey(element_instance_id_to_guest_map_, key))
     return nullptr;
 
   int guest_instance_id = element_instance_id_to_guest_map_[key];
-  if (ContainsKey(web_contents_embedder_map_, guest_instance_id))
+  if (base::ContainsKey(web_contents_embedder_map_, guest_instance_id))
     return web_contents_embedder_map_[guest_instance_id].web_contents;
   else
     return nullptr;

+ 4 - 4
atom/common/api/atom_api_asar.cc

@@ -132,12 +132,12 @@ void InitAsarSupport(v8::Isolate* isolate,
                      v8::Local<v8::Value> require) {
   // Evaluate asar_init.coffee.
   const char* asar_init_native = reinterpret_cast<const char*>(
-      static_cast<const unsigned char*>(node::asar_init_native));
+      static_cast<const unsigned char*>(node::asar_init_data));
   v8::Local<v8::Script> asar_init = v8::Script::Compile(v8::String::NewFromUtf8(
       isolate,
       asar_init_native,
       v8::String::kNormalString,
-      sizeof(node::asar_init_native) -1));
+      sizeof(node::asar_init_data) -1));
   v8::Local<v8::Value> result = asar_init->Run();
 
   // Initialize asar support.
@@ -146,10 +146,10 @@ void InitAsarSupport(v8::Isolate* isolate,
                       std::string)> init;
   if (mate::ConvertFromV8(isolate, result, &init)) {
     const char* asar_native = reinterpret_cast<const char*>(
-        static_cast<const unsigned char*>(node::asar_native));
+        static_cast<const unsigned char*>(node::asar_data));
     init.Run(process,
              require,
-             std::string(asar_native, sizeof(node::asar_native) - 1));
+             std::string(asar_native, sizeof(node::asar_data) - 1));
   }
 }
 

+ 1 - 1
atom/common/chrome_version.h

@@ -8,7 +8,7 @@
 #ifndef ATOM_COMMON_CHROME_VERSION_H_
 #define ATOM_COMMON_CHROME_VERSION_H_
 
-#define CHROME_VERSION_STRING "53.0.2785.143"
+#define CHROME_VERSION_STRING "54.0.2840.101"
 #define CHROME_VERSION "v" CHROME_VERSION_STRING
 
 #endif  // ATOM_COMMON_CHROME_VERSION_H_

+ 4 - 5
atom/common/native_mate_converters/blink_converter.cc

@@ -90,11 +90,11 @@ struct Converter<blink::WebMouseEvent::Button> {
                      blink::WebMouseEvent::Button* out) {
     std::string button = base::ToLowerASCII(V8ToString(val));
     if (button == "left")
-      *out = blink::WebMouseEvent::Button::ButtonLeft;
+      *out = blink::WebMouseEvent::Button::Left;
     else if (button == "middle")
-      *out = blink::WebMouseEvent::Button::ButtonMiddle;
+      *out = blink::WebMouseEvent::Button::Middle;
     else if (button == "right")
-      *out = blink::WebMouseEvent::Button::ButtonRight;
+      *out = blink::WebMouseEvent::Button::Right;
     else
       return false;
     return true;
@@ -176,7 +176,6 @@ bool Converter<blink::WebKeyboardEvent>::FromV8(
   out->windowsKeyCode = keyCode;
   if (shifted)
     out->modifiers |= blink::WebInputEvent::ShiftKey;
-  out->setKeyIdentifierFromWindowsKeyCode();
 
   ui::DomCode domCode = ui::UsLayoutKeyboardCodeToDomCode(keyCode);
   out->domCode = static_cast<int>(domCode);
@@ -246,7 +245,7 @@ bool Converter<blink::WebMouseEvent>::FromV8(
   if (!dict.Get("x", &out->x) || !dict.Get("y", &out->y))
     return false;
   if (!dict.Get("button", &out->button))
-    out->button = blink::WebMouseEvent::Button::ButtonLeft;
+    out->button = blink::WebMouseEvent::Button::Left;
   dict.Get("globalX", &out->globalX);
   dict.Get("globalY", &out->globalY);
   dict.Get("movementX", &out->movementX);

+ 8 - 16
atom/common/node_bindings.cc

@@ -15,8 +15,9 @@
 #include "base/command_line.h"
 #include "base/environment.h"
 #include "base/files/file_path.h"
-#include "base/message_loop/message_loop.h"
 #include "base/path_service.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_paths.h"
@@ -63,14 +64,6 @@ REFERENCE_MODULE(atom_renderer_ipc);
 REFERENCE_MODULE(atom_renderer_web_frame);
 #undef REFERENCE_MODULE
 
-// The "v8::Function::kLineOffsetNotFound" is exported in node.dll, but the
-// linker can not find it, could be a bug of VS.
-#if defined(OS_WIN) && !defined(DEBUG)
-namespace v8 {
-const int Function::kLineOffsetNotFound = -1;
-}
-#endif
-
 namespace atom {
 
 namespace {
@@ -107,7 +100,6 @@ base::FilePath GetResourcesPath(bool is_browser) {
 
 NodeBindings::NodeBindings(bool is_browser)
     : is_browser_(is_browser),
-      message_loop_(nullptr),
       uv_loop_(uv_default_loop()),
       embed_closed_(false),
       uv_env_(nullptr),
@@ -168,7 +160,7 @@ node::Environment* NodeBindings::CreateEnvironment(
 
   std::unique_ptr<const char*[]> c_argv = StringVectorToArgArray(args);
   node::Environment* env = node::CreateEnvironment(
-      context->GetIsolate(), uv_default_loop(), context,
+      new node::IsolateData(context->GetIsolate(), uv_default_loop()), context,
       args.size(), c_argv.get(), 0, nullptr);
 
   // Node uses the deprecated SetAutorunMicrotasks(false) mode, we should switch
@@ -218,7 +210,7 @@ void NodeBindings::RunMessageLoop() {
   DCHECK(!is_browser_ || BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   // The MessageLoop should have been created, remember the one in main thread.
-  message_loop_ = base::MessageLoop::current();
+  task_runner_ = base::ThreadTaskRunnerHandle::Get();
 
   // Run uv loop for once to give the uv__io_poll a chance to add all events.
   UvRunOnce();
@@ -250,16 +242,16 @@ void NodeBindings::UvRunOnce() {
     TRACE_EVENT_END0("devtools.timeline", "FunctionCall");
 
   if (r == 0)
-    message_loop_->QuitWhenIdle();  // Quit from uv.
+    base::RunLoop().QuitWhenIdle();  // Quit from uv.
 
   // Tell the worker thread to continue polling.
   uv_sem_post(&embed_sem_);
 }
 
 void NodeBindings::WakeupMainThread() {
-  DCHECK(message_loop_);
-  message_loop_->PostTask(FROM_HERE, base::Bind(&NodeBindings::UvRunOnce,
-                                                weak_factory_.GetWeakPtr()));
+  DCHECK(task_runner_);
+  task_runner_->PostTask(FROM_HERE, base::Bind(&NodeBindings::UvRunOnce,
+                                               weak_factory_.GetWeakPtr()));
 }
 
 void NodeBindings::WakeupEmbedThread() {

+ 1 - 1
atom/common/node_bindings.h

@@ -64,7 +64,7 @@ class NodeBindings {
   bool is_browser_;
 
   // Main thread's MessageLoop.
-  base::MessageLoop* message_loop_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
   // Main thread's libuv loop.
   uv_loop_t* uv_loop_;

+ 0 - 13
atom/renderer/api/atom_api_spell_check_client.cc

@@ -64,19 +64,6 @@ void SpellCheckClient::spellCheck(
   }
 }
 
-void SpellCheckClient::checkTextOfParagraph(
-    const blink::WebString& text,
-    blink::WebTextCheckingTypeMask mask,
-    blink::WebVector<blink::WebTextCheckingResult>* results) {
-  if (!results)
-    return;
-
-  if (!(mask & blink::WebTextCheckingTypeSpelling))
-    return;
-
-  NOTREACHED() << "checkTextOfParagraph should never be called";
-}
-
 void SpellCheckClient::requestCheckingOfText(
     const blink::WebString& textToCheck,
     const blink::WebVector<uint32_t>& markersInText,

+ 0 - 4
atom/renderer/api/atom_api_spell_check_client.h

@@ -32,10 +32,6 @@ class SpellCheckClient : public blink::WebSpellCheckClient {
       int& misspelledOffset,
       int& misspelledLength,
       blink::WebVector<blink::WebString>* optionalSuggestions) override;
-  void checkTextOfParagraph(
-      const blink::WebString&,
-      blink::WebTextCheckingTypeMask mask,
-      blink::WebVector<blink::WebTextCheckingResult>* results) override;
   void requestCheckingOfText(
       const blink::WebString& textToCheck,
       const blink::WebVector<uint32_t>& markersInText,

+ 5 - 0
atom/renderer/api/atom_api_web_frame.cc

@@ -190,6 +190,10 @@ void WebFrame::InsertText(const std::string& text) {
   web_frame_->insertText(blink::WebString::fromUTF8(text));
 }
 
+void WebFrame::InsertCSS(const std::string& css) {
+  web_frame_->document().insertStyleSheet(blink::WebString::fromUTF8(css));
+}
+
 void WebFrame::ExecuteJavaScript(const base::string16& code,
                                  mate::Arguments* args) {
   bool has_user_gesture = false;
@@ -251,6 +255,7 @@ void WebFrame::BuildPrototype(
       .SetMethod("registerURLSchemeAsPrivileged",
                  &WebFrame::RegisterURLSchemeAsPrivileged)
       .SetMethod("insertText", &WebFrame::InsertText)
+      .SetMethod("insertCSS", &WebFrame::InsertCSS)
       .SetMethod("executeJavaScript", &WebFrame::ExecuteJavaScript)
       .SetMethod("getResourceUsage", &WebFrame::GetResourceUsage)
       .SetMethod("clearCache", &WebFrame::ClearCache)

+ 1 - 0
atom/renderer/api/atom_api_web_frame.h

@@ -69,6 +69,7 @@ class WebFrame : public mate::Wrappable<WebFrame> {
 
   // Editing.
   void InsertText(const std::string& text);
+  void InsertCSS(const std::string& css);
 
   // Excecuting scripts.
   void ExecuteJavaScript(const base::string16& code, mate::Arguments* args);

+ 2 - 2
atom/renderer/atom_renderer_client.cc

@@ -103,8 +103,8 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver {
 
     // Wrap the bundle into a function that receives the binding object as
     // an argument.
-    std::string bundle(node::isolated_bundle_native,
-        node::isolated_bundle_native + sizeof(node::isolated_bundle_native));
+    std::string bundle(node::isolated_bundle_data,
+        node::isolated_bundle_data + sizeof(node::isolated_bundle_data));
     std::string wrapper = "(function (binding) {\n" + bundle + "\n})";
     auto script = v8::Script::Compile(
         mate::ConvertToV8(isolate, wrapper)->ToString());

+ 2 - 2
atom/renderer/atom_sandboxed_renderer_client.cc

@@ -144,8 +144,8 @@ void AtomSandboxedRendererClient::DidCreateScriptContext(
   v8::Context::Scope context_scope(context);
   // Wrap the bundle into a function that receives the binding object and the
   // preload script path as arguments.
-  std::string preload_bundle_native(node::preload_bundle_native,
-      node::preload_bundle_native + sizeof(node::preload_bundle_native));
+  std::string preload_bundle_native(node::preload_bundle_data,
+      node::preload_bundle_data + sizeof(node::preload_bundle_data));
   std::stringstream ss;
   ss << "(function(binding, preloadPath) {\n";
   ss << preload_bundle_native << "\n";

+ 2 - 2
atom/renderer/guest_view_container.cc

@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/lazy_instance.h"
-#include "base/message_loop/message_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace atom {
@@ -53,7 +53,7 @@ void GuestViewContainer::DidResizeElement(const gfx::Size& new_size) {
   if (element_resize_callback_.is_null())
     return;
 
-  base::MessageLoop::current()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(element_resize_callback_, new_size));
 }
 

+ 2 - 1
atom/utility/atom_content_utility_client.cc

@@ -49,7 +49,8 @@ void AtomContentUtilityClient::UtilityThreadStarted() {
 
 bool AtomContentUtilityClient::OnMessageReceived(
     const IPC::Message& message) {
-  if (filter_messages_ && !ContainsKey(message_id_whitelist_, message.type()))
+  if (filter_messages_ &&
+      !base::ContainsKey(message_id_whitelist_, message.type()))
     return false;
 
   bool handled = true;

+ 11 - 4
chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc

@@ -10,6 +10,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "chrome/common/chrome_utility_messages.h"
 #include "chrome/common/print_messages.h"
 #include "content/public/browser/browser_thread.h"
@@ -59,10 +60,11 @@ class LazyEmf : public MetafilePlayer {
  public:
   LazyEmf(const scoped_refptr<RefCountedTempDir>& temp_dir, ScopedTempFile file)
       : temp_dir_(temp_dir), file_(std::move(file)) {}
-  virtual ~LazyEmf() { Close(); }
+  ~LazyEmf() override { Close(); }
 
-  virtual bool SafePlayback(HDC hdc) const override;
-  virtual bool SaveTo(base::File* file) const override;
+  bool SafePlayback(HDC hdc) const override;
+  bool GetDataAsVector(std::vector<char>* buffer) const override;
+  bool SaveTo(base::File* file) const override;
 
  private:
   void Close() const;
@@ -242,6 +244,11 @@ bool LazyEmf::SafePlayback(HDC hdc) const {
   return result;
 }
 
+bool LazyEmf::GetDataAsVector(std::vector<char>* buffer) const {
+  NOTREACHED();
+  return false;
+}
+
 bool LazyEmf::SaveTo(base::File* file) const {
   Emf emf;
   return LoadEmf(&emf) && emf.SaveTo(file);
@@ -392,7 +399,7 @@ void PdfToEmfUtilityProcessHostClient::OnPageDone(bool success,
     ScopedTempFile temp_emf = data.TakeEmf();
     if (!temp_emf)  // Unexpected message from utility process.
       return OnFailed();
-    emf.reset(new LazyEmf(temp_dir_, std::move(temp_emf)));
+    emf = base::MakeUnique<LazyEmf>(temp_dir_, std::move(temp_emf));
   }
 
   BrowserThread::PostTask(BrowserThread::UI,

+ 7 - 4
chromium_src/chrome/browser/printing/print_job.cc

@@ -7,7 +7,9 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
 #include "base/threading/thread_restrictions.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/threading/worker_pool.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/chrome_notification_types.h"
@@ -196,12 +198,13 @@ bool PrintJob::FlushJob(base::TimeDelta timeout) {
   // Make sure the object outlive this message loop.
   scoped_refptr<PrintJob> handle(this);
 
-  base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
-      base::Bind(&PrintJob::Quit, quit_factory_.GetWeakPtr()), timeout);
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, base::Bind(&PrintJob::Quit, quit_factory_.GetWeakPtr()),
+      timeout);
 
   base::MessageLoop::ScopedNestableTaskAllower allow(
       base::MessageLoop::current());
-  base::MessageLoop::current()->Run();
+  base::RunLoop().Run();
 
   return true;
 }
@@ -362,7 +365,7 @@ void PrintJob::OnNotifyPrintJobEvent(const JobEventDetails& event_details) {
     }
     case JobEventDetails::DOC_DONE: {
       // This will call Stop() and broadcast a JOB_DONE message.
-      base::MessageLoop::current()->PostTask(
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, base::Bind(&PrintJob::OnDocumentDone, this));
       break;
     }

+ 2 - 1
chromium_src/chrome/browser/printing/print_job_worker.cc

@@ -9,6 +9,7 @@
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/message_loop/message_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
@@ -278,7 +279,7 @@ void PrintJobWorker::OnNewPage() {
     scoped_refptr<PrintedPage> page = document_->GetPage(page_number_.ToInt());
     if (!page.get()) {
       // We need to wait for the page to be available.
-      base::MessageLoop::current()->PostDelayedTask(
+      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
           FROM_HERE,
           base::Bind(&PrintJobWorker::OnNewPage, weak_factory_.GetWeakPtr()),
           base::TimeDelta::FromMilliseconds(500));

+ 2 - 1
chromium_src/chrome/browser/printing/print_view_manager_base.cc

@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/memory/ref_counted_memory.h"
+#include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/timer/timer.h"
 #include "components/prefs/pref_service.h"
@@ -424,7 +425,7 @@ bool PrintViewManagerBase::RunInnerMessageLoop() {
   {
     base::MessageLoop::ScopedNestableTaskAllower allow(
         base::MessageLoop::current());
-    base::MessageLoop::current()->Run();
+    base::RunLoop().Run();
   }
 
   bool success = true;

+ 1 - 1
chromium_src/chrome/browser/renderer_host/pepper/pepper_broker_message_filter.cc

@@ -32,7 +32,7 @@ PepperBrokerMessageFilter::~PepperBrokerMessageFilter() {}
 scoped_refptr<base::TaskRunner>
 PepperBrokerMessageFilter::OverrideTaskRunnerForMessage(
     const IPC::Message& message) {
-  return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
+  return BrowserThread::GetTaskRunnerForThread(BrowserThread::UI);
 }
 
 int32_t PepperBrokerMessageFilter::OnResourceMessageReceived(

+ 3 - 3
chromium_src/chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc

@@ -110,16 +110,16 @@ PepperFlashClipboardMessageFilter::OverrideTaskRunnerForMessage(
   // restrictions of various platform APIs. In general, the clipboard is not
   // thread-safe, so all clipboard calls should be serviced from the UI thread.
   if (msg.type() == PpapiHostMsg_FlashClipboard_WriteData::ID)
-    return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
+    return BrowserThread::GetTaskRunnerForThread(BrowserThread::UI);
 
 // Windows needs clipboard reads to be serviced from the IO thread because
 // these are sync IPCs which can result in deadlocks with plugins if serviced
 // from the UI thread. Note that Windows clipboard calls ARE thread-safe so it
 // is ok for reads and writes to be serviced from different threads.
 #if !defined(OS_WIN)
-  return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
+  return BrowserThread::GetTaskRunnerForThread(BrowserThread::UI);
 #else
-  return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO);
+  return BrowserThread::GetTaskRunnerForThread(BrowserThread::IO);
 #endif
 }
 

+ 1 - 1
chromium_src/chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc

@@ -54,7 +54,7 @@ PepperIsolatedFileSystemMessageFilter::OverrideTaskRunnerForMessage(
     const IPC::Message& msg) {
   // In order to reach ExtensionSystem, we need to get ProfileManager first.
   // ProfileManager lives in UI thread, so we need to do this in UI thread.
-  return content::BrowserThread::GetMessageLoopProxyForThread(
+  return content::BrowserThread::GetTaskRunnerForThread(
       content::BrowserThread::UI);
 }
 

+ 55 - 73
chromium_src/chrome/renderer/printing/print_web_view_helper.cc

@@ -24,6 +24,7 @@
 #include "net/base/escape.h"
 #include "printing/pdf_metafile_skia.h"
 #include "printing/units.h"
+#include "third_party/WebKit/public/platform/WebDoubleSize.h"
 #include "third_party/WebKit/public/platform/WebSize.h"
 #include "third_party/WebKit/public/platform/WebURLRequest.h"
 #include "third_party/WebKit/public/web/WebConsoleMessage.h"
@@ -69,15 +70,15 @@ bool PrintMsg_Print_Params_IsValid(const PrintMsg_Print_Params& params) {
 }
 
 PrintMsg_Print_Params GetCssPrintParams(
-    blink::WebFrame* frame,
+    blink::WebLocalFrame* frame,
     int page_index,
     const PrintMsg_Print_Params& page_params) {
   PrintMsg_Print_Params page_css_params = page_params;
   int dpi = GetDPI(&page_params);
 
-  blink::WebSize page_size_in_pixels(
-      ConvertUnit(page_params.page_size.width(), dpi, kPixelsPerInch),
-      ConvertUnit(page_params.page_size.height(), dpi, kPixelsPerInch));
+  blink::WebDoubleSize page_size_in_pixels(
+      ConvertUnitDouble(page_params.page_size.width(), dpi, kPixelsPerInch),
+      ConvertUnitDouble(page_params.page_size.height(), dpi, kPixelsPerInch));
   int margin_top_in_pixels =
       ConvertUnit(page_params.margin_top, dpi, kPixelsPerInch);
   int margin_right_in_pixels = ConvertUnit(
@@ -92,8 +93,6 @@ PrintMsg_Print_Params GetCssPrintParams(
       page_params.margin_left,
       dpi, kPixelsPerInch);
 
-  blink::WebSize original_page_size_in_pixels = page_size_in_pixels;
-
   if (frame) {
     frame->pageSizeAndMarginsInPixels(page_index,
                                       page_size_in_pixels,
@@ -103,9 +102,9 @@ PrintMsg_Print_Params GetCssPrintParams(
                                       margin_left_in_pixels);
   }
 
-  int new_content_width = page_size_in_pixels.width -
+  double new_content_width = page_size_in_pixels.width() -
                           margin_left_in_pixels - margin_right_in_pixels;
-  int new_content_height = page_size_in_pixels.height -
+  double new_content_height = page_size_in_pixels.height() -
                            margin_top_in_pixels - margin_bottom_in_pixels;
 
   // Invalid page size and/or margins. We just use the default setting.
@@ -115,20 +114,12 @@ PrintMsg_Print_Params GetCssPrintParams(
     return page_css_params;
   }
 
-  page_css_params.content_size = gfx::Size(
-      ConvertUnit(new_content_width, kPixelsPerInch, dpi),
-      ConvertUnit(new_content_height, kPixelsPerInch, dpi));
-
-  if (original_page_size_in_pixels != page_size_in_pixels) {
-    page_css_params.page_size = gfx::Size(
-        ConvertUnit(page_size_in_pixels.width, kPixelsPerInch, dpi),
-        ConvertUnit(page_size_in_pixels.height, kPixelsPerInch, dpi));
-  } else {
-    // Printing frame doesn't have any page size css. Pixels to dpi conversion
-    // causes rounding off errors. Therefore use the default page size values
-    // directly.
-    page_css_params.page_size = page_params.page_size;
-  }
+  page_css_params.page_size =
+      gfx::Size(ConvertUnit(page_size_in_pixels.width(), kPixelsPerInch, dpi),
+                ConvertUnit(page_size_in_pixels.height(), kPixelsPerInch, dpi));
+  page_css_params.content_size =
+      gfx::Size(ConvertUnit(new_content_width, kPixelsPerInch, dpi),
+              ConvertUnit(new_content_height, kPixelsPerInch, dpi));
 
   page_css_params.margin_top =
       ConvertUnit(margin_top_in_pixels, kPixelsPerInch, dpi);
@@ -274,7 +265,7 @@ MarginType GetMarginsForPdf(blink::WebFrame* frame,
 }
 
 PrintMsg_Print_Params CalculatePrintParamsForCss(
-    blink::WebFrame* frame,
+    blink::WebLocalFrame* frame,
     int page_index,
     const PrintMsg_Print_Params& page_params,
     bool ignore_css_margins,
@@ -429,7 +420,6 @@ class PrepareFrameAndViewForPrint : public blink::WebViewClient,
       const blink::WebString& unique_name,
       blink::WebSandboxFlags sandbox_flags,
       const blink::WebFrameOwnerProperties& frame_owner_properties) override;
-  void frameDetached(blink::WebFrame* frame, DetachType type) override;
 
  private:
   void CallOnReady();
@@ -567,10 +557,9 @@ void PrepareFrameAndViewForPrint::didStopLoading() {
   DCHECK(!on_ready_.is_null());
   // Don't call callback here, because it can delete |this| and WebView that is
   // called didStopLoading.
-  base::MessageLoop::current()->PostTask(
-      FROM_HERE,
-      base::Bind(&PrepareFrameAndViewForPrint::CallOnReady,
-                 weak_ptr_factory_.GetWeakPtr()));
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::Bind(&PrepareFrameAndViewForPrint::CallOnReady,
+                            weak_ptr_factory_.GetWeakPtr()));
 }
 
 blink::WebFrame* PrepareFrameAndViewForPrint::createChildFrame(
@@ -585,14 +574,6 @@ blink::WebFrame* PrepareFrameAndViewForPrint::createChildFrame(
   return frame;
 }
 
-void PrepareFrameAndViewForPrint::frameDetached(blink::WebFrame* frame,
-                                                DetachType type) {
-  DCHECK(type == DetachType::Remove);
-  if (frame->parent())
-    frame->parent()->removeChild(frame);
-  frame->close();
-}
-
 void PrepareFrameAndViewForPrint::CallOnReady() {
   return on_ready_.Run();  // Can delete |this|.
 }
@@ -640,6 +621,7 @@ PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view)
       print_node_in_progress_(false),
       is_loading_(false),
       is_scripted_preview_delayed_(false),
+      ipc_nesting_level_(0),
       weak_ptr_factory_(this) {
 }
 
@@ -653,6 +635,15 @@ void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame,
 }
 
 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
+  // The class is not designed to handle recursive messages. This is not
+  // expected during regular flow. However, during rendering of content for
+  // printing, lower level code may run nested message loop. E.g. PDF may has
+  // script to show message box http://crbug.com/502562. In that moment browser
+  // may receive updated printer capabilities and decide to restart print
+  // preview generation. When this happened message handling function may
+  // choose to ignore message or safely crash process.
+  ++ipc_nesting_level_;
+
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message)
     IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages)
@@ -660,6 +651,8 @@ bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
     IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview)
     IPC_MESSAGE_UNHANDLED(handled = false)
     IPC_END_MESSAGE_MAP()
+
+  --ipc_nesting_level_;
   return handled;
 }
 
@@ -667,28 +660,14 @@ void PrintWebViewHelper::OnDestruct() {
   delete this;
 }
 
-bool PrintWebViewHelper::GetPrintFrame(blink::WebLocalFrame** frame) {
-  DCHECK(frame);
-  blink::WebView* webView = render_view()->GetWebView();
-  DCHECK(webView);
-  if (!webView)
-    return false;
-
-  // If the user has selected text in the currently focused frame we print
-  // only that frame (this makes print selection work for multiple frames).
-  blink::WebLocalFrame* focusedFrame =
-      webView->focusedFrame()->toWebLocalFrame();
-  *frame = focusedFrame->hasSelection()
-               ? focusedFrame
-               : webView->mainFrame()->toWebLocalFrame();
-  return true;
-}
-
 #if !defined(DISABLE_BASIC_PRINTING)
 void PrintWebViewHelper::OnPrintPages(bool silent, bool print_background) {
-  blink::WebLocalFrame* frame;
-  if (GetPrintFrame(&frame))
-    Print(frame, blink::WebNode(), silent, print_background);
+  if (ipc_nesting_level_> 1)
+    return;
+
+  blink::WebLocalFrame* frame =
+      render_view()->GetMainRenderFrame()->GetWebFrame();
+  Print(frame, blink::WebNode(), silent, print_background);
 }
 #endif  // !DISABLE_BASIC_PRINTING
 
@@ -725,22 +704,25 @@ void PrintWebViewHelper::OnPrintingDone(bool success) {
 }
 
 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) {
-  blink::WebLocalFrame* frame;
-  if (GetPrintFrame(&frame)) {
-    print_preview_context_.InitWithFrame(frame);
-    if (!print_preview_context_.source_frame()) {
-      DidFinishPrinting(FAIL_PREVIEW);
-      return;
-    }
+  if (ipc_nesting_level_ > 1)
+    return;
 
-    if (!UpdatePrintSettings(print_preview_context_.source_frame(),
-                           print_preview_context_.source_node(), settings)) {
-      DidFinishPrinting(FAIL_PREVIEW);
-      return;
-    }
-    is_print_ready_metafile_sent_ = false;
-    PrepareFrameForPreviewDocument();
+  blink::WebLocalFrame* frame =
+      render_view()->GetMainRenderFrame()->GetWebFrame();
+
+  print_preview_context_.InitWithFrame(frame);
+  if (!print_preview_context_.source_frame()) {
+    DidFinishPrinting(FAIL_PREVIEW);
+    return;
   }
+
+  if (!UpdatePrintSettings(print_preview_context_.source_frame(),
+                         print_preview_context_.source_node(), settings)) {
+    DidFinishPrinting(FAIL_PREVIEW);
+    return;
+  }
+  is_print_ready_metafile_sent_ = false;
+  PrepareFrameForPreviewDocument();
 }
 
 void PrintWebViewHelper::PrepareFrameForPreviewDocument() {
@@ -972,7 +954,7 @@ void PrintWebViewHelper::FinishFramePrinting() {
 }
 
 #if defined(OS_MACOSX)
-bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
+bool PrintWebViewHelper::PrintPagesNative(blink::WebLocalFrame* frame,
                                           int page_count) {
   const PrintMsg_PrintPages_Params& params = *print_pages_params_;
   const PrintMsg_Print_Params& print_params = params.params;
@@ -999,7 +981,7 @@ bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
 
 // static - Not anonymous so that platform implementations can use it.
 void PrintWebViewHelper::ComputePageLayoutInPointsForCss(
-    blink::WebFrame* frame,
+    blink::WebLocalFrame* frame,
     int page_index,
     const PrintMsg_Print_Params& page_params,
     bool ignore_css_margins,
@@ -1120,7 +1102,7 @@ bool PrintWebViewHelper::UpdatePrintSettings(
 }
 
 
-bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebFrame* frame,
+bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebLocalFrame* frame,
                                                   const blink::WebNode& node,
                                                   int expected_pages_count) {
   PrintHostMsg_ScriptedPrint_Params params;

+ 8 - 9
chromium_src/chrome/renderer/printing/print_web_view_helper.h

@@ -163,7 +163,7 @@ class PrintWebViewHelper
 
   // Get final print settings from the user.
   // Return false if the user cancels or on error.
-  bool GetPrintSettingsFromUser(blink::WebFrame* frame,
+  bool GetPrintSettingsFromUser(blink::WebLocalFrame* frame,
                                 const blink::WebNode& node,
                                 int expected_pages_count);
 
@@ -171,23 +171,23 @@ class PrintWebViewHelper
 
   void OnFramePreparedForPrintPages();
   void PrintPages();
-  bool PrintPagesNative(blink::WebFrame* frame, int page_count);
+  bool PrintPagesNative(blink::WebLocalFrame* frame, int page_count);
   void FinishFramePrinting();
 
   // Prints the page listed in |params|.
 #if defined(OS_LINUX) || defined(OS_ANDROID)
   void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
-                         blink::WebFrame* frame,
+                         blink::WebLocalFrame* frame,
                          PdfMetafileSkia* metafile);
 #elif defined(OS_WIN)
   void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
-                         blink::WebFrame* frame,
+                         blink::WebLocalFrame* frame,
                          PdfMetafileSkia* metafile,
                          gfx::Size* page_size_in_dpi,
                          gfx::Rect* content_area_in_dpi);
 #else
   void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
-                         blink::WebFrame* frame);
+                         blink::WebLocalFrame* frame);
 #endif
 
   // Render the frame for printing.
@@ -198,7 +198,7 @@ class PrintWebViewHelper
 #if defined(OS_MACOSX)
   void RenderPage(const PrintMsg_Print_Params& params,
                   int page_number,
-                  blink::WebFrame* frame,
+                  blink::WebLocalFrame* frame,
                   bool is_preview,
                   PdfMetafileSkia* metafile,
                   gfx::Size* page_size,
@@ -223,15 +223,13 @@ class PrintWebViewHelper
 
   // Helper method to get page layout in points and fit to page if needed.
   static void ComputePageLayoutInPointsForCss(
-      blink::WebFrame* frame,
+      blink::WebLocalFrame* frame,
       int page_index,
       const PrintMsg_Print_Params& default_params,
       bool ignore_css_margins,
       double* scale_factor,
       PageSizeMargins* page_layout_in_points);
 
-  bool GetPrintFrame(blink::WebLocalFrame** frame);
-
   // Script Initiated Printing ------------------------------------------------
 
   // Notifies the browser a print preview page has been rendered.
@@ -373,6 +371,7 @@ class PrintWebViewHelper
   bool print_node_in_progress_;
   bool is_loading_;
   bool is_scripted_preview_delayed_;
+  int ipc_nesting_level_;
 
   PrintPreviewContext print_preview_context_;
 

+ 3 - 3
chromium_src/chrome/renderer/printing/print_web_view_helper_linux.cc

@@ -22,7 +22,7 @@
 
 namespace printing {
 
-using blink::WebFrame;
+using blink::WebLocalFrame;
 
 bool PrintWebViewHelper::RenderPreviewPage(
     int page_number,
@@ -56,7 +56,7 @@ bool PrintWebViewHelper::RenderPreviewPage(
   return PreviewPageRendered(page_number, draft_metafile.get());
 }
 
-bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
+bool PrintWebViewHelper::PrintPagesNative(blink::WebLocalFrame* frame,
                                           int page_count) {
   PdfMetafileSkia metafile(PDF_SKIA_DOCUMENT_TYPE);
   if (!metafile.Init())
@@ -113,7 +113,7 @@ bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
 
 void PrintWebViewHelper::PrintPageInternal(
     const PrintMsg_PrintPage_Params& params,
-    WebFrame* frame,
+    WebLocalFrame* frame,
     PdfMetafileSkia* metafile) {
   PageSizeMargins page_layout_in_points;
   double scale_factor = 1.0f;

+ 3 - 3
chromium_src/chrome/renderer/printing/print_web_view_helper_mac.mm

@@ -18,11 +18,11 @@
 
 namespace printing {
 
-using blink::WebFrame;
+using blink::WebLocalFrame;
 
 void PrintWebViewHelper::PrintPageInternal(
     const PrintMsg_PrintPage_Params& params,
-    WebFrame* frame) {
+    WebLocalFrame* frame) {
   PdfMetafileSkia metafile(PDF_SKIA_DOCUMENT_TYPE);
   CHECK(metafile.Init());
 
@@ -89,7 +89,7 @@ bool PrintWebViewHelper::RenderPreviewPage(
 
 void PrintWebViewHelper::RenderPage(const PrintMsg_Print_Params& params,
                                     int page_number,
-                                    WebFrame* frame,
+                                    WebLocalFrame* frame,
                                     bool is_preview,
                                     PdfMetafileSkia* metafile,
                                     gfx::Size* page_size,

+ 3 - 3
chromium_src/chrome/renderer/printing/print_web_view_helper_pdf_win.cc

@@ -20,7 +20,7 @@
 
 namespace printing {
 
-using blink::WebFrame;
+using blink::WebLocalFrame;
 
 bool PrintWebViewHelper::RenderPreviewPage(
     int page_number,
@@ -55,7 +55,7 @@ bool PrintWebViewHelper::RenderPreviewPage(
   return PreviewPageRendered(page_number, draft_metafile.get());
 }
 
-bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
+bool PrintWebViewHelper::PrintPagesNative(blink::WebLocalFrame* frame,
                                           int page_count) {
   PdfMetafileSkia metafile(PDF_SKIA_DOCUMENT_TYPE);
   if (!metafile.Init())
@@ -122,7 +122,7 @@ bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame,
 
 void PrintWebViewHelper::PrintPageInternal(
     const PrintMsg_PrintPage_Params& params,
-    WebFrame* frame,
+    WebLocalFrame* frame,
     PdfMetafileSkia* metafile,
     gfx::Size* page_size_in_dpi,
     gfx::Rect* content_area_in_dpi) {

+ 8 - 2
common.gypi

@@ -119,6 +119,7 @@
               '-Wno-deprecated-declarations',
               '-Wno-return-type',
               '-Wno-shift-negative-value',
+              '-Wno-format',
               '-Wno-varargs', # https://git.io/v6Olj
               # Required when building as shared library.
               '-fPIC',
@@ -147,8 +148,13 @@
             'include_dirs': [
               '<(DEPTH)/atom/node',
             ],
-            # Node is using networking API but linking with this itself.
-            'libraries': [ '-lwinmm.lib' ],
+            'libraries': [
+              # Node is using networking API but linking with this itself.
+              '-lwinmm.lib',
+              # Needed by V8.
+              '-ldbghelp.lib',
+              '-lshlwapi.lib',
+            ],
             # Fix the linking error with icu.
             'conditions': [
               ['libchromiumcontent_component==0', {

+ 2 - 10
electron.gyp

@@ -223,6 +223,8 @@
         'GLIB_DISABLE_DEPRECATION_WARNINGS',
         # Defined in Chromium but not exposed in its gyp file.
         'V8_USE_EXTERNAL_STARTUP_DATA',
+        'V8_SHARED',
+        'USING_V8_SHARED',
         'ENABLE_PLUGINS',
         'ENABLE_PEPPER_CDMS',
         'USE_PROPRIETARY_CODECS',
@@ -583,16 +585,6 @@
                 '${BUILT_PRODUCTS_DIR}/<(product_name) Framework.framework/Versions/A/<(product_name) Framework',
               ],
             },
-            {
-              'postbuild_name': 'Fix path of ffmpeg',
-              'action': [
-                'install_name_tool',
-                '-change',
-                '/usr/local/lib/libffmpeg.dylib',
-                '@rpath/libffmpeg.dylib',
-                '${BUILT_PRODUCTS_DIR}/<(product_name) Framework.framework/Versions/A/<(product_name) Framework',
-              ],
-            },
             {
               'postbuild_name': 'Add symlinks for framework subdirectories',
               'action': [

+ 1 - 0
lib/browser/api/web-contents.js

@@ -99,6 +99,7 @@ WebContents.prototype.sendToAll = function (channel, ...args) {
 
 // Following methods are mapped to webFrame.
 const webFrameMethods = [
+  'insertCSS',
   'insertText',
   'setLayoutZoomLevelLimits',
   'setVisualZoomLevelLimits',

+ 1 - 1
script/lib/config.py

@@ -9,7 +9,7 @@ import sys
 BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \
     'https://s3.amazonaws.com/github-janky-artifacts/libchromiumcontent'
 LIBCHROMIUMCONTENT_COMMIT = os.getenv('LIBCHROMIUMCONTENT_COMMIT') or \
-    '97e32dafa4a1112f14eef61a663cf39a03ed4c97'
+    '25ec31e58d23002a02dc85dd4b8200b72d50a6c7'
 
 PLATFORM = {
   'cygwin': 'win32',

+ 2 - 0
spec/api-browser-window-spec.js

@@ -236,6 +236,7 @@ describe('BrowserWindow module', function () {
           })
           w.webContents.executeJavaScript(`
             form = document.createElement('form')
+            document.body.appendChild(form)
             form.method = 'POST'
             form.target = '_blank'
             form.submit()
@@ -252,6 +253,7 @@ describe('BrowserWindow module', function () {
           })
           w.webContents.executeJavaScript(`
             form = document.createElement('form')
+            document.body.appendChild(form)
             form.method = 'POST'
             form.target = '_blank'
             form.enctype = 'multipart/form-data'

+ 1 - 1
spec/api-debugger-spec.js

@@ -102,7 +102,7 @@ describe('debugger module', function () {
       }
       w.webContents.debugger.on('message', function (e, method, params) {
         if (method === 'Console.messageAdded') {
-          assert.equal(params.message.type, 'log')
+          assert.equal(params.message.level, 'log')
           assert.equal(params.message.url, url)
           assert.equal(params.message.text, 'a')
           w.webContents.debugger.detach()

+ 29 - 1
spec/api-session-spec.js

@@ -13,6 +13,7 @@ const {ipcMain, session, BrowserWindow, net} = remote
 describe('session module', function () {
   var fixtures = path.resolve(__dirname, 'fixtures')
   var w = null
+  var webview = null
   var url = 'http://127.0.0.1'
 
   beforeEach(function () {
@@ -24,6 +25,13 @@ describe('session module', function () {
   })
 
   afterEach(function () {
+    if (webview != null) {
+      if (!document.body.contains(webview)) {
+        document.body.appendChild(webview)
+      }
+      webview.remove()
+    }
+
     return closeWindow(w).then(function () { w = null })
   })
 
@@ -325,7 +333,7 @@ describe('session module', function () {
       downloadServer.listen(0, '127.0.0.1', function () {
         var port = downloadServer.address().port
         ipcRenderer.sendSync('set-download-option', false, false)
-        var webview = new WebView()
+        webview = new WebView()
         webview.src = 'file://' + fixtures + '/api/blank.html'
         webview.addEventListener('did-finish-load', function () {
           webview.downloadURL(url + ':' + port + '/')
@@ -718,4 +726,24 @@ describe('session module', function () {
       })
     })
   })
+
+  describe('ses.setPermissionRequestHandler(handler)', () => {
+    it('cancels any pending requests when cleared', (done) => {
+      const ses = session.fromPartition('permissionTest')
+      ses.setPermissionRequestHandler(() => {
+        ses.setPermissionRequestHandler(null)
+      })
+
+      webview = new WebView()
+      webview.addEventListener('ipc-message', function (e) {
+        assert.equal(e.channel, 'message')
+        assert.deepEqual(e.args, ['SecurityError'])
+        done()
+      })
+      webview.src = 'file://' + fixtures + '/pages/permissions/midi-sysex.html'
+      webview.partition = 'permissionTest'
+      webview.setAttribute('nodeintegration', 'on')
+      document.body.appendChild(webview)
+    })
+  })
 })

+ 17 - 0
spec/api-web-contents-spec.js

@@ -268,4 +268,21 @@ describe('webContents module', function () {
       w.webContents.sendInputEvent({type: 'char', keyCode: 'Z', modifiers: ['shift', 'ctrl']})
     })
   })
+
+  it('supports inserting CSS', function (done) {
+    w.loadURL('about:blank')
+    w.webContents.insertCSS('body { background-repeat: round; }')
+    w.webContents.executeJavaScript('window.getComputedStyle(document.body).getPropertyValue("background-repeat")', (result) => {
+      assert.equal(result, 'round')
+      done()
+    })
+  })
+
+  it('supports inspecting an element in the devtools', function (done) {
+    w.loadURL('about:blank')
+    w.webContents.once('devtools-opened', function () {
+      done()
+    })
+    w.webContents.inspectElement(10, 10)
+  })
 })

+ 5 - 0
spec/fixtures/pages/permissions/midi-sysex.html

@@ -0,0 +1,5 @@
+<script>
+navigator.requestMIDIAccess({sysex: true}).then(() => {}, (err) => {
+  require('electron').ipcRenderer.sendToHost('message', err.name);
+});
+</script>

+ 1 - 1
spec/fixtures/pages/permissions/midi.html

@@ -1,5 +1,5 @@
 <script>
-navigator.requestMIDIAccess({sysex: true}).then(() => {}, (err) => {
+navigator.requestMIDIAccess({sysex: false}).then(() => {}, (err) => {
   require('electron').ipcRenderer.sendToHost('message', err.name);
 });
 </script>

+ 20 - 1
spec/webview-spec.js

@@ -928,6 +928,12 @@ describe('<webview> tag', function () {
     function setUpRequestHandler (webview, requestedPermission, completed) {
       var listener = function (webContents, permission, callback) {
         if (webContents.getId() === webview.getId()) {
+          // requestMIDIAccess with sysex requests both midi and midiSysex so
+          // grant the first midi one and then reject the midiSysex one
+          if (requestedPermission === 'midiSysex' && permission === 'midi') {
+            return callback(true)
+          }
+
           assert.equal(permission, requestedPermission)
           callback(false)
           if (completed) completed()
@@ -962,7 +968,7 @@ describe('<webview> tag', function () {
       document.body.appendChild(webview)
     })
 
-    it('emits when using navigator.requestMIDIAccess api', function (done) {
+    it('emits when using navigator.requestMIDIAccess without sysex api', function (done) {
       webview.addEventListener('ipc-message', function (e) {
         assert.equal(e.channel, 'message')
         assert.deepEqual(e.args, ['SecurityError'])
@@ -971,6 +977,19 @@ describe('<webview> tag', function () {
       webview.src = 'file://' + fixtures + '/pages/permissions/midi.html'
       webview.partition = 'permissionTest'
       webview.setAttribute('nodeintegration', 'on')
+      setUpRequestHandler(webview, 'midi')
+      document.body.appendChild(webview)
+    })
+
+    it('emits when using navigator.requestMIDIAccess with sysex api', function (done) {
+      webview.addEventListener('ipc-message', function (e) {
+        assert.equal(e.channel, 'message')
+        assert.deepEqual(e.args, ['SecurityError'])
+        done()
+      })
+      webview.src = 'file://' + fixtures + '/pages/permissions/midi-sysex.html'
+      webview.partition = 'permissionTest'
+      webview.setAttribute('nodeintegration', 'on')
       setUpRequestHandler(webview, 'midiSysex')
       document.body.appendChild(webview)
     })

+ 1 - 1
vendor/brightray

@@ -1 +1 @@
-Subproject commit 5333d0e64b897c8584cee85bfcf7c045a7ca1e66
+Subproject commit e5b56b4497857734cc8cd4ac7c28a5c1684f071e

+ 1 - 1
vendor/crashpad

@@ -1 +1 @@
-Subproject commit 51f78aefa872211022ae2d44260cbfd07a6aeb6a
+Subproject commit 600292f69f0f935ada02a02876ed489d21402620

+ 1 - 1
vendor/node

@@ -1 +1 @@
-Subproject commit 811cfe3fcd360179d3dd436e3d80e1b045adf633
+Subproject commit d4eba08b3ccd8f1e1045ad129384b18beb38b697