summaryrefslogtreecommitdiffstats
path: root/Source/WebKit
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit')
-rw-r--r--Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp2
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp89
-rw-r--r--Source/WebKit/android/jni/WebViewCore.h9
-rw-r--r--Source/WebKit/android/nav/WebView.cpp50
4 files changed, 60 insertions, 90 deletions
diff --git a/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp b/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
index 207fe9a..c10f5b3 100644
--- a/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
+++ b/Source/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
@@ -95,7 +95,7 @@ void ChromeClientAndroid::scheduleCompositingLayerSync()
m_needsLayerSync = true;
WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_webFrame->page()->mainFrame()->view());
if (webViewCore)
- webViewCore->layersDraw();
+ webViewCore->contentDraw();
}
void ChromeClientAndroid::setNeedsOneShotDrawingSynchronization()
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp
index debf249..bf87668 100644
--- a/Source/WebKit/android/jni/WebViewCore.cpp
+++ b/Source/WebKit/android/jni/WebViewCore.cpp
@@ -323,7 +323,6 @@ struct WebViewCore::JavaGlue {
jweak m_obj;
jmethodID m_scrollTo;
jmethodID m_contentDraw;
- jmethodID m_layersDraw;
jmethodID m_requestListBox;
jmethodID m_openFileChooser;
jmethodID m_requestSingleListBox;
@@ -397,7 +396,7 @@ struct WebViewCore::TextFieldInitDataGlue {
jfieldID m_name;
jfieldID m_label;
jfieldID m_maxLength;
- jfieldID m_nodeBounds;
+ jfieldID m_contentBounds;
jfieldID m_nodeLayerId;
jfieldID m_contentRect;
};
@@ -456,7 +455,6 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
m_javaGlue->m_obj = env->NewWeakGlobalRef(javaWebViewCore);
m_javaGlue->m_scrollTo = GetJMethod(env, clazz, "contentScrollTo", "(IIZZ)V");
m_javaGlue->m_contentDraw = GetJMethod(env, clazz, "contentDraw", "()V");
- m_javaGlue->m_layersDraw = GetJMethod(env, clazz, "layersDraw", "()V");
m_javaGlue->m_requestListBox = GetJMethod(env, clazz, "requestListBox", "([Ljava/lang/String;[I[I)V");
m_javaGlue->m_openFileChooser = GetJMethod(env, clazz, "openFileChooser", "(Ljava/lang/String;)Ljava/lang/String;");
m_javaGlue->m_requestSingleListBox = GetJMethod(env, clazz, "requestListBox", "([Ljava/lang/String;[II)V");
@@ -523,7 +521,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
m_textFieldInitDataGlue->m_name = env->GetFieldID(tfidClazz, "mName", "Ljava/lang/String;");
m_textFieldInitDataGlue->m_label = env->GetFieldID(tfidClazz, "mLabel", "Ljava/lang/String;");
m_textFieldInitDataGlue->m_maxLength = env->GetFieldID(tfidClazz, "mMaxLength", "I");
- m_textFieldInitDataGlue->m_nodeBounds = env->GetFieldID(tfidClazz, "mNodeBounds", "Landroid/graphics/Rect;");
+ m_textFieldInitDataGlue->m_contentBounds = env->GetFieldID(tfidClazz, "mContentBounds", "Landroid/graphics/Rect;");
m_textFieldInitDataGlue->m_nodeLayerId = env->GetFieldID(tfidClazz, "mNodeLayerId", "I");
m_textFieldInitDataGlue->m_contentRect = env->GetFieldID(tfidClazz, "mContentRect", "Landroid/graphics/Rect;");
m_textFieldInitDataGlue->m_constructor = GetJMethod(env, tfidClazz, "<init>", "()V");
@@ -858,18 +856,6 @@ void WebViewCore::rebuildPictureSet(PictureSet* pictureSet)
#endif
}
-bool WebViewCore::updateLayers(LayerAndroid* layers)
-{
- // We update the layers
- ChromeClientAndroid* chromeC = static_cast<ChromeClientAndroid*>(m_mainFrame->page()->chrome()->client());
- GraphicsLayerAndroid* root = static_cast<GraphicsLayerAndroid*>(chromeC->layersSync());
- if (root) {
- LayerAndroid* updatedLayer = root->contentLayer();
- return layers->updateWithTree(updatedLayer);
- }
- return true;
-}
-
void WebViewCore::notifyAnimationStarted()
{
// We notify webkit that the animations have begun
@@ -1020,16 +1006,6 @@ void WebViewCore::contentDraw()
checkException(env);
}
-void WebViewCore::layersDraw()
-{
- JNIEnv* env = JSC::Bindings::getJNIEnv();
- AutoJObject javaObject = m_javaGlue->object(env);
- if (!javaObject.get())
- return;
- env->CallVoidMethod(javaObject.get(), m_javaGlue->m_layersDraw);
- checkException(env);
-}
-
void WebViewCore::contentInvalidate(const WebCore::IntRect &r)
{
DBG_SET_LOGD("rect={%d,%d,w=%d,h=%d}", r.x(), r.y(), r.width(), r.height());
@@ -1649,7 +1625,7 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection)
RenderText* renderText = toRenderText(r);
int caretOffset;
InlineBox* inlineBox;
- start.getInlineBoxAndOffset(DOWNSTREAM, inlineBox, caretOffset);
+ start.getInlineBoxAndOffset(selection.affinity(), inlineBox, caretOffset);
startHandle = renderText->localCaretRect(inlineBox, caretOffset);
FloatPoint absoluteOffset = renderText->localToAbsolute(startHandle.location());
startHandle.setX(absoluteOffset.x() - layerOffset.x());
@@ -1698,19 +1674,19 @@ SelectText* WebViewCore::createSelectText(const VisibleSelection& selection)
selectTextContainer->setText(range->text());
selectTextContainer->setTextRect(SelectText::StartHandle,
- positionToTextRect(selection.start()));
+ positionToTextRect(selection.start(), selection.affinity()));
selectTextContainer->setTextRect(SelectText::EndHandle,
- positionToTextRect(selection.end()));
+ positionToTextRect(selection.end(), selection.affinity()));
return selectTextContainer;
}
-IntRect WebViewCore::positionToTextRect(const Position& position)
+IntRect WebViewCore::positionToTextRect(const Position& position, EAffinity affinity)
{
IntRect textRect;
InlineBox* inlineBox;
int offset;
- position.getInlineBoxAndOffset(VP_DEFAULT_AFFINITY, inlineBox, offset);
+ position.getInlineBoxAndOffset(affinity, inlineBox, offset);
if (inlineBox && inlineBox->isInlineTextBox()) {
InlineTextBox* box = static_cast<InlineTextBox*>(inlineBox);
RootInlineBox* root = box->root();
@@ -2960,17 +2936,17 @@ void WebViewCore::passToJs(int generation, const WTF::String& current,
updateTextSelection();
}
-void WebViewCore::scrollFocusedTextInput(float xPercent, int y)
+WebCore::IntRect WebViewCore::scrollFocusedTextInput(float xPercent, int y)
{
WebCore::Node* focus = currentFocus();
if (!focus) {
clearTextEntry();
- return;
+ return WebCore::IntRect();
}
WebCore::RenderTextControl* renderText = toRenderTextControl(focus);
if (!renderText) {
clearTextEntry();
- return;
+ return WebCore::IntRect();
}
int x = (int) (xPercent * (renderText->scrollWidth() -
@@ -2978,6 +2954,9 @@ void WebViewCore::scrollFocusedTextInput(float xPercent, int y)
renderText->setScrollLeft(x);
renderText->setScrollTop(y);
focus->document()->frame()->selection()->recomputeCaretRect();
+ LayerAndroid* layer = 0;
+ platformLayerIdFromNode(focus, &layer);
+ return absoluteContentRect(focus, layer);
}
void WebViewCore::setFocusControllerActive(bool active)
@@ -3420,22 +3399,23 @@ bool WebViewCore::isAutoCompleteEnabled(Node* node)
return isEnabled;
}
-WebCore::IntRect WebViewCore::boundingRect(WebCore::Node* node,
+WebCore::IntRect WebViewCore::absoluteContentRect(WebCore::Node* node,
LayerAndroid* layer)
{
- // Caret selection
- IntRect boundingRect;
+ IntRect contentRect;
if (node) {
RenderObject* render = node->renderer();
- if (render && !render->isBody()) {
+ if (render && render->isBox() && !render->isBody()) {
IntPoint offset = convertGlobalContentToFrameContent(IntPoint(),
node->document()->frame());
WebViewCore::layerToAbsoluteOffset(layer, offset);
- boundingRect = render->absoluteBoundingBoxRect(true);
- boundingRect.move(-offset.x(), -offset.y());
+
+ RenderBox* renderBox = toRenderBox(render);
+ contentRect = renderBox->absoluteContentBox();
+ contentRect.move(-offset.x(), -offset.y());
}
}
- return boundingRect;
+ return contentRect;
}
jobject WebViewCore::createTextFieldInitData(Node* node)
@@ -3468,8 +3448,8 @@ jobject WebViewCore::createTextFieldInitData(Node* node)
env->SetIntField(initData, classDef->m_maxLength, getMaxLength(node));
LayerAndroid* layer = 0;
int layerId = platformLayerIdFromNode(node, &layer);
- IntRect bounds = boundingRect(node, layer);
- env->SetObjectField(initData, classDef->m_nodeBounds,
+ IntRect bounds = absoluteContentRect(node, layer);
+ env->SetObjectField(initData, classDef->m_contentBounds,
intRectToRect(env, bounds));
env->SetIntField(initData, classDef->m_nodeLayerId, layerId);
IntRect contentRect;
@@ -4551,10 +4531,12 @@ static void PassToJs(JNIEnv* env, jobject obj, jint nativeClass,
}
static void ScrollFocusedTextInput(JNIEnv* env, jobject obj, jint nativeClass,
- jfloat xPercent, jint y)
+ jfloat xPercent, jint y, jobject contentBounds)
{
WebViewCore* viewImpl = reinterpret_cast<WebViewCore*>(nativeClass);
- viewImpl->scrollFocusedTextInput(xPercent, y);
+ IntRect bounds = viewImpl->scrollFocusedTextInput(xPercent, y);
+ if (contentBounds)
+ GraphicsJNI::irect_to_jrect(bounds, env, contentBounds);
}
static void SetFocusControllerActive(JNIEnv* env, jobject obj, jint nativeClass,
@@ -4580,19 +4562,6 @@ void WebViewCore::addVisitedLink(const UChar* string, int length)
m_groupForVisitedLinks->addVisitedLink(string, length);
}
-static bool UpdateLayers(JNIEnv* env, jobject obj, jint nativeClass,
- jint jbaseLayer)
-{
- WebViewCore* viewImpl = (WebViewCore*) nativeClass;
- BaseLayerAndroid* baseLayer = (BaseLayerAndroid*) jbaseLayer;
- if (baseLayer) {
- LayerAndroid* root = static_cast<LayerAndroid*>(baseLayer->getChild(0));
- if (root)
- return viewImpl->updateLayers(root);
- }
- return true;
-}
-
static void NotifyAnimationStarted(JNIEnv* env, jobject obj, jint nativeClass)
{
WebViewCore* viewImpl = (WebViewCore*) nativeClass;
@@ -5116,7 +5085,7 @@ static JNINativeMethod gJavaWebViewCoreMethods[] = {
(void*) MoveMouse },
{ "passToJs", "(IILjava/lang/String;IIZZZZ)V",
(void*) PassToJs },
- { "nativeScrollFocusedTextInput", "(IFI)V",
+ { "nativeScrollFocusedTextInput", "(IFILandroid/graphics/Rect;)V",
(void*) ScrollFocusedTextInput },
{ "nativeSetFocusControllerActive", "(IZ)V",
(void*) SetFocusControllerActive },
@@ -5138,8 +5107,6 @@ static JNINativeMethod gJavaWebViewCoreMethods[] = {
(void*) RetrieveImageSource },
{ "nativeGetContentMinPrefWidth", "(I)I",
(void*) GetContentMinPrefWidth },
- { "nativeUpdateLayers", "(II)Z",
- (void*) UpdateLayers },
{ "nativeNotifyAnimationStarted", "(I)V",
(void*) NotifyAnimationStarted },
{ "nativeRecordContent", "(ILandroid/graphics/Region;Landroid/graphics/Point;)I",
diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h
index a6b305b..00b4bda 100644
--- a/Source/WebKit/android/jni/WebViewCore.h
+++ b/Source/WebKit/android/jni/WebViewCore.h
@@ -415,7 +415,7 @@ namespace android {
/**
* Scroll the focused textfield to (x, y) in document space
*/
- void scrollFocusedTextInput(float x, int y);
+ WebCore::IntRect scrollFocusedTextInput(float x, int y);
/**
* Set the FocusController's active and focused states, so that
* the caret will draw (true) or not.
@@ -753,9 +753,10 @@ namespace android {
static int getMaxLength(WebCore::Node* node);
static WTF::String getFieldName(WebCore::Node* node);
static bool isAutoCompleteEnabled(WebCore::Node* node);
- WebCore::IntRect boundingRect(WebCore::Node* node,
- WebCore::LayerAndroid* layer);
- static WebCore::IntRect positionToTextRect(const WebCore::Position& position);
+ WebCore::IntRect absoluteContentRect(WebCore::Node* node,
+ WebCore::LayerAndroid* layer);
+ static WebCore::IntRect positionToTextRect(const WebCore::Position& position,
+ WebCore::EAffinity affinity);
// called from constructor, to add this to a global list
static void addInstance(WebViewCore*);
diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp
index a4381e6..44ad1c5 100644
--- a/Source/WebKit/android/nav/WebView.cpp
+++ b/Source/WebKit/android/nav/WebView.cpp
@@ -306,7 +306,8 @@ PictureSet* draw(SkCanvas* canvas, SkColor bgColor, DrawExtras extras, bool spli
int sc = canvas->save(SkCanvas::kClip_SaveFlag);
canvas->clipRect(SkRect::MakeLTRB(0, 0, content->width(),
content->height()), SkRegion::kDifference_Op);
- canvas->drawColor(bgColor);
+ Color c = m_baseLayer->getBackgroundColor();
+ canvas->drawColor(SkColorSetARGBInline(c.alpha(), c.red(), c.green(), c.blue()));
canvas->restoreToCount(sc);
// call this to be sure we've adjusted for any scrolling or animations
@@ -592,6 +593,19 @@ void setTextSelection(SelectText *selection) {
setDrawExtra(selection, DrawExtrasSelection);
}
+const TransformationMatrix* getLayerTransform(int layerId) {
+ if (layerId != -1 && m_baseLayer) {
+ LayerAndroid* layer = m_baseLayer->findById(layerId);
+ // We need to make sure the drawTransform is up to date as this is
+ // called before a draw() or drawGL()
+ if (layer) {
+ m_baseLayer->updateLayerPositions(m_visibleRect);
+ return layer->drawTransform();
+ }
+ }
+ return 0;
+}
+
int getHandleLayerId(SelectText::HandleId handleId, SkIPoint& cursorPoint,
FloatQuad& textBounds) {
SelectText* selectText = static_cast<SelectText*>(getDrawExtra(DrawExtrasSelection));
@@ -602,36 +616,24 @@ int getHandleLayerId(SelectText::HandleId handleId, SkIPoint& cursorPoint,
IntRect textRect = selectText->textRect(handleId);
// Rects exclude the last pixel on right/bottom. We want only included pixels.
cursorPoint.set(cursorRect.x(), cursorRect.maxY() - 1);
- textRect.setHeight(textRect.height() - 1);
- textRect.setWidth(textRect.width() - 1);
+ textRect.setHeight(std::max(1, textRect.height() - 1));
+ textRect.setWidth(std::max(1, textRect.width() - 1));
textBounds = FloatQuad(textRect);
- 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 = m_baseLayer;
- LayerAndroid* layer = root ? root->findById(layerId) : 0;
- if (layer && layer->drawTransform()) {
- const TransformationMatrix* transform = layer->drawTransform();
- // We're overloading the concept of Rect to be just the two
- // points (bottom-left and top-right.
- cursorPoint = transform->mapPoint(cursorPoint);
- textBounds = transform->mapQuad(textBounds);
- }
+ const TransformationMatrix* transform = getLayerTransform(layerId);
+ if (transform) {
+ // We're overloading the concept of Rect to be just the two
+ // points (bottom-left and top-right.
+ cursorPoint = transform->mapPoint(cursorPoint);
+ textBounds = transform->mapQuad(textBounds);
}
return layerId;
}
void mapLayerRect(int layerId, SkIRect& rect) {
- 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* layer = m_baseLayer ? m_baseLayer->findById(layerId) : 0;
- if (layer && layer->drawTransform())
- rect = layer->drawTransform()->mapRect(rect);
- }
+ const TransformationMatrix* transform = getLayerTransform(layerId);
+ if (transform)
+ transform->mapRect(rect);
}
void floatQuadToQuadF(JNIEnv* env, const FloatQuad& nativeTextQuad,