diff --git a/.gitignore b/.gitignore index 73bf6b25809..0c6f4cb79dd 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,3 @@ node_modules/ *.pyc debug.log npm-debug.log -atom/common/chrome_version.h diff --git a/atom/app/atom_main.cc b/atom/app/atom_main.cc index 47be348522f..26dcb942126 100644 --- a/atom/app/atom_main.cc +++ b/atom/app/atom_main.cc @@ -33,6 +33,7 @@ #include "atom/app/node_main.h" #include "atom/common/atom_command_line.h" +#include "base/at_exit.h" #include "base/i18n/icu_util.h" #if defined(OS_WIN) @@ -134,6 +135,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) { if (env->GetVar("ATOM_SHELL_INTERNAL_RUN_AS_NODE", &node_indicator) && node_indicator == "1") { // Now that argv conversion is done, we can finally start. + base::AtExitManager atexit_manager; base::i18n::InitializeICU(); return atom::NodeMain(argc, argv); } else if (env->GetVar("ATOM_SHELL_INTERNAL_CRASH_SERVICE", @@ -165,6 +167,7 @@ int main(int argc, const char* argv[]) { char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE"); if (node_indicator != NULL && strcmp(node_indicator, "1") == 0) { base::i18n::InitializeICU(); + base::AtExitManager atexit_manager; return atom::NodeMain(argc, const_cast(argv)); } diff --git a/atom/app/node_main.cc b/atom/app/node_main.cc index 356fe03e139..7efb1b40eec 100644 --- a/atom/app/node_main.cc +++ b/atom/app/node_main.cc @@ -4,10 +4,12 @@ #include "atom/app/node_main.h" +#include "atom/app/uv_task_runner.h" #include "atom/browser/javascript_environment.h" #include "atom/browser/node_debugger.h" #include "atom/common/node_includes.h" #include "base/command_line.h" +#include "base/thread_task_runner_handle.h" #include "gin/array_buffer.h" #include "gin/public/isolate_holder.h" #include "gin/v8_initializer.h" @@ -24,14 +26,20 @@ int NodeMain(int argc, char *argv[]) { int exit_code = 1; { + // Feed gin::PerIsolateData with a task runner. + uv_loop_t* loop = uv_default_loop(); + scoped_refptr uv_task_runner(new UvTaskRunner(loop)); + base::ThreadTaskRunnerHandle handle(uv_task_runner); + gin::V8Initializer::LoadV8Snapshot(); + gin::V8Initializer::LoadV8Natives(); gin::IsolateHolder::Initialize( gin::IsolateHolder::kNonStrictMode, gin::ArrayBufferAllocator::SharedInstance()); JavascriptEnvironment gin_env; node::Environment* env = node::CreateEnvironment( - gin_env.isolate(), uv_default_loop(), gin_env.context(), argc, argv, + gin_env.isolate(), loop, gin_env.context(), argc, argv, exec_argc, exec_argv); // Start our custom debugger implementation. diff --git a/atom/app/uv_task_runner.cc b/atom/app/uv_task_runner.cc new file mode 100644 index 00000000000..23463e44e2e --- /dev/null +++ b/atom/app/uv_task_runner.cc @@ -0,0 +1,55 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/app/uv_task_runner.h" + +#include "base/stl_util.h" + +namespace atom { + +UvTaskRunner::UvTaskRunner(uv_loop_t* loop) : loop_(loop) { +} + +UvTaskRunner::~UvTaskRunner() { + for (auto& iter : tasks_) { + uv_unref(reinterpret_cast(iter.first)); + delete iter.first; + } +} + +bool UvTaskRunner::PostDelayedTask(const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) { + uv_timer_t* timer = new uv_timer_t; + timer->data = this; + uv_timer_init(loop_, timer); + uv_timer_start(timer, UvTaskRunner::OnTimeout, delay.InMilliseconds(), 0); + tasks_[timer] = task; + return true; +} + +bool UvTaskRunner::RunsTasksOnCurrentThread() const { + return true; +} + +bool UvTaskRunner::PostNonNestableDelayedTask( + const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) { + return PostDelayedTask(from_here, task, delay);; +} + +// static +void UvTaskRunner::OnTimeout(uv_timer_t* timer) { + UvTaskRunner* self = static_cast(timer->data); + if (!ContainsKey(self->tasks_, timer)) + return; + + self->tasks_[timer].Run(); + self->tasks_.erase(timer); + uv_unref(reinterpret_cast(timer)); + delete timer; +} + +} // namespace atom diff --git a/atom/app/uv_task_runner.h b/atom/app/uv_task_runner.h new file mode 100644 index 00000000000..e4eac015535 --- /dev/null +++ b/atom/app/uv_task_runner.h @@ -0,0 +1,44 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_APP_UV_TASK_RUNNER_H_ +#define ATOM_APP_UV_TASK_RUNNER_H_ + +#include + +#include "base/callback.h" +#include "base/single_thread_task_runner.h" +#include "vendor/node/deps/uv/include/uv.h" + +namespace atom { + +// TaskRunner implementation that posts tasks into libuv's default loop. +class UvTaskRunner : public base::SingleThreadTaskRunner { + public: + explicit UvTaskRunner(uv_loop_t* loop); + ~UvTaskRunner() override; + + // base::SingleThreadTaskRunner: + bool PostDelayedTask(const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) override; + bool RunsTasksOnCurrentThread() const override; + bool PostNonNestableDelayedTask( + const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) override; + + private: + static void OnTimeout(uv_timer_t* timer); + + uv_loop_t* loop_; + + std::map tasks_; + + DISALLOW_COPY_AND_ASSIGN(UvTaskRunner); +}; + +} // namespace atom + +#endif // ATOM_APP_UV_TASK_RUNNER_H_ diff --git a/atom/browser/api/atom_api_content_tracing.cc b/atom/browser/api/atom_api_content_tracing.cc index e404a8f26ca..e4bf33c7b5c 100644 --- a/atom/browser/api/atom_api_content_tracing.cc +++ b/atom/browser/api/atom_api_content_tracing.cc @@ -19,27 +19,19 @@ using content::TracingController; namespace mate { template<> -struct Converter { +struct Converter { static bool FromV8(v8::Isolate* isolate, v8::Local val, - base::trace_event::CategoryFilter* out) { - std::string filter; - if (!ConvertFromV8(isolate, val, &filter)) - return false; - *out = base::trace_event::CategoryFilter(filter); - return true; - } -}; - -template<> -struct Converter { - static bool FromV8(v8::Isolate* isolate, - v8::Local val, - base::trace_event::TraceOptions* out) { - std::string options; + base::trace_event::TraceConfig* out) { + Dictionary options; if (!ConvertFromV8(isolate, val, &options)) return false; - return out->SetFromString(options); + std::string category_filter, trace_options; + if (!options.Get("categoryFilter", &category_filter) || + !options.Get("traceOptions", &trace_options)) + return false; + *out = base::trace_event::TraceConfig(category_filter, trace_options); + return true; } }; diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 59a50d5656c..5b723801cde 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -217,7 +217,7 @@ bool WebContents::ShouldCreateWebContents( int route_id, int main_frame_route_id, WindowContainerType window_container_type, - const base::string16& frame_name, + const std::string& frame_name, const GURL& target_url, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace) { @@ -362,14 +362,16 @@ void WebContents::DidFailProvisionalLoad( content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, - const base::string16& error_description) { + const base::string16& error_description, + bool was_ignored_by_handler) { Emit("did-fail-load", error_code, error_description); } void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, - const base::string16& error_description) { + const base::string16& error_description, + bool was_ignored_by_handler) { Emit("did-fail-load", error_code, error_description); } diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 45027309ea6..e75e88fd703 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -135,7 +135,7 @@ class WebContents : public mate::TrackableObject, int route_id, int main_frame_route_id, WindowContainerType window_container_type, - const base::string16& frame_name, + const std::string& frame_name, const GURL& target_url, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace) override; @@ -170,11 +170,13 @@ class WebContents : public mate::TrackableObject, void DidFailLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, - const base::string16& error_description) override; + const base::string16& error_description, + bool was_ignored_by_handler) override; void DidFailProvisionalLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url, int error_code, - const base::string16& error_description) override; + const base::string16& error_description, + bool was_ignored_by_handler) override; void DidStartLoading() override; void DidStopLoading() override; void DidGetResourceResponseStart( diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index c472b8742f0..b4f61d0f195 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -7,12 +7,14 @@ #include "atom/browser/api/trackable_object.h" #include "atom/browser/atom_browser_client.h" #include "atom/browser/atom_browser_context.h" +#include "atom/browser/bridge_task_runner.h" #include "atom/browser/browser.h" #include "atom/browser/javascript_environment.h" #include "atom/browser/node_debugger.h" #include "atom/common/api/atom_bindings.h" #include "atom/common/node_bindings.h" #include "base/command_line.h" +#include "base/thread_task_runner_handle.h" #include "chrome/browser/browser_process.h" #include "v8/include/v8-debug.h" @@ -64,9 +66,17 @@ void AtomBrowserMainParts::PostEarlyInitialization() { SetDPIFromGSettings(); #endif - // The ProxyResolverV8 has setup a complete V8 environment, in order to avoid - // conflicts we only initialize our V8 environment after that. - js_env_.reset(new JavascriptEnvironment); + { + // Temporary set the bridge_task_runner_ as current thread's task runner, + // so we can fool gin::PerIsolateData to use it as its task runner, instead + // of getting current message loop's task runner, which is null for now. + bridge_task_runner_ = new BridgeTaskRunner; + base::ThreadTaskRunnerHandle handle(bridge_task_runner_); + + // The ProxyResolverV8 has setup a complete V8 environment, in order to + // avoid conflicts we only initialize our V8 environment after that. + js_env_.reset(new JavascriptEnvironment); + } node_bindings_->Initialize(); diff --git a/atom/browser/atom_browser_main_parts.h b/atom/browser/atom_browser_main_parts.h index 97663a72404..a2909cac53d 100644 --- a/atom/browser/atom_browser_main_parts.h +++ b/atom/browser/atom_browser_main_parts.h @@ -20,6 +20,7 @@ class Browser; class JavascriptEnvironment; class NodeBindings; class NodeDebugger; +class BridgeTaskRunner; class AtomBrowserMainParts : public brightray::BrowserMainParts { public: @@ -54,6 +55,10 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts { // A fake BrowserProcess object that used to feed the source code from chrome. scoped_ptr fake_browser_process_; + // The gin::PerIsolateData requires a task runner to create, so we feed it + // with a task runner that will post all work to main loop. + scoped_refptr bridge_task_runner_; + scoped_ptr browser_; scoped_ptr js_env_; scoped_ptr node_bindings_; diff --git a/atom/browser/bridge_task_runner.cc b/atom/browser/bridge_task_runner.cc new file mode 100644 index 00000000000..24572f3990d --- /dev/null +++ b/atom/browser/bridge_task_runner.cc @@ -0,0 +1,42 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/browser/bridge_task_runner.h" + +#include "base/message_loop/message_loop.h" + +namespace atom { + +bool BridgeTaskRunner::PostDelayedTask( + const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) { + auto message_loop = base::MessageLoop::current(); + if (!message_loop) + return false; + + return message_loop->task_runner()->PostDelayedTask(from_here, task, delay); +} + +bool BridgeTaskRunner::RunsTasksOnCurrentThread() const { + auto message_loop = base::MessageLoop::current(); + if (!message_loop) + return false; + + return message_loop->task_runner()->RunsTasksOnCurrentThread(); +} + +bool BridgeTaskRunner::PostNonNestableDelayedTask( + const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) { + auto message_loop = base::MessageLoop::current(); + if (!message_loop) + return false; + + return message_loop->task_runner()->PostNonNestableDelayedTask( + from_here, task, delay); +} + +} // namespace atom diff --git a/atom/browser/bridge_task_runner.h b/atom/browser/bridge_task_runner.h new file mode 100644 index 00000000000..fb42aa3852f --- /dev/null +++ b/atom/browser/bridge_task_runner.h @@ -0,0 +1,35 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_BROWSER_BRIDGE_TASK_RUNNER_H_ +#define ATOM_BROWSER_BRIDGE_TASK_RUNNER_H_ + +#include "base/single_thread_task_runner.h" + +namespace atom { + +// Post all tasks to the current message loop's task runner if available, +// otherwise fail silently. +class BridgeTaskRunner : public base::SingleThreadTaskRunner { + public: + BridgeTaskRunner() {} + ~BridgeTaskRunner() override {} + + // base::SingleThreadTaskRunner: + bool PostDelayedTask(const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) override; + bool RunsTasksOnCurrentThread() const override; + bool PostNonNestableDelayedTask( + const tracked_objects::Location& from_here, + const base::Closure& task, + base::TimeDelta delay) override; + + private: + DISALLOW_COPY_AND_ASSIGN(BridgeTaskRunner); +}; + +} // namespace atom + +#endif // ATOM_BROWSER_BRIDGE_TASK_RUNNER_H_ diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 3e93c84b077..dc412cefb04 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -153,7 +153,7 @@ class Browser : public WindowListObserver { void OnWindowAllClosed() override; // Observers of the browser. - ObserverList observers_; + base::ObserverList observers_; // Whether "ready" event has been emitted. bool is_ready_; diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index b9294d38c93..10889a5ccaf 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -310,7 +310,7 @@ class NativeWindow : public content::WebContentsObserver, brightray::InspectableWebContents* inspectable_web_contents_; // Observers of this window. - ObserverList observers_; + base::ObserverList observers_; base::WeakPtrFactory weak_factory_; diff --git a/atom/browser/net/asar/url_request_asar_job.cc b/atom/browser/net/asar/url_request_asar_job.cc index de019f6d942..9b9a3c69d27 100644 --- a/atom/browser/net/asar/url_request_asar_job.cc +++ b/atom/browser/net/asar/url_request_asar_job.cc @@ -172,7 +172,7 @@ bool URLRequestAsarJob::IsRedirectResponse(GURL* location, #if defined(OS_WIN) // Follow a Windows shortcut. // We just resolve .lnk file, ignore others. - if (!LowerCaseEqualsASCII(file_path_.Extension(), ".lnk")) + if (!base::LowerCaseEqualsASCII(file_path_.Extension(), ".lnk")) return false; base::FilePath new_path = file_path_; @@ -193,7 +193,7 @@ bool URLRequestAsarJob::IsRedirectResponse(GURL* location, net::Filter* URLRequestAsarJob::SetupFilter() const { // Bug 9936 - .svgz files needs to be decompressed. - return LowerCaseEqualsASCII(file_path_.Extension(), ".svgz") + return base::LowerCaseEqualsASCII(file_path_.Extension(), ".svgz") ? net::Filter::GZipFactory() : NULL; } @@ -265,8 +265,7 @@ void URLRequestAsarJob::DidOpen(int result) { } if (type_ == TYPE_ASAR) { - int rv = stream_->Seek(base::File::FROM_BEGIN, - file_info_.offset, + int rv = stream_->Seek(file_info_.offset, base::Bind(&URLRequestAsarJob::DidSeek, weak_ptr_factory_.GetWeakPtr())); if (rv != net::ERR_IO_PENDING) { @@ -285,8 +284,7 @@ void URLRequestAsarJob::DidOpen(int result) { byte_range_.first_byte_position() + 1; if (remaining_bytes_ > 0 && byte_range_.first_byte_position() != 0) { - int rv = stream_->Seek(base::File::FROM_BEGIN, - byte_range_.first_byte_position(), + int rv = stream_->Seek(byte_range_.first_byte_position(), base::Bind(&URLRequestAsarJob::DidSeek, weak_ptr_factory_.GetWeakPtr())); if (rv != net::ERR_IO_PENDING) { diff --git a/atom/browser/net/url_request_fetch_job.cc b/atom/browser/net/url_request_fetch_job.cc index eacaada1935..a8a16e286b3 100644 --- a/atom/browser/net/url_request_fetch_job.cc +++ b/atom/browser/net/url_request_fetch_job.cc @@ -23,7 +23,7 @@ namespace { // Convert string to RequestType. net::URLFetcher::RequestType GetRequestType(const std::string& raw) { - std::string method = StringToUpperASCII(raw); + std::string method = base::StringToUpperASCII(raw); if (method.empty() || method == "GET") return net::URLFetcher::GET; else if (method == "POST") diff --git a/atom/browser/ui/atom_menu_model.h b/atom/browser/ui/atom_menu_model.h index fe19a8dc251..d091df9fb57 100644 --- a/atom/browser/ui/atom_menu_model.h +++ b/atom/browser/ui/atom_menu_model.h @@ -43,7 +43,7 @@ class AtomMenuModel : public ui::SimpleMenuModel { Delegate* delegate_; // weak ref. std::map roles_; - ObserverList observers_; + base::ObserverList observers_; DISALLOW_COPY_AND_ASSIGN(AtomMenuModel); }; diff --git a/atom/browser/ui/file_dialog_gtk.cc b/atom/browser/ui/file_dialog_gtk.cc index 463ad987a8b..5885ffe3611 100644 --- a/atom/browser/ui/file_dialog_gtk.cc +++ b/atom/browser/ui/file_dialog_gtk.cc @@ -22,7 +22,7 @@ gboolean FileFilterCaseInsensitive(const GtkFileFilterInfo* file_info, // Makes .* file extension matches all file types. if (*file_extension == ".*") return true; - return EndsWith(file_info->filename, *file_extension, false); + return base::EndsWith(file_info->filename, *file_extension, false); } // Deletes |data| when gtk_file_filter_add_custom() is done with it. diff --git a/atom/browser/ui/file_dialog_win.cc b/atom/browser/ui/file_dialog_win.cc index 7fa68d52113..b169471c6e9 100644 --- a/atom/browser/ui/file_dialog_win.cc +++ b/atom/browser/ui/file_dialog_win.cc @@ -252,7 +252,7 @@ bool ShowSaveDialog(atom::NativeWindow* parent_window, bool matched = false; for (size_t i = 0; i < filter.second.size(); ++i) { - if (EndsWith(file_name, filter.second[i], false)) { + if (base::EndsWith(file_name, filter.second[i], false)) { matched = true; break;; } diff --git a/atom/browser/ui/tray_icon.h b/atom/browser/ui/tray_icon.h index 55f1c41d19d..af774ddbfb4 100644 --- a/atom/browser/ui/tray_icon.h +++ b/atom/browser/ui/tray_icon.h @@ -67,7 +67,7 @@ class TrayIcon { TrayIcon(); private: - ObserverList observers_; + base::ObserverList observers_; DISALLOW_COPY_AND_ASSIGN(TrayIcon); }; diff --git a/atom/browser/ui/x/x_window_utils.cc b/atom/browser/ui/x/x_window_utils.cc index a15affb05f1..e57122839cd 100644 --- a/atom/browser/ui/x/x_window_utils.cc +++ b/atom/browser/ui/x/x_window_utils.cc @@ -41,7 +41,7 @@ void SetWindowType(::Window xwindow, const std::string& type) { XDisplay* xdisplay = gfx::GetXDisplay(); std::string type_prefix = "_NET_WM_WINDOW_TYPE_"; ::Atom window_type = XInternAtom( - xdisplay, (type_prefix + StringToUpperASCII(type)).c_str(), False); + xdisplay, (type_prefix + base::StringToUpperASCII(type)).c_str(), False); XChangeProperty(xdisplay, xwindow, XInternAtom(xdisplay, "_NET_WM_WINDOW_TYPE", False), XA_ATOM, diff --git a/atom/browser/window_list.cc b/atom/browser/window_list.cc index 9a2089e5743..b3bec5d08c1 100644 --- a/atom/browser/window_list.cc +++ b/atom/browser/window_list.cc @@ -13,7 +13,7 @@ namespace atom { // static -base::LazyInstance>::Leaky +base::LazyInstance>::Leaky WindowList::observers_ = LAZY_INSTANCE_INITIALIZER; // static diff --git a/atom/browser/window_list.h b/atom/browser/window_list.h index 7ba5a795756..bfb9a2b0aec 100644 --- a/atom/browser/window_list.h +++ b/atom/browser/window_list.h @@ -60,7 +60,8 @@ class WindowList { // A list of observers which will be notified of every window addition and // removal across all WindowLists. - static base::LazyInstance>::Leaky observers_; + static base::LazyInstance>::Leaky + observers_; static WindowList* instance_; diff --git a/atom/common/api/atom_api_native_image.cc b/atom/common/api/atom_api_native_image.cc index 879c7339429..df6c14dab35 100644 --- a/atom/common/api/atom_api_native_image.cc +++ b/atom/common/api/atom_api_native_image.cc @@ -14,6 +14,7 @@ #include "atom/common/node_includes.h" #include "base/base64.h" #include "base/strings/string_util.h" +#include "base/strings/pattern.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" #include "net/base/data_url.h" @@ -62,7 +63,7 @@ float GetScaleFactorFromPath(const base::FilePath& path) { // We don't try to convert string to float here because it is very very // expensive. for (unsigned i = 0; i < arraysize(kScaleFactorPairs); ++i) { - if (EndsWith(filename, kScaleFactorPairs[i].name, true)) + if (base::EndsWith(filename, kScaleFactorPairs[i].name, true)) return kScaleFactorPairs[i].scale; } @@ -104,7 +105,7 @@ bool PopulateImageSkiaRepsFromPath(gfx::ImageSkia* image, const base::FilePath& path) { bool succeed = false; std::string filename(path.BaseName().RemoveExtension().AsUTF8Unsafe()); - if (MatchPattern(filename, "*@*x")) + if (base::MatchPattern(filename, "*@*x")) // Don't search for other representations if the DPI has been specified. return AddImageSkiaRep(image, path, GetScaleFactorFromPath(path)); else @@ -119,8 +120,8 @@ bool PopulateImageSkiaRepsFromPath(gfx::ImageSkia* image, #if defined(OS_MACOSX) bool IsTemplateFilename(const base::FilePath& path) { - return (MatchPattern(path.value(), "*Template.*") || - MatchPattern(path.value(), "*Template@*x.*")); + return (base::MatchPattern(path.value(), "*Template.*") || + base::MatchPattern(path.value(), "*Template@*x.*")); } #endif diff --git a/atom/common/asar/archive.cc b/atom/common/asar/archive.cc index be99530c9c9..0b2f59ae0f1 100644 --- a/atom/common/asar/archive.cc +++ b/atom/common/asar/archive.cc @@ -136,7 +136,8 @@ bool Archive::Init() { } uint32 size; - if (!PickleIterator(Pickle(buf.data(), buf.size())).ReadUInt32(&size)) { + if (!base::PickleIterator(base::Pickle(buf.data(), buf.size())).ReadUInt32( + &size)) { LOG(ERROR) << "Failed to parse header size from " << path_.value(); return false; } @@ -149,7 +150,8 @@ bool Archive::Init() { } std::string header; - if (!PickleIterator(Pickle(buf.data(), buf.size())).ReadString(&header)) { + if (!base::PickleIterator(base::Pickle(buf.data(), buf.size())).ReadString( + &header)) { LOG(ERROR) << "Failed to parse header from " << path_.value(); return false; } diff --git a/atom/common/chrome_version.h b/atom/common/chrome_version.h index 54dd6bb5bb1..25005168378 100644 --- a/atom/common/chrome_version.h +++ b/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 "44.0.2403.125" +#define CHROME_VERSION_STRING "45.0.2454.85" #define CHROME_VERSION "v" CHROME_VERSION_STRING #endif // ATOM_COMMON_CHROME_VERSION_H_ diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index e17e8bf3db9..ef5ac757d9f 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -27,7 +27,6 @@ #include "third_party/WebKit/public/web/WebPluginParams.h" #include "third_party/WebKit/public/web/WebKit.h" #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" -#include "third_party/WebKit/Source/wtf/ArrayBufferContents.h" #include "atom/common/node_includes.h" @@ -205,7 +204,7 @@ void AtomRendererClient::DidCreateScriptContext( node_bindings_->LoadEnvironment(env); } -bool AtomRendererClient::ShouldFork(blink::WebFrame* frame, +bool AtomRendererClient::ShouldFork(blink::WebLocalFrame* frame, const GURL& url, const std::string& http_method, bool is_initial_navigation, diff --git a/atom/renderer/atom_renderer_client.h b/atom/renderer/atom_renderer_client.h index e59547cf8eb..206ed9f9b9b 100644 --- a/atom/renderer/atom_renderer_client.h +++ b/atom/renderer/atom_renderer_client.h @@ -45,7 +45,7 @@ class AtomRendererClient : public content::ContentRendererClient, blink::WebLocalFrame* frame, const blink::WebPluginParams& params, blink::WebPlugin** plugin) override; - bool ShouldFork(blink::WebFrame* frame, + bool ShouldFork(blink::WebLocalFrame* frame, const GURL& url, const std::string& http_method, bool is_initial_navigation, diff --git a/atom/renderer/guest_view_container.cc b/atom/renderer/guest_view_container.cc index c0bc1427d68..f50c3f78685 100644 --- a/atom/renderer/guest_view_container.cc +++ b/atom/renderer/guest_view_container.cc @@ -6,7 +6,9 @@ #include +#include "base/bind.h" #include "base/lazy_instance.h" +#include "base/message_loop/message_loop.h" #include "ui/gfx/geometry/size.h" namespace atom { @@ -20,7 +22,8 @@ static base::LazyInstance g_guest_view_container_map = } // namespace GuestViewContainer::GuestViewContainer(content::RenderFrame* render_frame) - : render_frame_(render_frame) { + : render_frame_(render_frame), + weak_ptr_factory_(this) { } GuestViewContainer::~GuestViewContainer() { @@ -55,4 +58,8 @@ void GuestViewContainer::DidResizeElement(const gfx::Size& new_size) { FROM_HERE, base::Bind(element_resize_callback_, new_size)); } +base::WeakPtr GuestViewContainer::GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + } // namespace atom diff --git a/atom/renderer/guest_view_container.h b/atom/renderer/guest_view_container.h index 2846265cb2a..3771c7adc4e 100644 --- a/atom/renderer/guest_view_container.h +++ b/atom/renderer/guest_view_container.h @@ -28,6 +28,7 @@ class GuestViewContainer : public content::BrowserPluginDelegate { // content::BrowserPluginDelegate: void SetElementInstanceID(int element_instance_id) final; void DidResizeElement(const gfx::Size& new_size) final; + base::WeakPtr GetWeakPtr() final; private: int element_instance_id_; @@ -35,6 +36,8 @@ class GuestViewContainer : public content::BrowserPluginDelegate { ResizeCallback element_resize_callback_; + base::WeakPtrFactory weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(GuestViewContainer); }; diff --git a/atom/renderer/lib/inspector.coffee b/atom/renderer/lib/inspector.coffee index 569f7e5ec17..126f68f9608 100644 --- a/atom/renderer/lib/inspector.coffee +++ b/atom/renderer/lib/inspector.coffee @@ -1,11 +1,9 @@ window.onload = -> - inspectorFrame = document.getElementById('inspector-app-iframe').contentWindow - # Use menu API to show context menu. - inspectorFrame.eval 'InspectorFrontendHost.showContextMenuAtPoint = parent.createMenu' + InspectorFrontendHost.showContextMenuAtPoint = createMenu # Use dialog API to override file chooser dialog. - inspectorFrame.eval 'WebInspector.createFileSelectorElement = parent.createFileSelectorElement' + WebInspector.createFileSelectorElement = createFileSelectorElement convertToMenuTemplate = (items) -> template = [] @@ -60,7 +58,3 @@ createFileSelectorElement = (callback) -> fileSelectorElement.style.display = 'none' fileSelectorElement.click = showFileChooserDialog.bind this, callback return fileSelectorElement - -# Exposed for iframe. -window.createMenu = createMenu -window.createFileSelectorElement = createFileSelectorElement diff --git a/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc b/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc index 89bac3b68dc..9064cd961bd 100644 --- a/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc +++ b/chromium_src/chrome/browser/printing/pdf_to_emf_converter.cc @@ -296,8 +296,7 @@ void PdfToEmfUtilityProcessHostClient::Start( // generate when sent to a metafile DC. utility_process_host_ = content::UtilityProcessHost::Create( - this, base::MessageLoop::current()->message_loop_proxy()) - ->AsWeakPtr(); + this, base::MessageLoop::current()->task_runner())->AsWeakPtr(); if (!utility_process_host_) return OnFailed(); // Should reply with OnProcessStarted(). diff --git a/chromium_src/chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc b/chromium_src/chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc index 4499b21aefe..fdc054f59fb 100644 --- a/chromium_src/chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc +++ b/chromium_src/chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc @@ -46,7 +46,8 @@ ui::ClipboardType ConvertClipboardType(uint32_t type) { // assume all data that is placed on the clipboard is UTF16 and pepper allows // arbitrary data so this change would require some reworking of the chrome // clipboard interface for custom data. -bool JumpToFormatInPickle(const base::string16& format, PickleIterator* iter) { +bool JumpToFormatInPickle(const base::string16& format, + base::PickleIterator* iter) { size_t size = 0; if (!iter->ReadSizeT(&size)) return false; @@ -66,22 +67,22 @@ bool JumpToFormatInPickle(const base::string16& format, PickleIterator* iter) { } bool IsFormatAvailableInPickle(const base::string16& format, - const Pickle& pickle) { - PickleIterator iter(pickle); + const base::Pickle& pickle) { + base::PickleIterator iter(pickle); return JumpToFormatInPickle(format, &iter); } std::string ReadDataFromPickle(const base::string16& format, - const Pickle& pickle) { + const base::Pickle& pickle) { std::string result; - PickleIterator iter(pickle); + base::PickleIterator iter(pickle); if (!JumpToFormatInPickle(format, &iter) || !iter.ReadString(&result)) return std::string(); return result; } bool WriteDataToPickle(const std::map& data, - Pickle* pickle) { + base::Pickle* pickle) { pickle->WriteSizeT(data.size()); for (std::map::const_iterator it = data.begin(); it != data.end(); @@ -187,7 +188,7 @@ int32_t PepperFlashClipboardMessageFilter::OnMsgIsFormatAvailable( std::string clipboard_data; clipboard->ReadData(ui::Clipboard::GetPepperCustomDataFormatType(), &clipboard_data); - Pickle pickle(clipboard_data.data(), clipboard_data.size()); + base::Pickle pickle(clipboard_data.data(), clipboard_data.size()); available = IsFormatAvailableInPickle(base::UTF8ToUTF16(format_name), pickle); } @@ -265,7 +266,7 @@ int32_t PepperFlashClipboardMessageFilter::OnMsgReadData( std::string clipboard_data; clipboard->ReadData(ui::Clipboard::GetPepperCustomDataFormatType(), &clipboard_data); - Pickle pickle(clipboard_data.data(), clipboard_data.size()); + base::Pickle pickle(clipboard_data.data(), clipboard_data.size()); if (IsFormatAvailableInPickle(format_name, pickle)) { result = PP_OK; clipboard_string = ReadDataFromPickle(format_name, pickle); @@ -340,7 +341,7 @@ int32_t PepperFlashClipboardMessageFilter::OnMsgWriteData( } if (custom_data_map.size() > 0) { - Pickle pickle; + base::Pickle pickle; if (WriteDataToPickle(custom_data_map, &pickle)) { scw.WritePickledData(pickle, ui::Clipboard::GetPepperCustomDataFormatType()); diff --git a/chromium_src/chrome/common/chrome_utility_messages.h b/chromium_src/chrome/common/chrome_utility_messages.h index 1de0756c0d5..f146e1823e8 100644 --- a/chromium_src/chrome/common/chrome_utility_messages.h +++ b/chromium_src/chrome/common/chrome_utility_messages.h @@ -27,7 +27,7 @@ #if defined(OS_WIN) // A vector of filters, each being a Tuple containing a display string (i.e. // "Text Files") and a filter pattern (i.e. "*.txt"). -typedef std::vector> +typedef std::vector> GetOpenFileNameFilter; #endif // OS_WIN diff --git a/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc b/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc index e01aea741fc..3ef6dff0c8b 100644 --- a/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc +++ b/chromium_src/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc @@ -56,17 +56,9 @@ void PepperSharedMemoryMessageFilter::OnHostMsgCreateSharedMemory( ->GetVarTracker() ->TrackSharedMemoryHandle(instance, host_shm_handle, size); - base::PlatformFile host_handle = -#if defined(OS_WIN) - host_shm_handle; -#elif defined(OS_POSIX) - host_shm_handle.fd; -#else -#error Not implemented. -#endif // We set auto_close to false since we need our file descriptor to // actually be duplicated on linux. The shared memory destructor will // close the original handle for us. - plugin_handle->set_shmem(host_->ShareHandleWithRemote(host_handle, false), - size); + plugin_handle->set_shmem( + host_->ShareSharedMemoryHandleWithRemote(host_shm_handle), size); } diff --git a/chromium_src/chrome/renderer/printing/print_web_view_helper.cc b/chromium_src/chrome/renderer/printing/print_web_view_helper.cc index cba75b651b6..20ac1fdc9b4 100644 --- a/chromium_src/chrome/renderer/printing/print_web_view_helper.cc +++ b/chromium_src/chrome/renderer/printing/print_web_view_helper.cc @@ -427,9 +427,10 @@ class PrepareFrameAndViewForPrint : public blink::WebViewClient, // blink::WebFrameClient override: virtual blink::WebFrame* createChildFrame( blink::WebLocalFrame* parent, + blink::WebTreeScopeType scope, const blink::WebString& name, blink::WebSandboxFlags sandboxFlags); - virtual void frameDetached(blink::WebFrame* frame); + virtual void frameDetached(blink::WebFrame* frame, DetachType type); private: void CallOnReady(); @@ -548,7 +549,8 @@ void PrepareFrameAndViewForPrint::CopySelection( blink::WebView* web_view = blink::WebView::create(this); owns_web_view_ = true; content::RenderView::ApplyWebPreferences(prefs, web_view); - web_view->setMainFrame(blink::WebLocalFrame::create(this)); + web_view->setMainFrame( + blink::WebLocalFrame::create(blink::WebTreeScopeType::Document, this)); frame_.Reset(web_view->mainFrame()->toWebLocalFrame()); node_to_print_.reset(); @@ -573,14 +575,17 @@ void PrepareFrameAndViewForPrint::didStopLoading() { blink::WebFrame* PrepareFrameAndViewForPrint::createChildFrame( blink::WebLocalFrame* parent, + blink::WebTreeScopeType scope, const blink::WebString& name, blink::WebSandboxFlags sandboxFlags) { - blink::WebFrame* frame = blink::WebLocalFrame::create(this); + blink::WebFrame* frame = blink::WebLocalFrame::create(scope, this); parent->appendChild(frame); return frame; } -void PrepareFrameAndViewForPrint::frameDetached(blink::WebFrame* frame) { +void PrepareFrameAndViewForPrint::frameDetached(blink::WebFrame* frame, + DetachType type) { + DCHECK(type == DetachType::Remove); if (frame->parent()) frame->parent()->removeChild(frame); frame->close(); diff --git a/common.gypi b/common.gypi index 0735d99dd91..a95e05620f0 100644 --- a/common.gypi +++ b/common.gypi @@ -85,6 +85,7 @@ '-Wno-deprecated-declarations', '-Wno-return-type', '-Wno-gnu-folding-constant', + '-Wno-shift-negative-value', ], }, 'conditions': [ @@ -99,6 +100,7 @@ '-Wno-unused-value', '-Wno-deprecated-declarations', '-Wno-return-type', + '-Wno-shift-negative-value', # Required when building as shared library. '-fPIC', ], diff --git a/docs/api/content-tracing.md b/docs/api/content-tracing.md index 9161f5f362a..2e05fc67668 100644 --- a/docs/api/content-tracing.md +++ b/docs/api/content-tracing.md @@ -33,10 +33,11 @@ are reached. Once all child processes have acknowledged the `getCategories` request the `callback` is invoked with an array of category groups. -### `contentTracing.startRecording(categoryFilter, traceOptions, callback)` +### `contentTracing.startRecording(options, callback)` -* `categoryFilter` String -* `traceOptions` String +* `options` Object + * `categoryFilter` String + * `traceOptions` String * `callback` Function Start recording on all processes. @@ -94,10 +95,11 @@ Trace data will be written into `resultFilePath` if it is not empty or into a temporary file. The actual file path will be passed to `callback` if it's not `null`. -### `contentTracing.startMonitoring(categoryFilter, traceOptions, callback)` +### `contentTracing.startMonitoring(options, callback)` -* `categoryFilter` String -* `traceOptions` String +* `options` Object + * `categoryFilter` String + * `traceOptions` String * `callback` Function Start monitoring on all processes. diff --git a/filenames.gypi b/filenames.gypi index af0c56e1ea6..807ccd32bb6 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -62,6 +62,8 @@ 'atom/app/atom_main_delegate_mac.mm', 'atom/app/node_main.cc', 'atom/app/node_main.h', + 'atom/app/uv_task_runner.cc', + 'atom/app/uv_task_runner.h', 'atom/browser/api/atom_api_app.cc', 'atom/browser/api/atom_api_app.h', 'atom/browser/api/atom_api_auto_updater.cc', @@ -125,6 +127,8 @@ 'atom/browser/atom_quota_permission_context.h', 'atom/browser/atom_speech_recognition_manager_delegate.cc', 'atom/browser/atom_speech_recognition_manager_delegate.h', + 'atom/browser/bridge_task_runner.cc', + 'atom/browser/bridge_task_runner.h', 'atom/browser/browser.cc', 'atom/browser/browser.h', 'atom/browser/browser_linux.cc', diff --git a/script/lib/config.py b/script/lib/config.py index c363a83a5f4..3fed12000b4 100644 --- a/script/lib/config.py +++ b/script/lib/config.py @@ -8,7 +8,7 @@ import sys BASE_URL = os.getenv('LIBCHROMIUMCONTENT_MIRROR') or \ 'http://github-janky-artifacts.s3.amazonaws.com/libchromiumcontent' -LIBCHROMIUMCONTENT_COMMIT = '42200d8ec0b77c7491d3a09611c23eb771e0862d' +LIBCHROMIUMCONTENT_COMMIT = 'f5489a774b719e9e979675c17b99ed45a05aacf7' PLATFORM = { 'cygwin': 'win32', diff --git a/script/update-clang.sh b/script/update-clang.sh index bf388c62fdb..5f9b00da7d9 100755 --- a/script/update-clang.sh +++ b/script/update-clang.sh @@ -8,7 +8,7 @@ # Do NOT CHANGE this if you don't know what you're doing -- see # https://code.google.com/p/chromium/wiki/UpdatingClang # Reverting problematic clang rolls is safe, though. -CLANG_REVISION=233105 +CLANG_REVISION=245965 # This is incremented when pushing a new build of Clang at the same revision. CLANG_SUB_REVISION=1 diff --git a/vendor/brightray b/vendor/brightray index 0bf81275795..4d8f5d879d4 160000 --- a/vendor/brightray +++ b/vendor/brightray @@ -1 +1 @@ -Subproject commit 0bf81275795b15eb361a1fd213ae9c7c1f60bdea +Subproject commit 4d8f5d879d484db54895c3456ded3a3d3246415d