1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/renderer/user_gestures_native_handler.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/bind.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/renderer/script_context.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/WebKit/public/web/WebScopedUserGesture.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace extensions {
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)UserGesturesNativeHandler::UserGesturesNativeHandler(ScriptContext* context)
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : ObjectBackedNativeHandler(context) {
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RouteFunction("IsProcessingUserGesture",
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                base::Bind(&UserGesturesNativeHandler::IsProcessingUserGesture,
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           base::Unretained(this)));
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RouteFunction("RunWithUserGesture",
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                base::Bind(&UserGesturesNativeHandler::RunWithUserGesture,
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           base::Unretained(this)));
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RouteFunction("RunWithoutUserGesture",
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                base::Bind(&UserGesturesNativeHandler::RunWithoutUserGesture,
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           base::Unretained(this)));
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserGesturesNativeHandler::IsProcessingUserGesture(
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const v8::FunctionCallbackInfo<v8::Value>& args) {
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  args.GetReturnValue().Set(v8::Boolean::New(
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      args.GetIsolate(),
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      blink::WebUserGestureIndicator::isProcessingUserGesture()));
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserGesturesNativeHandler::RunWithUserGesture(
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const v8::FunctionCallbackInfo<v8::Value>& args) {
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blink::WebScopedUserGesture user_gesture;
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK_EQ(args.Length(), 1);
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK(args[0]->IsFunction());
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  v8::Handle<v8::Value> no_args;
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  context()->CallFunction(v8::Handle<v8::Function>::Cast(args[0]), 0, &no_args);
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void UserGesturesNativeHandler::RunWithoutUserGesture(
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const v8::FunctionCallbackInfo<v8::Value>& args) {
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  blink::WebUserGestureIndicator::consumeUserGesture();
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK_EQ(args.Length(), 1);
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CHECK(args[0]->IsFunction());
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  v8::Handle<v8::Value> no_args;
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  context()->CallFunction(v8::Handle<v8::Function>::Cast(args[0]), 0, &no_args);
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace extensions
53