Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2200)

Unified Diff: base/message_pump_mac.h

Issue 17078005: Move message_pump to base/message_loop. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/message_pump_libevent_unittest.cc ('k') | base/message_pump_mac.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/message_pump_mac.h
diff --git a/base/message_pump_mac.h b/base/message_pump_mac.h
deleted file mode 100644
index 2dd5ecf568823b6f5b9ded88b6d8b0c2bb2248a0..0000000000000000000000000000000000000000
--- a/base/message_pump_mac.h
+++ /dev/null
@@ -1,337 +0,0 @@
-// Copyright (c) 2012 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.
-
-// The basis for all native run loops on the Mac is the CFRunLoop. It can be
-// used directly, it can be used as the driving force behind the similar
-// Foundation NSRunLoop, and it can be used to implement higher-level event
-// loops such as the NSApplication event loop.
-//
-// This file introduces a basic CFRunLoop-based implementation of the
-// MessagePump interface called CFRunLoopBase. CFRunLoopBase contains all
-// of the machinery necessary to dispatch events to a delegate, but does not
-// implement the specific run loop. Concrete subclasses must provide their
-// own DoRun and Quit implementations.
-//
-// A concrete subclass that just runs a CFRunLoop loop is provided in
-// MessagePumpCFRunLoop. For an NSRunLoop, the similar MessagePumpNSRunLoop
-// is provided.
-//
-// For the application's event loop, an implementation based on AppKit's
-// NSApplication event system is provided in MessagePumpNSApplication.
-//
-// Typically, MessagePumpNSApplication only makes sense on a Cocoa
-// application's main thread. If a CFRunLoop-based message pump is needed on
-// any other thread, one of the other concrete subclasses is preferrable.
-// MessagePumpMac::Create is defined, which returns a new NSApplication-based
-// or NSRunLoop-based MessagePump subclass depending on which thread it is
-// called on.
-
-#ifndef BASE_MESSAGE_PUMP_MAC_H_
-#define BASE_MESSAGE_PUMP_MAC_H_
-
-#include "base/message_pump.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-
-#if !defined(__OBJC__)
-class NSAutoreleasePool;
-#else // !defined(__OBJC__)
-#if defined(OS_IOS)
-#import <Foundation/Foundation.h>
-#else
-#import <AppKit/AppKit.h>
-
-// Clients must subclass NSApplication and implement this protocol if they use
-// MessagePumpMac.
-@protocol CrAppProtocol
-// Must return true if -[NSApplication sendEvent:] is currently on the stack.
-// See the comment for |CreateAutoreleasePool()| in the cc file for why this is
-// necessary.
-- (BOOL)isHandlingSendEvent;
-@end
-#endif // !defined(OS_IOS)
-#endif // !defined(__OBJC__)
-
-namespace base {
-
-class RunLoop;
-class TimeTicks;
-
-class MessagePumpCFRunLoopBase : public MessagePump {
- // Needs access to CreateAutoreleasePool.
- friend class MessagePumpScopedAutoreleasePool;
- public:
- MessagePumpCFRunLoopBase();
-
- // Subclasses should implement the work they need to do in MessagePump::Run
- // in the DoRun method. MessagePumpCFRunLoopBase::Run calls DoRun directly.
- // This arrangement is used because MessagePumpCFRunLoopBase needs to set
- // up and tear down things before and after the "meat" of DoRun.
- virtual void Run(Delegate* delegate) OVERRIDE;
- virtual void DoRun(Delegate* delegate) = 0;
-
- virtual void ScheduleWork() OVERRIDE;
- virtual void ScheduleDelayedWork(const TimeTicks& delayed_work_time) OVERRIDE;
-
- protected:
- virtual ~MessagePumpCFRunLoopBase();
-
- // Accessors for private data members to be used by subclasses.
- CFRunLoopRef run_loop() const { return run_loop_; }
- int nesting_level() const { return nesting_level_; }
- int run_nesting_level() const { return run_nesting_level_; }
-
- // Sets this pump's delegate. Signals the appropriate sources if
- // |delegateless_work_| is true. |delegate| can be NULL.
- void SetDelegate(Delegate* delegate);
-
- // Return an autorelease pool to wrap around any work being performed.
- // In some cases, CreateAutoreleasePool may return nil intentionally to
- // preventing an autorelease pool from being created, allowing any
- // objects autoreleased by work to fall into the current autorelease pool.
- virtual NSAutoreleasePool* CreateAutoreleasePool();
-
- private:
- // Timer callback scheduled by ScheduleDelayedWork. This does not do any
- // work, but it signals work_source_ so that delayed work can be performed
- // within the appropriate priority constraints.
- static void RunDelayedWorkTimer(CFRunLoopTimerRef timer, void* info);
-
- // Perform highest-priority work. This is associated with work_source_
- // signalled by ScheduleWork or RunDelayedWorkTimer. The static method calls
- // the instance method; the instance method returns true if it resignalled
- // work_source_ to be called again from the loop.
- static void RunWorkSource(void* info);
- bool RunWork();
-
- // Perform idle-priority work. This is normally called by PreWaitObserver,
- // but is also associated with idle_work_source_. When this function
- // actually does perform idle work, it will resignal that source. The
- // static method calls the instance method; the instance method returns
- // true if idle work was done.
- static void RunIdleWorkSource(void* info);
- bool RunIdleWork();
-
- // Perform work that may have been deferred because it was not runnable
- // within a nested run loop. This is associated with
- // nesting_deferred_work_source_ and is signalled by
- // MaybeScheduleNestingDeferredWork when returning from a nested loop,
- // so that an outer loop will be able to perform the necessary tasks if it
- // permits nestable tasks.
- static void RunNestingDeferredWorkSource(void* info);
- bool RunNestingDeferredWork();
-
- // Schedules possible nesting-deferred work to be processed before the run
- // loop goes to sleep, exits, or begins processing sources at the top of its
- // loop. If this function detects that a nested loop had run since the
- // previous attempt to schedule nesting-deferred work, it will schedule a
- // call to RunNestingDeferredWorkSource.
- void MaybeScheduleNestingDeferredWork();
-
- // Observer callback responsible for performing idle-priority work, before
- // the run loop goes to sleep. Associated with idle_work_observer_.
- static void PreWaitObserver(CFRunLoopObserverRef observer,
- CFRunLoopActivity activity, void* info);
-
- // Observer callback called before the run loop processes any sources.
- // Associated with pre_source_observer_.
- static void PreSourceObserver(CFRunLoopObserverRef observer,
- CFRunLoopActivity activity, void* info);
-
- // Observer callback called when the run loop starts and stops, at the
- // beginning and end of calls to CFRunLoopRun. This is used to maintain
- // nesting_level_. Associated with enter_exit_observer_.
- static void EnterExitObserver(CFRunLoopObserverRef observer,
- CFRunLoopActivity activity, void* info);
-
- // Called by EnterExitObserver after performing maintenance on nesting_level_.
- // This allows subclasses an opportunity to perform additional processing on
- // the basis of run loops starting and stopping.
- virtual void EnterExitRunLoop(CFRunLoopActivity activity);
-
- // The thread's run loop.
- CFRunLoopRef run_loop_;
-
- // The timer, sources, and observers are described above alongside their
- // callbacks.
- CFRunLoopTimerRef delayed_work_timer_;
- CFRunLoopSourceRef work_source_;
- CFRunLoopSourceRef idle_work_source_;
- CFRunLoopSourceRef nesting_deferred_work_source_;
- CFRunLoopObserverRef pre_wait_observer_;
- CFRunLoopObserverRef pre_source_observer_;
- CFRunLoopObserverRef enter_exit_observer_;
-
- // (weak) Delegate passed as an argument to the innermost Run call.
- Delegate* delegate_;
-
- // The time that delayed_work_timer_ is scheduled to fire. This is tracked
- // independently of CFRunLoopTimerGetNextFireDate(delayed_work_timer_)
- // to be able to reset the timer properly after waking from system sleep.
- // See PowerStateNotification.
- CFAbsoluteTime delayed_work_fire_time_;
-
- // The recursion depth of the currently-executing CFRunLoopRun loop on the
- // run loop's thread. 0 if no run loops are running inside of whatever scope
- // the object was created in.
- int nesting_level_;
-
- // The recursion depth (calculated in the same way as nesting_level_) of the
- // innermost executing CFRunLoopRun loop started by a call to Run.
- int run_nesting_level_;
-
- // The deepest (numerically highest) recursion depth encountered since the
- // most recent attempt to run nesting-deferred work.
- int deepest_nesting_level_;
-
- // "Delegateless" work flags are set when work is ready to be performed but
- // must wait until a delegate is available to process it. This can happen
- // when a MessagePumpCFRunLoopBase is instantiated and work arrives without
- // any call to Run on the stack. The Run method will check for delegateless
- // work on entry and redispatch it as needed once a delegate is available.
- bool delegateless_work_;
- bool delegateless_idle_work_;
-
- DISALLOW_COPY_AND_ASSIGN(MessagePumpCFRunLoopBase);
-};
-
-class MessagePumpCFRunLoop : public MessagePumpCFRunLoopBase {
- public:
- MessagePumpCFRunLoop();
-
- virtual void DoRun(Delegate* delegate) OVERRIDE;
- virtual void Quit() OVERRIDE;
-
- protected:
- virtual ~MessagePumpCFRunLoop();
-
- private:
- virtual void EnterExitRunLoop(CFRunLoopActivity activity) OVERRIDE;
-
- // True if Quit is called to stop the innermost MessagePump
- // (innermost_quittable_) but some other CFRunLoopRun loop (nesting_level_)
- // is running inside the MessagePump's innermost Run call.
- bool quit_pending_;
-
- DISALLOW_COPY_AND_ASSIGN(MessagePumpCFRunLoop);
-};
-
-class MessagePumpNSRunLoop : public MessagePumpCFRunLoopBase {
- public:
- BASE_EXPORT MessagePumpNSRunLoop();
-
- virtual void DoRun(Delegate* delegate) OVERRIDE;
- virtual void Quit() OVERRIDE;
-
- protected:
- virtual ~MessagePumpNSRunLoop();
-
- private:
- // A source that doesn't do anything but provide something signalable
- // attached to the run loop. This source will be signalled when Quit
- // is called, to cause the loop to wake up so that it can stop.
- CFRunLoopSourceRef quit_source_;
-
- // False after Quit is called.
- bool keep_running_;
-
- DISALLOW_COPY_AND_ASSIGN(MessagePumpNSRunLoop);
-};
-
-#if defined(OS_IOS)
-// This is a fake message pump. It attaches sources to the main thread's
-// CFRunLoop, so PostTask() will work, but it is unable to drive the loop
-// directly, so calling Run() or Quit() are errors.
-class MessagePumpUIApplication : public MessagePumpCFRunLoopBase {
- public:
- MessagePumpUIApplication();
- virtual void DoRun(Delegate* delegate) OVERRIDE;
- virtual void Quit() OVERRIDE;
-
- // This message pump can not spin the main message loop directly. Instead,
- // call |Attach()| to set up a delegate. It is an error to call |Run()|.
- virtual void Attach(Delegate* delegate);
-
- protected:
- virtual ~MessagePumpUIApplication();
-
- private:
- base::RunLoop* run_loop_;
-
- DISALLOW_COPY_AND_ASSIGN(MessagePumpUIApplication);
-};
-
-#else
-
-class MessagePumpNSApplication : public MessagePumpCFRunLoopBase {
- public:
- MessagePumpNSApplication();
-
- virtual void DoRun(Delegate* delegate) OVERRIDE;
- virtual void Quit() OVERRIDE;
-
- protected:
- virtual ~MessagePumpNSApplication();
-
- private:
- // False after Quit is called.
- bool keep_running_;
-
- // True if DoRun is managing its own run loop as opposed to letting
- // -[NSApplication run] handle it. The outermost run loop in the application
- // is managed by -[NSApplication run], inner run loops are handled by a loop
- // in DoRun.
- bool running_own_loop_;
-
- DISALLOW_COPY_AND_ASSIGN(MessagePumpNSApplication);
-};
-
-class MessagePumpCrApplication : public MessagePumpNSApplication {
- public:
- MessagePumpCrApplication();
-
- protected:
- virtual ~MessagePumpCrApplication() {}
-
- // Returns nil if NSApp is currently in the middle of calling
- // -sendEvent. Requires NSApp implementing CrAppProtocol.
- virtual NSAutoreleasePool* CreateAutoreleasePool() OVERRIDE;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(MessagePumpCrApplication);
-};
-#endif // !defined(OS_IOS)
-
-class MessagePumpMac {
- public:
- // If not on the main thread, returns a new instance of
- // MessagePumpNSRunLoop.
- //
- // On the main thread, if NSApp exists and conforms to
- // CrAppProtocol, creates an instances of MessagePumpCrApplication.
- //
- // Otherwise creates an instance of MessagePumpNSApplication using a
- // default NSApplication.
- static MessagePump* Create();
-
-#if !defined(OS_IOS)
- // If a pump is created before the required CrAppProtocol is
- // created, the wrong MessagePump subclass could be used.
- // UsingCrApp() returns false if the message pump was created before
- // NSApp was initialized, or if NSApp does not implement
- // CrAppProtocol. NSApp must be initialized before calling.
- BASE_EXPORT static bool UsingCrApp();
-
- // Wrapper to query -[NSApp isHandlingSendEvent] from C++ code.
- // Requires NSApp to implement CrAppProtocol.
- BASE_EXPORT static bool IsHandlingSendEvent();
-#endif // !defined(OS_IOS)
-
- private:
- DISALLOW_IMPLICIT_CONSTRUCTORS(MessagePumpMac);
-};
-
-} // namespace base
-
-#endif // BASE_MESSAGE_PUMP_MAC_H_
« no previous file with comments | « base/message_pump_libevent_unittest.cc ('k') | base/message_pump_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698