diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/Android.mk | 312 | ||||
-rw-r--r-- | Source/WebCore/platform/graphics/android/TransferQueue.cpp | 3 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.cpp | 100 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.h | 8 | ||||
-rw-r--r-- | Source/WebKit/android/nav/WebView.cpp | 11 |
5 files changed, 52 insertions, 382 deletions
diff --git a/Source/Android.mk b/Source/Android.mk deleted file mode 100644 index 6612cae..0000000 --- a/Source/Android.mk +++ /dev/null @@ -1,312 +0,0 @@ -## -## Copyright 2009, The Android Open Source Project -## -## Redistribution and use in source and binary forms, with or without -## modification, are permitted provided that the following conditions -## are met: -## * Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## * Redistributions in binary form must reproduce the above copyright -## notice, this list of conditions and the following disclaimer in the -## documentation and/or other materials provided with the distribution. -## -## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -## PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -## EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -## PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -## PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -## OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -## - -LOCAL_PATH := $(call my-dir) - -# Two ways to control which JS engine is used: -# 1. use JS_ENGINE environment variable, value can be either 'jsc' or 'v8' -# This is the preferred way. -# 2. if JS_ENGINE is not set, or is not 'jsc' or 'v8', this makefile picks -# up a default engine to build. -# To help setup buildbot, a new environment variable, USE_ALT_JS_ENGINE, -# can be set to true, so that two builds can be different but without -# specifying which JS engine to use. -# To enable JIT in Android's JSC, please set ENABLE_JSC_JIT environment -# variable to true. - -# Read JS_ENGINE environment variable -JAVASCRIPT_ENGINE = $(JS_ENGINE) - -ifneq ($(JAVASCRIPT_ENGINE),jsc) - ifneq ($(JAVASCRIPT_ENGINE),v8) - # No JS engine is specified, pickup the one we want as default. - ifeq ($(USE_ALT_JS_ENGINE),true) - JAVASCRIPT_ENGINE = v8 - else - JAVASCRIPT_ENGINE = jsc - endif - endif -endif - -BASE_PATH := $(call my-dir) -include $(CLEAR_VARS) - -# Define our module and find the intermediates directory -LOCAL_MODULE := libwebcore -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -base_intermediates := $(call local-intermediates-dir) - -# Using := here prevents recursive expansion -WEBKIT_SRC_FILES := - -# We have to use bison 2.3 -include $(BASE_PATH)/bison_check.mk - -# Build our list of include paths. We include WebKit/android/icu first so that -# any files that include <unicode/ucnv.h> will include our ucnv.h first. We -# also add external/ as an include directory so that we can specify the real -# icu header directory as a more exact reference to avoid including our ucnv.h. -# -# Note that JavasCriptCore/ must be included after WebCore/, so that we pick up -# the right config.h. -LOCAL_C_INCLUDES := \ - $(JNI_H_INCLUDE) \ - $(LOCAL_PATH)/WebKit/android/icu \ - external/ \ - external/icu4c/common \ - external/icu4c/i18n \ - external/libxml2/include \ - external/skia/emoji \ - external/skia/include/core \ - external/skia/include/effects \ - external/skia/include/images \ - external/skia/include/ports \ - external/skia/include/utils \ - external/skia/src/ports \ - external/sqlite/dist \ - frameworks/base/core/jni/android/graphics - -LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \ - $(LOCAL_PATH)/WebCore \ - $(LOCAL_PATH)/WebCore/accessibility \ - $(LOCAL_PATH)/WebCore/bindings/generic \ - $(LOCAL_PATH)/WebCore/css \ - $(LOCAL_PATH)/WebCore/dom \ - $(LOCAL_PATH)/WebCore/editing \ - $(LOCAL_PATH)/WebCore/history \ - $(LOCAL_PATH)/WebCore/history/android \ - $(LOCAL_PATH)/WebCore/html \ - $(LOCAL_PATH)/WebCore/html/canvas \ - $(LOCAL_PATH)/WebCore/inspector \ - $(LOCAL_PATH)/WebCore/loader \ - $(LOCAL_PATH)/WebCore/loader/appcache \ - $(LOCAL_PATH)/WebCore/loader/icon \ - $(LOCAL_PATH)/WebCore/notifications \ - $(LOCAL_PATH)/WebCore/page \ - $(LOCAL_PATH)/WebCore/page/android \ - $(LOCAL_PATH)/WebCore/page/animation \ - $(LOCAL_PATH)/WebCore/platform \ - $(LOCAL_PATH)/WebCore/platform/android \ - $(LOCAL_PATH)/WebCore/platform/animation \ - $(LOCAL_PATH)/WebCore/platform/graphics \ - $(LOCAL_PATH)/WebCore/platform/graphics/android \ - $(LOCAL_PATH)/WebCore/platform/graphics/network \ - $(LOCAL_PATH)/WebCore/platform/graphics/skia \ - $(LOCAL_PATH)/WebCore/platform/graphics/transforms \ - $(LOCAL_PATH)/WebCore/platform/image-decoders \ - $(LOCAL_PATH)/WebCore/platform/leveldb \ - $(LOCAL_PATH)/WebCore/platform/mock \ - $(LOCAL_PATH)/WebCore/platform/network \ - $(LOCAL_PATH)/WebCore/platform/network/android \ - $(LOCAL_PATH)/WebCore/platform/sql \ - $(LOCAL_PATH)/WebCore/platform/text \ - $(LOCAL_PATH)/WebCore/plugins \ - $(LOCAL_PATH)/WebCore/plugins/android \ - $(LOCAL_PATH)/WebCore/rendering \ - $(LOCAL_PATH)/WebCore/rendering/style \ - $(LOCAL_PATH)/WebCore/storage \ - $(LOCAL_PATH)/WebCore/workers \ - $(LOCAL_PATH)/WebCore/xml - -LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \ - $(LOCAL_PATH)/WebKit/android \ - $(LOCAL_PATH)/WebKit/android/WebCoreSupport \ - $(LOCAL_PATH)/WebKit/android/jni \ - $(LOCAL_PATH)/WebKit/android/nav \ - $(LOCAL_PATH)/WebKit/android/plugins \ - $(LOCAL_PATH)/WebKit/android/stl - -LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \ - $(LOCAL_PATH)/JavaScriptCore \ - $(LOCAL_PATH)/JavaScriptCore/wtf \ - $(LOCAL_PATH)/JavaScriptCore/wtf/unicode \ - $(LOCAL_PATH)/JavaScriptCore/wtf/unicode/icu - -LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \ - $(base_intermediates)/WebCore/ \ - $(base_intermediates)/WebCore/css \ - $(base_intermediates)/WebCore/html \ - $(base_intermediates)/WebCore/platform - -ifeq ($(ENABLE_SVG), true) -LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \ - $(LOCAL_PATH)/WebCore/platform/graphics/filters \ - $(LOCAL_PATH)/WebCore/svg \ - $(LOCAL_PATH)/WebCore/svg/animation \ - $(LOCAL_PATH)/WebCore/svg/graphics \ - $(LOCAL_PATH)/WebCore/svg/graphics/filters \ - $(base_intermediates)/WebCore/svg -endif - -ifeq ($(JAVASCRIPT_ENGINE),v8) -# Include WTF source file. -d := JavaScriptCore -LOCAL_PATH := $(BASE_PATH)/$d -intermediates := $(base_intermediates)/$d -include $(LOCAL_PATH)/Android.v8.wtf.mk -WEBKIT_SRC_FILES += $(addprefix $d/,$(LOCAL_SRC_FILES)) -endif # JAVASCRIPT_ENGINE == v8 - -# Include source files for WebCore -d := WebCore -LOCAL_PATH := $(BASE_PATH)/$d -JAVASCRIPTCORE_PATH := $(BASE_PATH)/JavaScriptCore -intermediates := $(base_intermediates)/$d -include $(LOCAL_PATH)/Android.mk -ifeq ($(JAVASCRIPT_ENGINE),jsc) -include $(LOCAL_PATH)/Android.jscbindings.mk -endif -ifeq ($(JAVASCRIPT_ENGINE),v8) -include $(LOCAL_PATH)/Android.v8bindings.mk -endif -WEBKIT_SRC_FILES += $(addprefix $d/,$(LOCAL_SRC_FILES)) -LOCAL_C_INCLUDES += $(BINDING_C_INCLUDES) - -# Include the derived source files for WebCore. Uses the same path as -# WebCore -include $(LOCAL_PATH)/Android.derived.mk -ifeq ($(JAVASCRIPT_ENGINE),jsc) -include $(LOCAL_PATH)/Android.derived.jscbindings.mk -endif -ifeq ($(JAVASCRIPT_ENGINE),v8) -include $(LOCAL_PATH)/Android.derived.v8bindings.mk -endif - -# Redefine LOCAL_PATH here so the build system is not confused -LOCAL_PATH := $(BASE_PATH) - -# Define our compiler flags -LOCAL_CFLAGS += -Wno-endif-labels -Wno-import -Wno-format -LOCAL_CFLAGS += -fno-strict-aliasing -LOCAL_CFLAGS += -include "WebCorePrefix.h" -LOCAL_CFLAGS += -fvisibility=hidden - -# Enable JSC JIT if JSC is used and ENABLE_JSC_JIT environment -# variable is set to true -ifeq ($(JAVASCRIPT_ENGINE),jsc) -ifeq ($(ENABLE_JSC_JIT),true) -LOCAL_CFLAGS += -DENABLE_ANDROID_JSC_JIT=1 -endif -endif - -ifeq ($(TARGET_ARCH),arm) -LOCAL_CFLAGS += -Darm -endif - -ifeq ($(ENABLE_SVG),true) -LOCAL_CFLAGS += -DENABLE_SVG=1 -endif - -# Temporary disable SVG_ANIMATION. -ifeq ($(ENABLE_SVG_ANIMATION),true) -LOCAL_CFLAGS += -DENABLE_SVG_ANIMATION=1 -endif - -# LOCAL_LDLIBS is used in simulator builds only and simulator builds are only -# valid on Linux -LOCAL_LDLIBS += -lpthread -ldl - -# Build the list of shared libraries -LOCAL_SHARED_LIBRARIES := \ - libandroid_runtime \ - libnativehelper \ - libsqlite \ - libskia \ - libutils \ - libui \ - libcutils \ - libicuuc \ - libicudata \ - libicui18n \ - libmedia - -# We have to use the android version of libdl. -LOCAL_SHARED_LIBRARIES += libdl - -# Build the list of static libraries -LOCAL_STATIC_LIBRARIES := libxml2 -ifeq ($(JAVASCRIPT_ENGINE),v8) -LOCAL_STATIC_LIBRARIES += libv8 -endif - -# Redefine LOCAL_SRC_FILES to be all the WebKit source files -LOCAL_SRC_FILES := $(WEBKIT_SRC_FILES) - -# Define this for use in other makefiles. -WEBKIT_C_INCLUDES := $(LOCAL_C_INCLUDES) -WEBKIT_CFLAGS := $(LOCAL_CFLAGS) -WEBKIT_GENERATED_SOURCES := $(LOCAL_GENERATED_SOURCES) -WEBKIT_LDLIBS := $(LOCAL_LDLIBS) -WEBKIT_SHARED_LIBRARIES := $(LOCAL_SHARED_LIBRARIES) -WEBKIT_STATIC_LIBRARIES := $(LOCAL_STATIC_LIBRARIES) - -# Build the library all at once -include $(BUILD_STATIC_LIBRARY) - -ifeq ($(JAVASCRIPT_ENGINE),jsc) -# Now build libjs as a static library. -include $(CLEAR_VARS) -LOCAL_MODULE := libjs -LOCAL_LDLIBS := $(WEBKIT_LDLIBS) -LOCAL_SHARED_LIBRARIES := $(WEBKIT_SHARED_LIBRARIES) -LOCAL_STATIC_LIBRARIES := $(WEBKIT_STATIC_LIBRARIES) -LOCAL_CFLAGS := $(WEBKIT_CFLAGS) -# Include source files for JavaScriptCore -d := JavaScriptCore -LOCAL_PATH := $(BASE_PATH)/$d -LOCAL_MODULE_CLASS := STATIC_LIBRARIES -# Cannot use base_intermediates as this is a new module -intermediates := $(call local-intermediates-dir) -include $(LOCAL_PATH)/Android.mk -# Redefine LOCAL_SRC_FILES with the correct prefix -LOCAL_SRC_FILES := $(addprefix $d/,$(LOCAL_SRC_FILES)) -# Use the base path to resolve file names -LOCAL_PATH := $(BASE_PATH) -# Append jsc intermediate include paths to the WebKit include list. -LOCAL_C_INCLUDES := $(WEBKIT_C_INCLUDES) \ - $(intermediates) \ - $(intermediates)/parser \ - $(intermediates)/runtime \ -# Build libjs -include $(BUILD_STATIC_LIBRARY) -endif # JAVASCRIPT_ENGINE == jsc - -# Now build the shared library using only the exported jni entry point. This -# will strip out any unused code from the entry point. -include $(CLEAR_VARS) -# if you need to make webcore huge (for debugging), enable this line -#LOCAL_PRELINK_MODULE := false -LOCAL_MODULE := libwebcore -LOCAL_LDLIBS := $(WEBKIT_LDLIBS) -LOCAL_SHARED_LIBRARIES := $(WEBKIT_SHARED_LIBRARIES) -LOCAL_STATIC_LIBRARIES := libwebcore $(WEBKIT_STATIC_LIBRARIES) -ifeq ($(JAVASCRIPT_ENGINE),jsc) -LOCAL_STATIC_LIBRARIES += libjs -endif -LOCAL_LDFLAGS := -fvisibility=hidden -LOCAL_CFLAGS := $(WEBKIT_CFLAGS) -LOCAL_C_INCLUDES := $(WEBKIT_C_INCLUDES) -LOCAL_PATH := $(BASE_PATH) -include $(BUILD_SHARED_LIBRARY) diff --git a/Source/WebCore/platform/graphics/android/TransferQueue.cpp b/Source/WebCore/platform/graphics/android/TransferQueue.cpp index e97e1a1..00f851b 100644 --- a/Source/WebCore/platform/graphics/android/TransferQueue.cpp +++ b/Source/WebCore/platform/graphics/android/TransferQueue.cpp @@ -107,7 +107,8 @@ void TransferQueue::initGLResources(int width, int height) glGenTextures(1, &m_sharedSurfaceTextureId); m_sharedSurfaceTexture = #if GPU_UPLOAD_WITHOUT_DRAW - new android::SurfaceTexture(m_sharedSurfaceTextureId, true, GL_TEXTURE_2D); + new android::SurfaceTexture(m_sharedSurfaceTextureId, true, + GL_TEXTURE_2D, false); #else new android::SurfaceTexture(m_sharedSurfaceTextureId); #endif diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index ee6e338..1fb3c75 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -283,7 +283,6 @@ struct WebViewCore::JavaGlue { jmethodID m_restoreScale; jmethodID m_needTouchEvents; jmethodID m_requestKeyboard; - jmethodID m_requestKeyboardWithSelection; jmethodID m_exceededDatabaseQuota; jmethodID m_reachedMaxAppCacheSize; jmethodID m_populateVisitedLinks; @@ -417,7 +416,6 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m m_javaGlue->m_restoreScale = GetJMethod(env, clazz, "restoreScale", "(FF)V"); m_javaGlue->m_needTouchEvents = GetJMethod(env, clazz, "needTouchEvents", "(Z)V"); m_javaGlue->m_requestKeyboard = GetJMethod(env, clazz, "requestKeyboard", "(Z)V"); - m_javaGlue->m_requestKeyboardWithSelection = GetJMethod(env, clazz, "requestKeyboardWithSelection", "(IIII)V"); m_javaGlue->m_exceededDatabaseQuota = GetJMethod(env, clazz, "exceededDatabaseQuota", "(Ljava/lang/String;Ljava/lang/String;JJ)V"); m_javaGlue->m_reachedMaxAppCacheSize = GetJMethod(env, clazz, "reachedMaxAppCacheSize", "(J)V"); m_javaGlue->m_populateVisitedLinks = GetJMethod(env, clazz, "populateVisitedLinks", "()V"); @@ -447,7 +445,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m #endif m_javaGlue->m_setWebTextViewAutoFillable = GetJMethod(env, clazz, "setWebTextViewAutoFillable", "(ILjava/lang/String;)V"); m_javaGlue->m_selectAt = GetJMethod(env, clazz, "selectAt", "(II)V"); - m_javaGlue->m_initEditField = GetJMethod(env, clazz, "initEditField", "(Ljava/lang/String;II)V"); + m_javaGlue->m_initEditField = GetJMethod(env, clazz, "initEditField", "(ILjava/lang/String;II)V"); env->DeleteLocalRef(clazz); env->SetIntField(javaWebViewCore, gWebViewCoreFields.m_nativeClass, (jint)this); @@ -1156,22 +1154,6 @@ void WebViewCore::needTouchEvents(bool need) #endif } -void WebViewCore::requestKeyboardWithSelection(const WebCore::Node* node, - int selStart, int selEnd) -{ - DEBUG_NAV_UI_LOGD("%s", __FUNCTION__); - ALOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!"); - - JNIEnv* env = JSC::Bindings::getJNIEnv(); - AutoJObject javaObject = m_javaGlue->object(env); - if (!javaObject.get()) - return; - env->CallVoidMethod(javaObject.get(), - m_javaGlue->m_requestKeyboardWithSelection, - reinterpret_cast<int>(node), selStart, selEnd, m_textGeneration); - checkException(env); -} - void WebViewCore::requestKeyboard(bool showKeyboard) { DEBUG_NAV_UI_LOGD("%s", __FUNCTION__); @@ -1675,7 +1657,8 @@ VisiblePosition WebViewCore::visiblePositionForContentPoint(const IntPoint& poin // Hit test of this kind required for this to work inside input fields HitTestRequest request(HitTestRequest::Active | HitTestRequest::MouseMove - | HitTestRequest::ReadOnly); + | HitTestRequest::ReadOnly + | HitTestRequest::IgnoreClipping); HitTestResult result(point); focusedFrame()->document()->renderView()->layer()->hitTest(request, result); @@ -1781,19 +1764,6 @@ void WebViewCore::layerToAbsoluteOffset(const LayerAndroid* layer, IntPoint& off } } -void setCaretInfo(const VisiblePosition& pos, SelectText::HandleId handle, - SelectText* target) -{ - IntPoint offset; - LayerAndroid* layer = 0; - IntRect rect = pos.absoluteCaretBounds(); - int layerId = WebViewCore::platformLayerIdFromNode(pos.deepEquivalent().anchorNode(), &layer); - WebViewCore::layerToAbsoluteOffset(layer, offset); - rect.move(-offset.x(), -offset.y()); - target->setCaretRect(handle, rect); - target->setCaretLayerId(handle, layerId); -} - SelectText* WebViewCore::createSelectText(const VisibleSelection& selection) { // We need to agressively check to see if this is an empty selection to prevent @@ -1813,6 +1783,8 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection) SelectText* selectTextContainer = new SelectText(); IntPoint frameOffset = convertGlobalContentToFrameContent(IntPoint()); + IntRect startHandle; + IntRect endHandle; Node* stopNode = range->pastLastNode(); for (Node* node = range->firstNode(); node != stopNode; node = node->traverseNextNode()) { RenderObject* r = node->renderer(); @@ -1822,21 +1794,36 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection) int startOffset = node == startContainer ? range->startOffset() : 0; int endOffset = node == endContainer ? range->endOffset() : numeric_limits<int>::max(); LayerAndroid* layer = 0; - platformLayerIdFromNode(node, &layer); + int layerId = platformLayerIdFromNode(node, &layer); Vector<IntRect> rects; renderText->absoluteRectsForRange(rects, startOffset, endOffset, true); + if (rects.size()) { + IntPoint offset; + layerToAbsoluteOffset(layer, offset); + endHandle = rects[rects.size() - 1]; + endHandle.move(-offset.x(), -offset.y()); + selectTextContainer->setCaretLayerId(SelectText::EndHandle, layerId); + if (startHandle.isEmpty()) { + startHandle = rects[0]; + startHandle.move(-offset.x(), -offset.y()); + selectTextContainer->setCaretLayerId(SelectText::StartHandle, layerId); + } + } selectTextContainer->addHighlightRegion(layer, rects, frameOffset); } IntRect caretRect; int layerId; selectTextContainer->setBaseFirst(selection.isBaseFirst()); - setCaretInfo(selection.visibleStart(), SelectText::StartHandle, selectTextContainer); - setCaretInfo(selection.visibleEnd(), SelectText::EndHandle, selectTextContainer); - selectTextContainer->caretRect(SelectText::StartHandle) - .move(-frameOffset.x(), -frameOffset.y()); - selectTextContainer->caretRect(SelectText::EndHandle) - .move(-frameOffset.x(), -frameOffset.y()); + + // Squish the handle rects + startHandle.setWidth(1); + endHandle.move(endHandle.width() - 1, 0); + endHandle.setWidth(1); + startHandle.move(-frameOffset.x(), -frameOffset.y()); + selectTextContainer->setCaretRect(SelectText::StartHandle, startHandle); + endHandle.move(-frameOffset.x(), -frameOffset.y()); + selectTextContainer->setCaretRect(SelectText::EndHandle, endHandle); selectTextContainer->setText(range->text()); @@ -2378,12 +2365,8 @@ void WebViewCore::moveMouse(WebCore::Frame* frame, int x, int y, HitTestResult* Position WebViewCore::getPositionForOffset(Node* node, int offset) { - Position positionInNode(node, 0); - Node* highest = highestEditableRoot(positionInNode); - if (!highest) - highest = node; - Position start = firstPositionInNode(highest); - Position end = lastPositionInNode(highest); + Position start = firstPositionInNode(node); + Position end = lastPositionInNode(node); Document* document = node->document(); PassRefPtr<Range> range = Range::create(document, start, end); WebCore::CharacterIterator iterator(range.get()); @@ -3346,7 +3329,11 @@ bool WebViewCore::key(const PlatformKeyboardEvent& event) WebFrame* webFrame = WebFrame::getWebFrame(frame); eventHandler = frame->eventHandler(); VisibleSelection old = frame->selection()->selection(); + EditorClientAndroid* client = static_cast<EditorClientAndroid*>( + m_mainFrame->editor()->client()); + client->setUiGeneratedSelectionChange(true); bool handled = eventHandler->keyEvent(event); + client->setUiGeneratedSelectionChange(false); if (isContentEditable(focusNode)) { // keyEvent will return true even if the contentEditable did not // change its selection. In the case that it does not, we want to @@ -3584,8 +3571,7 @@ bool WebViewCore::handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* node m_frameCacheOutOfDate = true; updateFrameCache(); #endif - requestKeyboardWithSelection(focusNode, rtc->selectionStart(), - rtc->selectionEnd()); + initEditField(focusNode); } } else if (!fake) { requestKeyboard(false); @@ -3596,7 +3582,6 @@ bool WebViewCore::handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* node // input is needed. if (isContentEditable(focusNode)) { initEditField(focusNode); - requestKeyboard(true); } else if (!nodeIsPlugin(focusNode)) { clearTextEntry(); } @@ -3618,9 +3603,10 @@ void WebViewCore::initEditField(Node* node) AutoJObject javaObject = m_javaGlue->object(env); if (!javaObject.get()) return; + m_textGeneration = 0; jstring fieldText = wtfStringToJstring(env, text, true); env->CallVoidMethod(javaObject.get(), m_javaGlue->m_initEditField, - fieldText, start, end); + reinterpret_cast<int>(node), fieldText, start, end); checkException(env); } @@ -3888,8 +3874,7 @@ void WebViewCore::getSelectionOffsets(Node* node, int& start, int& end) SelectionController* selector = frame->selection(); Position selectionStart = selector->start(); Position selectionEnd = selector->end(); - Node* editable = highestEditableRoot(selectionStart); - Position startOfNode = firstPositionInNode(editable); + Position startOfNode = firstPositionInNode(node); RefPtr<Range> startRange = Range::create(document, startOfNode, selectionStart); start = TextIterator::rangeLength(startRange.get(), true); @@ -3908,13 +3893,10 @@ String WebViewCore::getInputText(Node* node) else { // It must be content editable field. Position inNode(node, 0); - Node* editable = highestEditableRoot(inNode); - if (editable) { - Position start = firstPositionInNode(editable); - Position end = lastPositionInNode(editable); - VisibleSelection allEditableText(start, end); - text = allEditableText.firstRange()->text(); - } + Position start = firstPositionInNode(node); + Position end = lastPositionInNode(node); + VisibleSelection allEditableText(start, end); + text = allEditableText.firstRange()->text(); } return text; } diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h index 9fc55d1..034229d 100644 --- a/Source/WebKit/android/jni/WebViewCore.h +++ b/Source/WebKit/android/jni/WebViewCore.h @@ -679,13 +679,12 @@ namespace android { Node* getImplicitBoundaryNode(Node* node, unsigned offset, int direction); /** * Calls into java to reset the text edit field with the - * current contents and selection. This currently works only with - * content-editable fields. + * current contents and selection. */ void initEditField(Node* node); /** * Returns the offsets of the selection area for both normal text - * fields and content-editable fields. start and end are modified + * fields and content editable fields. start and end are modified * by this method. */ static void getSelectionOffsets(Node* node, int& start, int& end); @@ -706,8 +705,7 @@ namespace android { static void setSelection(Node* node, int start, int end); /** * Returns the Position for the given offset for an editable - * field. If node is editable the offset relative to the highest - * editable node. If it is not editable, the offset is relative to node. + * field. The offset is relative to the node start. */ static WebCore::Position getPositionForOffset(Node* node, int offset); diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp index efdb67f..62cc6ce 100644 --- a/Source/WebKit/android/nav/WebView.cpp +++ b/Source/WebKit/android/nav/WebView.cpp @@ -1420,15 +1420,16 @@ int getHandleLayerId(SelectText::HandleId handleId, SkIRect& cursorRect) { if (!selectText) return -1; int layerId = selectText->caretLayerId(handleId); - const IntRect& r = selectText->caretRect(handleId); - cursorRect.set(r.x(), r.y(), r.maxX(), r.maxY()); + IntRect rect = selectText->caretRect(handleId); if (layerId != -1) { + // We need to make sure the drawTransform is up to date as this is + // called before a draw() or drawGL() + m_baseLayer->updateLayerPositions(m_visibleRect); LayerAndroid* root = compositeRoot(); LayerAndroid* layer = root ? root->findById(layerId) : 0; - IntPoint offset; - WebViewCore::layerToAbsoluteOffset(layer, offset); - cursorRect.offset(offset.x(), offset.y()); + rect = layer->drawTransform()->mapRect(rect); } + cursorRect.set(rect.x(), rect.y(), rect.maxX(), rect.maxY()); return layerId; } |