return -1;
}
-// Run the NotificationCallback and returns whether browser is shuting down.
bool NotificationCallbackWrapper(
const ProcessSingleton::NotificationCallback& callback,
- const base::CommandLine& command_line,
- const base::FilePath& current_directory) {
- callback.Run(command_line, current_directory);
+ const base::CommandLine& cmd,
+ const base::FilePath& cwd) {
+ // Make sure the callback is called after app gets ready.
+ if (Browser::Get()->is_ready()) {
+ callback.Run(cmd, cwd);
+ } else {
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner(
+ base::ThreadTaskRunnerHandle::Get());
+ task_runner->PostTask(
+ FROM_HERE, base::Bind(base::IgnoreResult(callback), cmd, cwd));
+ }
+ // ProcessSingleton needs to know whether current process is quiting.
return !Browser::Get()->is_shutting_down();
}
auto handle = Session::CreateFrom(isolate(), browser_context);
default_session_.Reset(isolate(), handle.ToV8());
- if (process_singleton_startup_lock_.get())
- process_singleton_startup_lock_->Unlock();
-
Emit("ready");
}
base::FilePath user_dir;
PathService::Get(brightray::DIR_USER_DATA, &user_dir);
-
- process_singleton_startup_lock_.reset(
- new ProcessSingletonStartupLock(
- base::Bind(NotificationCallbackWrapper, callback)));
- process_singleton_.reset(
- new ProcessSingleton(
- user_dir,
- process_singleton_startup_lock_->AsNotificationCallback()));
-
- if (Browser::Get()->is_ready())
- process_singleton_startup_lock_->Unlock();
+ process_singleton_.reset(new ProcessSingleton(
+ user_dir, base::Bind(NotificationCallbackWrapper, callback)));
switch (process_singleton_->NotifyOtherProcessOrCreate()) {
case ProcessSingleton::NotifyResult::LOCK_ERROR:
case ProcessSingleton::NotifyResult::PROFILE_IN_USE:
case ProcessSingleton::NotifyResult::PROCESS_NOTIFIED:
process_singleton_.reset();
- process_singleton_startup_lock_.reset();
return true;
case ProcessSingleton::NotifyResult::PROCESS_NONE:
default: // Shouldn't be needed, but VS warns if it is not there.
#include "atom/browser/browser_observer.h"
#include "atom/common/native_mate_converters/callback.h"
#include "chrome/browser/process_singleton.h"
-#include "chrome/browser/process_singleton_startup_lock.h"
#include "content/public/browser/gpu_data_manager_observer.h"
#include "native_mate/handle.h"
v8::Global<v8::Value> default_session_;
scoped_ptr<ProcessSingleton> process_singleton_;
- scoped_ptr<ProcessSingletonStartupLock> process_singleton_startup_lock_;
DISALLOW_COPY_AND_ASSIGN(App);
};
+++ /dev/null
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/process_singleton_startup_lock.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-
-ProcessSingletonStartupLock::ProcessSingletonStartupLock(
- const ProcessSingleton::NotificationCallback& original_callback)
- : locked_(true),
- original_callback_(original_callback) {}
-
-ProcessSingletonStartupLock::~ProcessSingletonStartupLock() {}
-
-ProcessSingleton::NotificationCallback
-ProcessSingletonStartupLock::AsNotificationCallback() {
- return base::Bind(&ProcessSingletonStartupLock::NotificationCallbackImpl,
- base::Unretained(this));
-}
-
-void ProcessSingletonStartupLock::Unlock() {
- DCHECK(CalledOnValidThread());
- locked_ = false;
-
- // Replay the command lines of the messages which were received while the
- // ProcessSingleton was locked. Only replay each message once.
- std::set<DelayedStartupMessage> replayed_messages;
- for (std::vector<DelayedStartupMessage>::const_iterator it =
- saved_startup_messages_.begin();
- it != saved_startup_messages_.end(); ++it) {
- if (replayed_messages.find(*it) != replayed_messages.end())
- continue;
- original_callback_.Run(base::CommandLine(it->first), it->second);
- replayed_messages.insert(*it);
- }
- saved_startup_messages_.clear();
-}
-
-bool ProcessSingletonStartupLock::NotificationCallbackImpl(
- const base::CommandLine& command_line,
- const base::FilePath& current_directory) {
- if (locked_) {
- // If locked, it means we are not ready to process this message because
- // we are probably in a first run critical phase.
- saved_startup_messages_.push_back(
- std::make_pair(command_line.argv(), current_directory));
- return true;
- } else {
- return original_callback_.Run(command_line, current_directory);
- }
-}
+++ /dev/null
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_PROCESS_SINGLETON_STARTUP_LOCK_H_
-#define CHROME_BROWSER_PROCESS_SINGLETON_STARTUP_LOCK_H_
-
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/threading/non_thread_safe.h"
-#include "chrome/browser/process_singleton.h"
-
-// Provides a ProcessSingleton::NotificationCallback that can queue up
-// command-line invocations during startup and execute them when startup
-// completes.
-//
-// The object starts in a locked state. |Unlock()| must be called
-// when the process is prepared to handle command-line invocations.
-//
-// Once unlocked, notifications are forwarded to a wrapped NotificationCallback.
-class ProcessSingletonStartupLock : public base::NonThreadSafe {
- public:
- explicit ProcessSingletonStartupLock(
- const ProcessSingleton::NotificationCallback& original_callback);
- ~ProcessSingletonStartupLock();
-
- // Returns the ProcessSingleton::NotificationCallback.
- // The callback is only valid during the lifetime of the
- // ProcessSingletonStartupLock instance.
- ProcessSingleton::NotificationCallback AsNotificationCallback();
-
- // Executes previously queued command-line invocations and allows future
- // invocations to be executed immediately.
- void Unlock();
-
- bool locked() { return locked_; }
-
- private:
- typedef std::pair<base::CommandLine::StringVector, base::FilePath>
- DelayedStartupMessage;
-
- bool NotificationCallbackImpl(const base::CommandLine& command_line,
- const base::FilePath& current_directory);
-
- bool locked_;
- std::vector<DelayedStartupMessage> saved_startup_messages_;
- ProcessSingleton::NotificationCallback original_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(ProcessSingletonStartupLock);
-};
-
-#endif // CHROME_BROWSER_PROCESS_SINGLETON_STARTUP_LOCK_H_
'chromium_src/chrome/browser/browser_process.cc',
'chromium_src/chrome/browser/browser_process.h',
'chromium_src/chrome/browser/chrome_process_finder_win.cc',
+ 'chromium_src/chrome/browser/chrome_process_finder_win.h',
'chromium_src/chrome/browser/chrome_notification_types.h',
'chromium_src/chrome/browser/extensions/global_shortcut_listener.cc',
'chromium_src/chrome/browser/extensions/global_shortcut_listener.h',
'chromium_src/chrome/browser/printing/print_preview_message_handler.cc',
'chromium_src/chrome/browser/printing/print_preview_message_handler.h',
'chromium_src/chrome/browser/process_singleton_posix.cc',
- 'chromium_src/chrome/browser/process_singleton_startup_lock.cc',
'chromium_src/chrome/browser/process_singleton_win.cc',
+ 'chromium_src/chrome/browser/process_singleton.h',
'chromium_src/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc',
'chromium_src/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h',
'chromium_src/chrome/browser/renderer_host/pepper/pepper_broker_message_filter.cc',