Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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 "content/shell/renderer/test_runner/text_input_controller.h" | |
| 6 | |
| 7 #include "gin/arguments.h" | |
| 8 #include "gin/handle.h" | |
| 9 #include "gin/object_template_builder.h" | |
| 10 #include "third_party/WebKit/public/web/WebBindings.h" | |
| 11 #include "third_party/WebKit/public/web/WebFrame.h" | |
| 12 #include "third_party/WebKit/public/web/WebInputEvent.h" | |
| 13 #include "third_party/WebKit/public/web/WebKit.h" | |
| 14 #include "third_party/WebKit/public/web/WebRange.h" | |
| 15 #include "third_party/WebKit/public/web/WebView.h" | |
| 16 #include "v8/include/v8.h" | |
| 17 | |
| 18 namespace WebTestRunner { | |
| 19 | |
| 20 // static | |
| 21 gin::WrapperInfo TextInputController::kWrapperInfo = { | |
| 22 gin::kEmbedderNativeGin | |
| 23 }; | |
| 24 | |
| 25 // static | |
| 26 void TextInputController::Install(blink::WebFrame* frame) { | |
| 27 v8::Isolate* isolate = blink::mainThreadIsolate(); | |
| 28 v8::HandleScope handle_scope(isolate); | |
| 29 v8::Handle<v8::Context> context = frame->mainWorldScriptContext(); | |
| 30 if (context.IsEmpty()) | |
| 31 return; | |
| 32 | |
| 33 v8::Context::Scope context_scope(context); | |
| 34 | |
| 35 gin::Handle<TextInputController> controller = | |
| 36 gin::CreateHandle(isolate, new TextInputController(frame)); | |
| 37 v8::Handle<v8::Object> global = context->Global(); | |
| 38 global->Set(gin::StringToV8(isolate, "textInputController"), | |
| 39 controller.ToV8()); | |
| 40 } | |
| 41 | |
| 42 TextInputController::TextInputController(blink::WebFrame* frame) | |
| 43 : frame_(frame) {} | |
| 44 | |
| 45 TextInputController::~TextInputController() {} | |
| 46 | |
| 47 gin::ObjectTemplateBuilder TextInputController::GetObjectTemplateBuilder( | |
| 48 v8::Isolate* isolate) { | |
| 49 return gin::Wrappable<TextInputController>::GetObjectTemplateBuilder(isolate) | |
| 50 .SetMethod("insertText", &TextInputController::InsertText) | |
| 51 .SetMethod("unmarkText", &TextInputController::UnmarkText) | |
| 52 .SetMethod("doCommand", &TextInputController::DoCommand) | |
| 53 .SetMethod("setMarkedText", &TextInputController::SetMarkedText) | |
| 54 .SetMethod("hasMarkedText", &TextInputController::HasMarkedText) | |
| 55 .SetMethod("markedRange", &TextInputController::MarkedRange) | |
| 56 .SetMethod("selectedRange", &TextInputController::SelectedRange) | |
| 57 .SetMethod("firstRectForCharacterRange", &TextInputController::FirstRectFo rCharacterRange) | |
| 58 .SetMethod("setComposition", &TextInputController::SetComposition); | |
| 59 } | |
| 60 | |
| 61 void TextInputController::InsertText(gin::Arguments* args) { | |
|
jochen (gone - plz use gerrit)
2014/02/10 12:32:05
if you declare InsertText(const std::string& text)
| |
| 62 if (args->PeekNext().IsEmpty() || !args->PeekNext()->IsString()) | |
| 63 return; | |
| 64 | |
| 65 v8::Handle<v8::Value> value; | |
| 66 args->GetNext(&value); | |
| 67 //frame_->view()->confirmComposition(WebString::fromUTF8(###WHAT-GOES-HERE)); | |
| 68 } | |
| 69 | |
| 70 void TextInputController::UnmarkText() { | |
| 71 frame_->view()->confirmComposition(); | |
| 72 } | |
| 73 | |
| 74 void TextInputController::DoCommand(gin::Arguments* args) { | |
| 75 if (!args->PeekNext().IsEmpty() && !args->PeekNext()->IsString()) { | |
| 76 //frame_->executeCommand(WebString::fromUTF8(##WHAT-WE-PASS-HERE?)); | |
| 77 } | |
| 78 } | |
| 79 | |
| 80 void TextInputController::SetMarkedText(gin::Arguments* args) { | |
| 81 /*if (arguments.size() < 3 || !arguments[0].isString() || | |
| 82 !arguments[1].isNumber() || !arguments[2].isNumber()) | |
| 83 return; | |
| 84 | |
| 85 WebString text(WebString::fromUTF8(arguments[0].toString())); | |
| 86 int start = arguments[1].toInt32(); | |
| 87 int length = arguments[2].toInt32(); | |
| 88 | |
| 89 // Split underline into up to 3 elements (before, selection, and after). | |
| 90 std::vector<WebCompositionUnderline> underlines; | |
| 91 WebCompositionUnderline underline; | |
| 92 if (!start) { | |
| 93 underline.endOffset = length; | |
| 94 } else { | |
| 95 underline.endOffset = start; | |
| 96 underlines.push_back(underline); | |
| 97 underline.startOffset = start; | |
| 98 underline.endOffset = start + length; | |
| 99 } | |
| 100 underline.thick = true; | |
| 101 underlines.push_back(underline); | |
| 102 if (start + length < static_cast<int>(text.length())) { | |
| 103 underline.startOffset = underline.endOffset; | |
| 104 underline.endOffset = text.length(); | |
| 105 underline.thick = false; | |
| 106 underlines.push_back(underline); | |
| 107 } | |
| 108 | |
| 109 frame_->view()->setComposition(text, underlines, start, start + length); | |
| 110 */ | |
| 111 } | |
| 112 | |
| 113 void TextInputController::HasMarkedText() { | |
| 114 // result->set(frame_->hasMarkedText()); | |
| 115 } | |
| 116 | |
| 117 void TextInputController::MarkedRange() { | |
| 118 blink::WebRange range = frame_->markedRange(); | |
| 119 std::vector<int> int_array(2); | |
| 120 int_array[0] = range.startOffset(); | |
| 121 int_array[1] = range.endOffset(); | |
| 122 | |
| 123 NPObject* result_array = blink::WebBindings::makeIntArray(int_array); | |
| 124 //result->set(result_array); | |
| 125 blink::WebBindings::releaseObject(result_array); | |
| 126 } | |
| 127 | |
| 128 void TextInputController::SelectedRange() { | |
| 129 blink::WebRange range = frame_->selectionRange(); | |
| 130 std::vector<int> int_array(2); | |
| 131 int_array[0] = range.startOffset(); | |
| 132 int_array[1] = range.endOffset(); | |
| 133 | |
| 134 NPObject* result_array = blink::WebBindings::makeIntArray(int_array); | |
| 135 //result->set(result_array); | |
| 136 blink::WebBindings::releaseObject(result_array); | |
| 137 } | |
| 138 | |
| 139 void TextInputController::FirstRectForCharacterRange(gin::Arguments* args) { | |
|
jochen (gone - plz use gerrit)
2014/02/10 12:32:05
same for the return value. If you return a vector<
| |
| 140 /*if (arguments.size() < 2 || !arguments[0].isNumber() || | |
| 141 !arguments[1].isNumber()) | |
| 142 return; | |
| 143 */ | |
| 144 blink::WebRect rect; | |
| 145 /* if (!frame_->firstRectForCharacterRange( | |
| 146 arguments[0].toInt32(), arguments[1].toInt32(), rect)) | |
| 147 return; | |
| 148 | |
| 149 */ | |
| 150 std::vector<int> int_array(4); | |
| 151 int_array[0] = rect.x; | |
| 152 int_array[1] = rect.y; | |
| 153 int_array[2] = rect.width; | |
| 154 int_array[3] = rect.height; | |
| 155 | |
| 156 NPObject* result_array = blink::WebBindings::makeIntArray(int_array); | |
| 157 //result->set(result_array); | |
| 158 blink::WebBindings::releaseObject(result_array); | |
| 159 } | |
| 160 | |
| 161 void TextInputController::SetComposition(gin::Arguments* args) { | |
| 162 if (args->PeekNext().IsEmpty()) | |
| 163 return; | |
| 164 | |
| 165 // Sends a keydown event with key code = 0xE5 to emulate input method | |
| 166 // behavior. | |
| 167 blink::WebKeyboardEvent key_down; | |
| 168 key_down.type = blink::WebInputEvent::RawKeyDown; | |
| 169 key_down.modifiers = 0; | |
| 170 key_down.windowsKeyCode = 0xE5; // VKEY_PROCESSKEY | |
| 171 key_down.setKeyIdentifierFromWindowsKeyCode(); | |
| 172 frame_->view()->handleInputEvent(key_down); | |
|
jochen (gone - plz use gerrit)
2014/02/10 12:32:05
you can't know for sure that frame exists at this
| |
| 173 | |
| 174 /*WebVector<WebCompositionUnderline> underlines; | |
| 175 WebString text(WebString::fromUTF8(arguments[0].toString())); | |
| 176 frame_->view()->setComposition(text, underlines, 0, text.length()); | |
| 177 */ | |
| 178 } | |
| 179 | |
| 180 } // namespace WebTestRunner | |
| OLD | NEW |