Changeset 126392 in webkit
- Timestamp:
- Aug 22, 2012 10:58:10 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r126391 r126392 1 2012-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 1 11 2012-08-22 Dominic Mazzoni <dmazzoni@google.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r126391 r126392 1 2012-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 1 35 2012-08-22 Dominic Mazzoni <dmazzoni@google.com> 2 36 -
trunk/Source/WebCore/bindings/js/JSUndoManagerCustom.cpp
r125865 r126392 39 39 } 40 40 41 JSValue JSUndoManager::item(ExecState*) 42 { 43 // FIXME: implement JSC bindings 44 return jsUndefined(); 45 } 46 41 47 } 42 48 -
trunk/Source/WebCore/bindings/v8/DOMTransaction.cpp
r126258 r126392 97 97 } 98 98 99 v8::Handle<v8:: Function> DOMTransaction::getFunction(const char* propertyName)99 v8::Handle<v8::Value> DOMTransaction::data() 100 100 { 101 101 v8::Handle<v8::Object> wrapper = v8::Handle<v8::Object>::Cast(toV8(this)); 102 102 if (wrapper.IsEmpty()) 103 return v8::Handle<v8::Value>(); 104 return wrapper->GetHiddenValue(V8HiddenPropertyName::domTransactionData()); 105 } 106 107 void 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 115 v8::Handle<v8::Function> DOMTransaction::getFunction(const char* propertyName) 116 { 117 v8::Handle<v8::Value> dictionary = data(); 118 if (dictionary.IsEmpty() || !dictionary->IsObject()) 103 119 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)); 110 122 if (function.IsEmpty() || !function->IsFunction()) 111 123 return v8::Handle<v8::Function>(); -
trunk/Source/WebCore/bindings/v8/DOMTransaction.h
r126258 r126392 48 48 virtual bool isDOMTransaction() const OVERRIDE { return true; } 49 49 50 v8::Handle<v8::Value> data(); 51 void setData(v8::Handle<v8::Value>); 52 50 53 UndoManager* undoManager() const { return m_undoManager; } 51 54 void setUndoManager(UndoManager* undoManager) { m_undoManager = undoManager; } -
trunk/Source/WebCore/bindings/v8/custom/V8UndoManagerCustom.cpp
r125865 r126392 32 32 #include "ExceptionCode.h" 33 33 #include "V8DOMTransaction.h" 34 #include "V8HiddenPropertyName.h"35 34 36 35 namespace WebCore { … … 50 49 51 50 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); 55 52 56 53 ExceptionCode ec = 0; … … 61 58 } 62 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 63 91 } // namespace WebCore 64 92 -
trunk/Source/WebCore/editing/UndoManager.cpp
r126258 r126392 161 161 } 162 162 163 UndoManagerEntry 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 163 174 void UndoManager::registerUndoStep(PassRefPtr<UndoStep> step) 164 175 { -
trunk/Source/WebCore/editing/UndoManager.h
r126258 r126392 63 63 void redo(ExceptionCode& = ASSERT_NO_EXCEPTION); 64 64 65 UndoManagerEntry item(unsigned index) const; 66 65 67 unsigned length() const { return m_undoStack.size() + m_redoStack.size(); } 66 68 unsigned position() const { return m_redoStack.size(); } -
trunk/Source/WebCore/editing/UndoManager.idl
r125865 r126392 42 42 raises(DOMException); 43 43 44 [Custom] sequence<DOMTransaction> item(in unsigned long index); 45 44 46 readonly attribute unsigned long length; 45 47 readonly attribute unsigned long position;
Note: See TracChangeset
for help on using the changeset viewer.