Implement UndoManager's item() method
[WebKit-https.git] / Source / WebCore / bindings / v8 / custom / V8UndoManagerCustom.cpp
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "config.h"
26
27 #if ENABLE(UNDO_MANAGER)
28
29 #include "V8UndoManager.h"
30
31 #include "DOMTransaction.h"
32 #include "ExceptionCode.h"
33 #include "V8DOMTransaction.h"
34
35 namespace WebCore {
36
37 v8::Handle<v8::Value> V8UndoManager::transactCallback(const v8::Arguments& args)
38 {
39     INC_STATS("DOM.UndoManager.transact");
40     if (args.Length() < 1)
41         return throwNotEnoughArgumentsError(args.GetIsolate());
42     UndoManager* imp = V8UndoManager::toNative(args.Holder());
43
44     EXCEPTION_BLOCK(v8::Local<v8::Value>, dictionary, MAYBE_MISSING_PARAMETER(args, 0, DefaultIsUndefined));
45     if (dictionary.IsEmpty() || !dictionary->IsObject())
46         return throwTypeError("The first argument is not of type DOMTransaction.", args.GetIsolate());
47
48     EXCEPTION_BLOCK(bool, merge, MAYBE_MISSING_PARAMETER(args, 1, DefaultIsUndefined)->BooleanValue());
49
50     RefPtr<DOMTransaction> transaction = DOMTransaction::create(WorldContextHandle(UseCurrentWorld));
51     transaction->setData(dictionary);
52
53     ExceptionCode ec = 0;
54     imp->transact(transaction, merge, ec);
55     if (ec)
56         return setDOMException(ec, args.GetIsolate());
57     return v8Undefined();
58 }
59
60 v8::Handle<v8::Value> V8UndoManager::itemCallback(const v8::Arguments& args)
61 {
62     INC_STATS("DOM.UndoManager.item");
63     if (args.Length() < 1)
64         return throwNotEnoughArgumentsError(args.GetIsolate());
65     UndoManager* imp = V8UndoManager::toNative(args.Holder());
66
67     EXCEPTION_BLOCK(unsigned, index, toUInt32(MAYBE_MISSING_PARAMETER(args, 0, DefaultIsUndefined)));
68
69     if (index >= imp->length())
70         return v8::Null(args.GetIsolate());
71
72     const UndoManagerEntry& entry = imp->item(index);
73
74     v8::Handle<v8::Array> result = v8::Array::New(entry.size());
75     v8::Isolate* isolate = args.GetIsolate();
76     for (size_t index = 0; index < entry.size(); ++index) {
77         UndoStep* step = entry[index].get();
78         if (step->isDOMTransaction())
79             result->Set(v8Integer(index, isolate), static_cast<DOMTransaction*>(step)->data());
80         else {
81             // FIXME: We shouldn't be creating new object each time we return.
82             // Object for the same native editing command should always be the same.
83             v8::Handle<v8::Object> object = v8::Object::New();
84             object->Set(v8::String::NewSymbol("label"), v8::String::New("[Editing command]"));
85             result->Set(v8Integer(index, isolate), object);
86         }
87     }
88     return result;
89 }
90
91 } // namespace WebCore
92
93 #endif // ENABLE(UNDO_MANAGER)