Changeset 126392 in webkit


Ignore:
Timestamp:
Aug 22, 2012 10:58:10 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Implement UndoManager's item() method
https://bugs.webkit.org/show_bug.cgi?id=94671

Patch by Sukolsak Sakshuwong <sukolsak@google.com> on 2012-08-22
Reviewed by Ryosuke Niwa.

Source/WebCore:

This patch implements UndoManager's item() method and its V8 custom binding.
We need to use custom binding here because we need to return user objects
that are stored in a hidden property of DOMTransaction wrappers, not returning
the wrappers themselves.

Test: editing/undomanager/undomanager-item.html

  • bindings/js/JSUndoManagerCustom.cpp:

(WebCore::JSUndoManager::item):
(WebCore):

  • bindings/v8/DOMTransaction.cpp:

(WebCore::DOMTransaction::data):
(WebCore):
(WebCore::DOMTransaction::setData):
(WebCore::DOMTransaction::getFunction):

  • bindings/v8/DOMTransaction.h:
  • bindings/v8/custom/V8UndoManagerCustom.cpp:

(WebCore::V8UndoManager::transactCallback):
(WebCore::V8UndoManager::itemCallback):
(WebCore):

  • editing/UndoManager.cpp:

(WebCore::UndoManager::item):
(WebCore):

  • editing/UndoManager.h:

(UndoManager):

  • editing/UndoManager.idl:

