summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Android.mk312
-rw-r--r--Source/WebCore/platform/graphics/android/TransferQueue.cpp3
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp100
-rw-r--r--Source/WebKit/android/jni/WebViewCore.h8
-rw-r--r--Source/WebKit/android/nav/WebView.cpp11
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;
}