Use the callOnMainThread version that takes an std::function in BlobResourceHandle::start()
https://bugs.webkit.org/show_bug.cgi?id=133886

Reviewed by Andreas Kling.

Also replace a couple of NSAutoreleasePools with @autoreleasepool and an OwnPtr with an std::unique_ptr.

* page/scrolling/mac/ScrollingThreadMac.mm:
(WebCore::ScrollingThread::threadRunLoopSourceCallback):
* platform/mac/SharedTimerMac.mm:
(WebCore::PowerObserver::PowerObserver):
(WebCore::timerFired):
(WebCore::setSharedTimerFireInterval):
(WebCore::PowerObserver::create): Deleted.
(WebCore::PowerObserver::didReceiveSystemPowerNotification): Deleted.
* platform/network/BlobResourceHandle.cpp:
(WebCore::BlobResourceHandle::start):
(WebCore::delayedStartBlobResourceHandle): Deleted.
* platform/network/BlobResourceHandle.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@169955 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/platform/mac/SharedTimerMac.mm b/Source/WebCore/platform/mac/SharedTimerMac.mm
index 5bee333..7f8e5e3 100644
--- a/Source/WebCore/platform/mac/SharedTimerMac.mm
+++ b/Source/WebCore/platform/mac/SharedTimerMac.mm
@@ -43,16 +43,10 @@
     WTF_MAKE_NONCOPYABLE(PowerObserver);
     
 public:
-    static PassOwnPtr<PowerObserver> create()
-    {
-        return adoptPtr(new PowerObserver);
-    }
+    PowerObserver();
     ~PowerObserver();
 
 private:
-    PowerObserver();
-
-    static void didReceiveSystemPowerNotification(void* context, io_service_t, uint32_t messageType, void* messageArgument);
     void didReceiveSystemPowerNotification(io_service_t, uint32_t messageType, void* messageArgument);
 
     void restartSharedTimer();
@@ -65,11 +59,13 @@
 
 PowerObserver::PowerObserver()
     : m_powerConnection(0)
-    , m_notificationPort(0)
+    , m_notificationPort(nullptr)
     , m_notifierReference(0)
     , m_dispatchQueue(dispatch_queue_create("com.apple.WebKit.PowerObserver", 0))
 {
-    m_powerConnection = IORegisterForSystemPower(this, &m_notificationPort, didReceiveSystemPowerNotification, &m_notifierReference);
+    m_powerConnection = IORegisterForSystemPower(this, &m_notificationPort, [](void* context, io_service_t service, uint32_t messageType, void* messageArgument) {
+        static_cast<PowerObserver*>(context)->didReceiveSystemPowerNotification(service, messageType, messageArgument);
+    }, &m_notifierReference);
     if (!m_powerConnection)
         return;
 
@@ -88,11 +84,6 @@
     IONotificationPortDestroy(m_notificationPort);
 }
 
-void PowerObserver::didReceiveSystemPowerNotification(void* context, io_service_t service, uint32_t messageType, void* messageArgument)
-{
-    static_cast<PowerObserver*>(context)->didReceiveSystemPowerNotification(service, messageType, messageArgument);
-}
-
 void PowerObserver::didReceiveSystemPowerNotification(io_service_t, uint32_t messageType, void* messageArgument)
 {
     IOAllowPowerChange(m_powerConnection, reinterpret_cast<long>(messageArgument));
@@ -118,7 +109,7 @@
     timerFired(0, 0);
 }
 
-static PowerObserver* PowerObserver;
+static PowerObserver* powerObserver;
 
 void setSharedTimerFiredFunction(void (*f)())
 {
@@ -129,9 +120,9 @@
 
 static void timerFired(CFRunLoopTimerRef, void*)
 {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    sharedTimerFiredFunction();
-    [pool drain];
+    @autoreleasepool {
+        sharedTimerFiredFunction();
+    }
 }
 
 void setSharedTimerFireInterval(double interval)
@@ -147,8 +138,8 @@
     sharedTimer = CFRunLoopTimerCreate(0, fireDate, 0, 0, 0, timerFired, 0);
     CFRunLoopAddTimer(CFRunLoopGetCurrent(), sharedTimer, kCFRunLoopCommonModes);
     
-    if (!PowerObserver)
-        PowerObserver = PowerObserver::create().leakPtr();
+    if (!powerObserver)
+        powerObserver = std::make_unique<PowerObserver>().release();
 }
 
 void stopSharedTimer()
diff --git a/Source/WebCore/platform/network/BlobResourceHandle.cpp b/Source/WebCore/platform/network/BlobResourceHandle.cpp
index 3046cd1..491a9c3 100644
--- a/Source/WebCore/platform/network/BlobResourceHandle.cpp
+++ b/Source/WebCore/platform/network/BlobResourceHandle.cpp
@@ -205,24 +205,19 @@
     // BlobResourceHandle doesn't wait for didReceiveResponse, and it currently cannot be used for downloading.
 }
 
-void delayedStartBlobResourceHandle(void* context)
-{
-    RefPtr<BlobResourceHandle> handle = adoptRef(static_cast<BlobResourceHandle*>(context));
-    handle->doStart();
-}
-
 void BlobResourceHandle::start()
 {
-    if (m_async) {
-        // Keep BlobResourceHandle alive until delayedStartBlobResourceHandle runs.
-        ref();
-
-        // Finish this async call quickly and return.
-        callOnMainThread(delayedStartBlobResourceHandle, this);
+    if (!m_async) {
+        doStart();
         return;
     }
 
-    doStart();
+    RefPtr<BlobResourceHandle> handle(this);
+
+    // Finish this async call quickly and return.
+    callOnMainThread([handle] {
+        handle->doStart();
+    });
 }
 
 void BlobResourceHandle::doStart()
diff --git a/Source/WebCore/platform/network/BlobResourceHandle.h b/Source/WebCore/platform/network/BlobResourceHandle.h
index 6acb7fc..732ff790 100644
--- a/Source/WebCore/platform/network/BlobResourceHandle.h
+++ b/Source/WebCore/platform/network/BlobResourceHandle.h
@@ -58,8 +58,6 @@
     bool aborted() const { return m_aborted; }
 
 private:
-    friend void delayedStartBlobResourceHandle(void*);
-
     BlobResourceHandle(BlobData*, const ResourceRequest&, ResourceHandleClient*, bool async);
     virtual ~BlobResourceHandle();