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

Side by Side Diff: Source/bindings/core/v8/ScrollStateCallbackToScriptValue.cpp

Issue 1057603002: Expose scroll customization for touch to JS (behind REF). (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address haraken's comments. Created 5 years, 5 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/page/scrolling/ScrollStateCallback.h"
7
8 #include "bindings/core/v8/V8Element.h"
9 #include "bindings/core/v8/V8ScrollState.h"
10
11 namespace blink {
12
13 namespace {
14
15 static const char applyScrollRequiresScrollStateObject[] = "applyScroll takes a ScrollState object.";
16 static const char distributeScrollRequiresScrollStateObject[] = "distributeScrol l takes a ScrollState object.";
17
18 // Key in |data| passed to scrollStateFunctionCallback.
19 const char* kHandlerFunction = "handler_function";
20
21 } // namespace
22
23 static void scrollStateFunctionCallback(const v8::FunctionCallbackInfo<v8::Value >& info)
24 {
25 v8::Isolate* isolate = info.GetIsolate();
26
27 v8::Local<v8::Object> data = info.Data().As<v8::Object>();
28
29 v8::Local<v8::Value> localScrollStateCallback;
30 v8::MaybeLocal<v8::Value> maybeLocalScrollStateCallback
31 = data->Get(v8::String::NewFromUtf8(info.GetIsolate(), kHandlerFunction) );
32 if (!maybeLocalScrollStateCallback.ToLocal(&localScrollStateCallback))
haraken 2015/06/30 07:08:30 if (data->Get(...).ToLocal()) Nit: We want to avo
33 return;
34
35 ASSERT(!localScrollStateCallback->IsUndefined());
36 ASSERT(localScrollStateCallback->IsExternal());
37 ScrollStateCallback* scrollStateCallback
38 = static_cast<ScrollStateCallback*>(localScrollStateCallback.As<v8::Exte rnal>()->Value());
39
40 ASSERT(scrollStateCallback->callbackType() != ScrollStateCallback::CallbackT ype::UNSET);
41 bool isDistributeScroll
42 = scrollStateCallback->callbackType() == ScrollStateCallback::CallbackTy pe::DISTRIBUTE_SCROLL;
43 const char* errorMessage
44 = isDistributeScroll ? distributeScrollRequiresScrollStateObject : apply ScrollRequiresScrollStateObject;
45 if (!info[0]->IsObject()) {
46 info.GetIsolate()->ThrowException(v8::Exception::TypeError(v8::String::N ewFromUtf8(isolate, errorMessage)));
47 return;
48 }
49 v8::Local<v8::Object> scrollStateObject = info[0]->ToObject();
50
51 if (!V8ScrollState::wrapperTypeInfo.domTemplateFunction(isolate)->HasInstanc e(scrollStateObject)) {
52 info.GetIsolate()->ThrowException(v8::Exception::TypeError(v8::String::N ewFromUtf8(isolate, errorMessage)));
53 return;
54 }
55
56 ScrollState* scrollState = toScriptWrappable(scrollStateObject)->toImpl<Scro llState>();
57 ASSERT(scrollState);
58
59 Element* targetElement = toScriptWrappable(info.Holder())->toImpl<Element>() ;
60 ASSERT(targetElement);
61 scrollStateCallback->handleEventForElement(*targetElement, scrollState);
62 }
63
64 ScriptValue scrollStateCallbackToScriptValue(ScrollStateCallback& scrollStateCal lback, ScriptState* scriptState)
65 {
66 v8::Isolate* isolate = scriptState->isolate();
67 v8::Local<v8::Signature> signature
68 = v8::Signature::New(isolate, V8Element::wrapperTypeInfo.domTemplateFunc tion(isolate));
69
70 v8::Local<v8::Object> data = v8::Object::New(isolate);
71 data->Set(v8::String::NewFromUtf8(isolate, kHandlerFunction), v8::External:: New(isolate, &scrollStateCallback));
72
73 v8::Local<v8::FunctionTemplate> functionTemplate
74 = v8::FunctionTemplate::New(scriptState->isolate(), &scrollStateFunction Callback, data, signature);
75
76 ASSERT(scrollStateCallback.callbackType() != ScrollStateCallback::CallbackTy pe::UNSET);
77
78 bool isDistributeScroll = scrollStateCallback.callbackType()
79 == ScrollStateCallback::CallbackType::DISTRIBUTE_SCROLL;
80 functionTemplate->SetClassName(v8AtomicString(isolate, isDistributeScroll ? "distributeScroll" : "applyScroll"));
81 v8::MaybeLocal<v8::Function> function = functionTemplate->GetFunction(script State->context());
82 return ScriptValue(scriptState, function);
83 }
84
85 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698