Chromium Code Reviews| Index: Source/modules/wake_lock/WakeLockController.cpp |
| diff --git a/Source/modules/wake_lock/WakeLockController.cpp b/Source/modules/wake_lock/WakeLockController.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1f21a4bc9d328d555802a6f7c4efda3c100ceb60 |
| --- /dev/null |
| +++ b/Source/modules/wake_lock/WakeLockController.cpp |
| @@ -0,0 +1,138 @@ |
| +// Copyright 2014 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 "config.h" |
| +#include "modules/wake_lock/WakeLockController.h" |
| + |
| +#include "modules/wake_lock/WakeLockPromiseResolver.h" |
| +#include "public/platform/WebWakeLockClient.h" |
| + |
| +namespace blink { |
| + |
| +WakeLockController::WakeLockController(Page& page, WebWakeLockClient* client) |
| + : PageLifecycleObserver(&page) |
| + , m_client(client) |
| +{ |
| + m_lockCounter.resize(WebWakeLockNone + 1); |
|
mlamouri (slow - plz ping)
2014/08/18 12:15:53
I'm not sure you need the +1, assuming you will no
redchenko
2014/08/19 16:42:20
Done.
|
| +} |
| + |
| +WakeLockController::~WakeLockController() |
| +{ |
| +} |
| + |
| +void WakeLockController::willBeDestroyed() |
| +{ |
| + if (m_client) |
| + m_client->wakeLockDestroyed(); |
| +} |
| + |
| +PassOwnPtrWillBeRawPtr<WakeLockController> WakeLockController::create(Page& page, WebWakeLockClient* client) |
| +{ |
| + return adoptPtrWillBeNoop(new WakeLockController(page, client)); |
| +} |
| + |
| +void WakeLockController::resetClient() |
| +{ |
| + m_client = 0; |
| +} |
| + |
| +const char* WakeLockController::supplementName() |
| +{ |
| + return "WakeLockController"; |
| +} |
| + |
| +WakeLockController* WakeLockController::from(Page* page) |
| +{ |
| + return static_cast<WakeLockController*>(WillBeHeapSupplement<Page>::from(page, supplementName())); |
| +} |
| + |
| +void WakeLockController::provideWakeLockTo(Page& page, WebWakeLockClient* client) |
| +{ |
| + WillBeHeapSupplement<Page>::provideTo(page, WakeLockController::supplementName(), WakeLockController::create(page, client)); |
| +} |
| + |
| +void WakeLockController::trace(Visitor* visitor) |
| +{ |
| + WillBeHeapSupplement<Page>::trace(visitor); |
| +} |
| + |
| +ScriptPromise WakeLockController::requestWakeLock(ScriptState* state, WebWakeLockType type) |
| +{ |
| + return requestLockOrUnlock(state, type, true); |
| +} |
| + |
| +ScriptPromise WakeLockController::requestWakeUnlock(ScriptState* state, WebWakeLockType type) |
| +{ |
| + return requestLockOrUnlock(state, type, false); |
| +} |
| + |
| +bool WakeLockController::isHeld(WebWakeLockType type) |
| +{ |
| + return (m_lockCounter[type] > 0); |
| +} |
| + |
| +ScriptPromise WakeLockController::requestLockOrUnlock(ScriptState* state, WebWakeLockType type, bool lock) |
| +{ |
| + WakeLockPromiseResolverOwnPtr resolver = WakeLockPromiseResolver::create(state, type); |
| + ScriptPromise promise = resolver->promise(); |
| + const int resolverId = resolver->id(); |
| + |
| + if (m_client) { |
| + m_resolvers.append(resolver.release()); |
| + if (lock) { |
| + m_client->requestWakeLock(type, resolverId, |
| + blink::WebSecurityOrigin(context->securityOrigin())); |
| + } else { |
| + m_client->requestWakeUnlock(type, resolverId); |
| + } |
| + } else { |
| + resolver->resolve(); |
| + } |
| + return promise; |
| +} |
| + |
| +void WakeLockController::onCreatedWakeLockSuccessful(int resolverId) |
| +{ |
| + WebWakeLockType type = resolveOrRejectById(resolverId, true); |
| + ++m_lockCounter[type]; |
|
mlamouri (slow - plz ping)
2014/08/18 12:15:53
Does that mean that we expect to handle multiple l
redchenko
2014/08/19 16:42:20
Done.
|
| +} |
| + |
| +void WakeLockController::onCreatedWakeLockFailed(int resolverId) |
| +{ |
| + resolveOrRejectById(resolverId, false); |
| +} |
| + |
| +void WakeLockController::onUnlockedWakeLockSuccessful(int resolverId) |
| +{ |
| + WebWakeLockType type = resolveOrRejectById(resolverId, true); |
| + if (m_lockCounter[type] > 0) |
| + --m_lockCounter[type]; |
| +} |
| + |
| +void WakeLockController::onUnlockedWakeLockFailed(int resolverId) |
| +{ |
| + resolveOrRejectById(resolverId, false); |
| +} |
| + |
| +WebWakeLockType WakeLockController::resolveOrRejectById(int resolverId, bool successful) |
| +{ |
| + for (Vector<WakeLockPromiseResolverOwnPtr>::iterator it = m_resolvers.begin(); |
| + it != m_resolvers.end(); |
| + ++it) { |
| + WakeLockPromiseResolverOwnPtr& resolver = (*it); |
|
mlamouri (slow - plz ping)
2014/08/18 12:15:53
nit: no need for the parenthesis.
redchenko
2014/08/19 16:42:20
Done.
|
| + const WebWakeLockType type = resolver->type(); |
| + if (resolver->id() == resolverId) { |
| + if (successful) |
| + resolver->resolve(); |
| + else |
| + resolver->reject(); |
| + m_resolvers.remove(it - m_resolvers.begin()); |
| + return type; |
| + } |
| + } |
| + ASSERT_NOT_REACHED(); |
| + return WebWakeLockNone; |
| +} |
| + |
| +} // namespace WebCore |