LayoutTests:

  • editing/undomanager/undomanager-item-expected.txt: Added.
  • editing/undomanager/undomanager-item.html: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r126391 r126392  
     12012-08-22  Sukolsak Sakshuwong  <sukolsak@google.com>
     2
     3        Implement UndoManager's item() method
     4        https://bugs.webkit.org/show_bug.cgi?id=94671
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * editing/undomanager/undomanager-item-expected.txt: Added.
     9        * editing/undomanager/undomanager-item.html: Added.
     10
    1112012-08-22  Dominic Mazzoni  <dmazzoni@google.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r126391 r126392  
     12012-08-22  Sukolsak Sakshuwong  <sukolsak@google.com>
     2
     3        Implement UndoManager's item() method
     4        https://bugs.webkit.org/show_bug.cgi?id=94671
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        This patch implements UndoManager's item() method and its V8 custom binding.
     9        We need to use custom binding here because we need to return user objects
     10        that are stored in a hidden property of DOMTransaction wrappers, not returning
     11        the wrappers themselves.
     12
     13        Test: editing/undomanager/undomanager-item.html
     14
     15        * bindings/js/JSUndoManagerCustom.cpp:
     16        (WebCore::JSUndoManager::item):
     17        (WebCore):
     18        * bindings/v8/DOMTransaction.cpp:
     19        (WebCore::DOMTransaction::data):
     20        (WebCore):
     21        (WebCore::DOMTransaction::setData):
     22        (WebCore::DOMTransaction::getFunction):
     23        * bindings/v8/DOMTransaction.h:
     24        * bindings/v8/custom/V8UndoManagerCustom.cpp:
     25        (WebCore::V8UndoManager::transactCallback):
     26        (WebCore::V8UndoManager::itemCallback):
     27        (WebCore):
     28        * editing/UndoManager.cpp:
     29        (WebCore::UndoManager::item):
     30        (WebCore):
     31        * editing/UndoManager.h:
     32        (UndoManager):
     33        * editing/UndoManager.idl:
     34
    1352012-08-22  Dominic Mazzoni  <dmazzoni@google.com>
    236
  • trunk/Source/WebCore/bindings/js/JSUndoManagerCustom.cpp

    r125865 r126392  
    3939}
    4040
     41JSValue JSUndoManager::item(ExecState*)
     42{
     43    // FIXME: implement JSC bindings
     44    return jsUndefined();
     45}
     46
    4147}
    4248
  • trunk/Source/WebCore/bindings/v8/DOMTransaction.cpp

    r126258 r126392  
    9797}
    9898
    99 v8::Handle<v8::Function> DOMTransaction::getFunction(const char* propertyName)
     99v8::Handle<v8::Value> DOMTransaction::data()
    100100{
    101101    v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(toV8(this));
    102102    if (wrapper.IsEmpty())
     103        return v8::Handle<v8::Value>();
     104    return wrapper->GetHiddenValue(V8HiddenPropertyName::domTransactionData());
     105}
     106
     107void DOMTransaction::setData(v8::Handle<v8::Value> newData)
     108{
     109    v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(toV8(this));
     110    if (wrapper.IsEmpty())
     111        return;
     112    wrapper->SetHiddenValue(V8HiddenPropertyName::domTransactionData(), newData);
     113}
     114
     115v8::Handle<v8::Function> DOMTransaction::getFunction(const char* propertyName)
     116{
     117    v8::Handle<v8::Value> dictionary = data();
     118    if (dictionary.IsEmpty() || !dictionary->IsObject())
    103119        return v8::Handle<v8::Function>();
    104 
    105     v8::Local<v8::Value> data = wrapper->GetHiddenValue(V8HiddenPropertyName::domTransactionData());
    106     if (data.IsEmpty() || !data->IsObject())
    107         return v8::Handle<v8::Function>();
    108 
    109     v8::Local<v8::Value> function = v8::Local<v8::Object>::Cast(data)->Get(v8::String::NewSymbol(propertyName));
     120   
     121    v8::Local<v8::Value> function = v8::Handle<v8::Object>::Cast(dictionary)->Get(v8::String::NewSymbol(propertyName));
    110122    if (function.IsEmpty() || !function->IsFunction())
    111123        return v8::Handle<v8::Function>();
  • trunk/Source/WebCore/bindings/v8/DOMTransaction.h

    r126258 r126392  
    4848    virtual bool isDOMTransaction() const OVERRIDE { return true; }
    4949
     50    v8::Handle<v8::Value> data();
     51    void setData(v8::Handle<v8::Value>);
     52
    5053    UndoManager* undoManager() const { return m_undoManager; }
    5154    void setUndoManager(UndoManager* undoManager) { m_undoManager = undoManager; }
  • trunk/Source/WebCore/bindings/v8/custom/V8UndoManagerCustom.cpp

    r125865 r126392  
    3232#include "ExceptionCode.h"
    3333#include "V8DOMTransaction.h"
    34 #include "V8HiddenPropertyName.h"
    3534
    3635namespace WebCore {
     
    5049
    5150    RefPtr<DOMTransaction> transaction = DOMTransaction::create(WorldContextHandle(UseCurrentWorld));
    52     v8::Handle<v8::Object> transactionWrapper = v8::Handle<v8::Object>::Cast(toV8(transaction.get()));
    53 
    54     transactionWrapper->SetHiddenValue(V8HiddenPropertyName::domTransactionData(), dictionary);
     51    transaction->setData(dictionary);
    5552
    5653    ExceptionCode ec = 0;
     
    6158}
    6259
     60v8::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
    6391} // namespace WebCore
    6492
  • trunk/Source/WebCore/editing/UndoManager.cpp

    r126258 r126392  
    161161}
    162162
     163UndoManagerEntry UndoManager::item(unsigned index) const
     164{
     165    ASSERT(index < length());
     166    if (index < m_redoStack.size()) {
     167        UndoManagerEntry entry = *m_redoStack[index];
     168        entry.reverse();
     169        return entry;
     170    }
     171    return *m_undoStack[length() - index - 1];
     172}
     173
    163174void UndoManager::registerUndoStep(PassRefPtr<UndoStep> step)
    164175{
  • trunk/Source/WebCore/editing/UndoManager.h

    r126258 r126392  
    6363    void redo(ExceptionCode& = ASSERT_NO_EXCEPTION);
    6464
     65    UndoManagerEntry item(unsigned index) const;
     66
    6567    unsigned length() const { return m_undoStack.size() + m_redoStack.size(); }
    6668    unsigned position() const { return m_redoStack.size(); }
  • trunk/Source/WebCore/editing/UndoManager.idl

    r125865 r126392  
    4242            raises(DOMException);
    4343
     44        [Custom] sequence<DOMTransaction> item(in unsigned long index);
     45
    4446        readonly attribute unsigned long length;
    4547        readonly attribute unsigned long position;
Note: See TracChangeset for help on using the changeset viewer.