summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/android/jni
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit/android/jni')
-rw-r--r--Source/WebKit/android/jni/PictureSet.cpp159
-rw-r--r--Source/WebKit/android/jni/ViewStateSerializer.cpp30
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp179
-rw-r--r--Source/WebKit/android/jni/WebViewCore.h16
4 files changed, 243 insertions, 141 deletions
diff --git a/Source/WebKit/android/jni/PictureSet.cpp b/Source/WebKit/android/jni/PictureSet.cpp
index 8e95aa3..f3534eb 100644
--- a/Source/WebKit/android/jni/PictureSet.cpp
+++ b/Source/WebKit/android/jni/PictureSet.cpp
@@ -23,12 +23,13 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#define LOG_NDEBUG 0
-#define LOG_TAG "pictureset"
+#define LOG_TAG "PictureSet"
+#define LOG_NDEBUG 1
#include "config.h"
#include "PictureSet.h"
+#include "AndroidLog.h"
#include "android_graphics.h"
#include "SkBounder.h"
#include "SkCanvas.h"
@@ -46,26 +47,6 @@
#define MAX_BUCKET_COUNT_X 16
#define MAX_BUCKET_COUNT_Y 64
-#include <wtf/CurrentTime.h>
-
-#include <cutils/log.h>
-#include <wtf/text/CString.h>
-
-#undef XLOGC
-#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "PictureSet", __VA_ARGS__)
-
-#ifdef DEBUG
-
-#undef XLOG
-#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "PictureSet", __VA_ARGS__)
-
-#else
-
-#undef XLOG
-#define XLOG(...)
-
-#endif // DEBUG
-
#if PICTURE_SET_DEBUG
class MeasureStream : public SkWStream {
public:
@@ -190,7 +171,7 @@ Bucket* PictureSet::getBucket(int x, int y)
BucketPosition position(x+1, y+1);
if (!mBuckets.contains(position)) {
- XLOG("PictureSet::getBucket(%d, %d) adding new bucket", x, y);
+ ALOGV("PictureSet::getBucket(%d, %d) adding new bucket", x, y);
Bucket* bucket = new Bucket();
mBuckets.add(position, bucket);
}
@@ -202,7 +183,7 @@ void PictureSet::displayBucket(Bucket* bucket)
BucketPicture* first = bucket->begin();
BucketPicture* last = bucket->end();
for (BucketPicture* current = first; current != last; current++) {
- XLOGC("- in %x, bucketPicture %d,%d,%d,%d - %dx%d, picture: %x, base: %x",
+ ALOGD("- in %x, bucketPicture %d,%d,%d,%d - %dx%d, picture: %x, base: %x",
bucket,
current->mArea.fLeft,
current->mArea.fTop,
@@ -217,12 +198,12 @@ void PictureSet::displayBucket(Bucket* bucket)
void PictureSet::displayBuckets()
{
- XLOGC("\n\n****** DISPLAY BUCKETS ON PictureSet %x ******", this);
+ ALOGD("\n\n****** DISPLAY BUCKETS ON PictureSet %x ******", this);
for (BucketMap::iterator iter = mBuckets.begin(); iter != mBuckets.end(); ++iter) {
- XLOGC("\n*** Bucket %x for %d, %d", iter->second, iter->first.first, iter->first.second);
+ ALOGD("\n*** Bucket %x for %d, %d", iter->second, iter->first.first, iter->first.second);
displayBucket(iter->second);
}
- XLOGC("\n****** END OF DISPLAY BUCKETS ******\n\n");
+ ALOGD("\n****** END OF DISPLAY BUCKETS ******\n\n");
}
// When we receive an inval in a Bucket, we try to see if we intersect with
@@ -341,12 +322,12 @@ void PictureSet::addToBucket(Bucket* bucket, int dx, int dy, SkIRect& rect)
void PictureSet::gatherBucketsForArea(WTF::Vector<Bucket*>& list, const SkIRect& rect)
{
- XLOG("\n--- gatherBucketsForArea for rect %d, %d, %d, %d (%d x %d)",
+ ALOGV("\n--- gatherBucketsForArea for rect %d, %d, %d, %d (%d x %d)",
rect.fLeft, rect.fTop, rect.fRight, rect.fBottom,
rect.width(), rect.height());
if (!mBucketSizeX || !mBucketSizeY) {
- XLOGC("PictureSet::gatherBucketsForArea() called with bad bucket size: x=%d y=%d",
+ ALOGD("PictureSet::gatherBucketsForArea() called with bad bucket size: x=%d y=%d",
mBucketSizeX, mBucketSizeY);
return;
}
@@ -361,7 +342,7 @@ void PictureSet::gatherBucketsForArea(WTF::Vector<Bucket*>& list, const SkIRect&
for (int i = firstTileX; i <= lastTileX; i++) {
for (int j = firstTileY; j <= lastTileY; j++) {
Bucket* bucket = getBucket(i, j);
- XLOG("gather bucket %x for %d, %d", bucket, i+1, j+1);
+ ALOGV("gather bucket %x for %d, %d", bucket, i+1, j+1);
if (bucket)
list.append(bucket);
}
@@ -373,12 +354,12 @@ void PictureSet::gatherBucketsForArea(WTF::Vector<Bucket*>& list, const SkIRect&
// each Bucket we intersect with). We then send that inval to the Bucket.
void PictureSet::splitAdd(const SkIRect& rect)
{
- XLOG("\n--- splitAdd for rect %d, %d, %d, %d (%d x %d)",
+ ALOGV("\n--- splitAdd for rect %d, %d, %d, %d (%d x %d)",
rect.fLeft, rect.fTop, rect.fRight, rect.fBottom,
rect.width(), rect.height());
if (!mBucketSizeX || !mBucketSizeY) {
- XLOGC("PictureSet::splitAdd() called with bad bucket size: x=%d y=%d",
+ ALOGD("PictureSet::splitAdd() called with bad bucket size: x=%d y=%d",
mBucketSizeX, mBucketSizeY);
return;
}
@@ -391,7 +372,7 @@ void PictureSet::splitAdd(const SkIRect& rect)
int lastTileX = rect.fRight / mBucketSizeX;
int lastTileY = rect.fBottom / mBucketSizeY;
- XLOG("--- firstTile(%d, %d) lastTile(%d, %d)",
+ ALOGV("--- firstTile(%d, %d) lastTile(%d, %d)",
firstTileX, firstTileY,
lastTileX, lastTileY);
@@ -415,7 +396,7 @@ void PictureSet::splitAdd(const SkIRect& rect)
}
}
- XLOG("--- splitAdd DONE\n");
+ ALOGV("--- splitAdd DONE\n");
}
#endif // FAST_PICTURESET
@@ -452,16 +433,16 @@ void PictureSet::add(const SkIRect& area, uint32_t elapsed, bool split, bool emp
Pictures* first = mPictures.begin();
Pictures* last = mPictures.end();
#ifdef DEBUG
- XLOG("--- before adding the new inval ---");
+ ALOGV("--- before adding the new inval ---");
for (Pictures* working = mPictures.begin(); working != mPictures.end(); working++) {
SkIRect currentArea = working->mArea;
- XLOG("picture %d (%d, %d, %d, %d - %d x %d) base: %c",
- working - first,
- currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
- currentArea.width(), currentArea.height(),
- working->mBase ? 'Y' : 'N');
+ ALOGV("picture %d (%d, %d, %d, %d - %d x %d) base: %c",
+ working - first,
+ currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
+ currentArea.width(), currentArea.height(),
+ working->mBase ? 'Y' : 'N');
}
- XLOG("----------------------------------");
+ ALOGV("----------------------------------");
#endif
// let's gather all the Pictures intersecting with the new invalidated
@@ -488,12 +469,12 @@ void PictureSet::add(const SkIRect& area, uint32_t elapsed, bool split, bool emp
mAdditionalArea -= currentArea.width() * currentArea.height();
totalArea.join(currentArea);
- XLOG("picture %d (%d, %d, %d, %d - %d x %d) intersects with the new inval area (%d, %d, %d, %d - %d x %d)",
- working - first,
- currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
- currentArea.width(), currentArea.height(),
- inval.fLeft, inval.fTop, inval.fRight, inval.fBottom,
- inval.width(), inval.height());
+ ALOGV("picture %d (%d, %d, %d, %d - %d x %d) intersects with the new inval area (%d, %d, %d, %d - %d x %d)",
+ working - first,
+ currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
+ currentArea.width(), currentArea.height(),
+ inval.fLeft, inval.fTop, inval.fRight, inval.fBottom,
+ inval.width(), inval.height());
working->mArea.setEmpty();
SkSafeUnref(working->mPicture);
working->mPicture = 0;
@@ -526,14 +507,14 @@ void PictureSet::add(const SkIRect& area, uint32_t elapsed, bool split, bool emp
// the total number of pictures under our limit
bool clearUp = false;
if (last - first > MAX_ADDITIONAL_PICTURES) {
- XLOG("--- too many pictures, only keeping the bases : %d", last - first);
+ ALOGV("--- too many pictures, only keeping the bases : %d", last - first);
clearUp = true;
}
if (!clearUp) {
if (mBaseArea > 0 && mBaseArea * MAX_ADDITIONAL_AREA <= mAdditionalArea) {
- XLOG("+++ the sum of the additional area is > %.2f\% of the base Area (%.2f (%.2f) <= %.2f",
- MAX_ADDITIONAL_AREA * 100, mBaseArea * 0.65, mBaseArea, mAdditionalArea);
+ ALOGV("+++ the sum of the additional area is > %.2f\% of the base Area (%.2f (%.2f) <= %.2f",
+ MAX_ADDITIONAL_AREA * 100, mBaseArea * 0.65, mBaseArea, mAdditionalArea);
clearUp = true;
}
}
@@ -548,17 +529,17 @@ void PictureSet::add(const SkIRect& area, uint32_t elapsed, bool split, bool emp
}
#ifdef DEBUG
- XLOG("--- after adding the new inval, but before collapsing ---");
+ ALOGV("--- after adding the new inval, but before collapsing ---");
for (Pictures* working = mPictures.begin(); working != mPictures.end(); working++) {
SkIRect currentArea = working->mArea;
- XLOG("picture %d (%d, %d, %d, %d - %d x %d) base: %c",
- working - first,
- currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
- currentArea.width(), currentArea.height(),
- working->mBase ? 'Y' : 'N');
+ ALOGV("picture %d (%d, %d, %d, %d - %d x %d) base: %c",
+ working - first,
+ currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
+ currentArea.width(), currentArea.height(),
+ working->mBase ? 'Y' : 'N');
}
- XLOG("----------------------------------");
- XLOG("let's collapse...");
+ ALOGV("----------------------------------");
+ ALOGV("let's collapse...");
#endif
// Finally, let's do a pass to collapse out empty regions
@@ -568,20 +549,20 @@ void PictureSet::add(const SkIRect& area, uint32_t elapsed, bool split, bool emp
continue;
*writer++ = *working;
}
- XLOG("shiking of %d elements", writer - first);
+ ALOGV("shiking of %d elements", writer - first);
mPictures.shrink(writer - first);
#ifdef DEBUG
- XLOG("--- after adding the new inval ---");
+ ALOGV("--- after adding the new inval ---");
for (Pictures* working = mPictures.begin(); working != mPictures.end(); working++) {
SkIRect currentArea = working->mArea;
- XLOG("picture %d (%d, %d, %d, %d - %d x %d) base: %c picture %x",
- working - first,
- currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
- currentArea.width(), currentArea.height(),
- working->mBase ? 'Y' : 'N', working->mPicture);
+ ALOGV("picture %d (%d, %d, %d, %d - %d x %d) base: %c picture %x",
+ working - first,
+ currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
+ currentArea.width(), currentArea.height(),
+ working->mBase ? 'Y' : 'N', working->mPicture);
}
- XLOG("----------------------------------");
+ ALOGV("----------------------------------");
#endif
// Base pictures might have been removed/added -- let's recompute them
@@ -589,7 +570,7 @@ void PictureSet::add(const SkIRect& area, uint32_t elapsed, bool split, bool emp
if (checkForNewBases) {
drawn.setEmpty();
Pictures* last = mPictures.end();
- XLOG("checkForNewBases...");
+ ALOGV("checkForNewBases...");
for (Pictures* working = mPictures.begin(); working != last; working++) {
SkRegion area;
area.setRect(working->mArea);
@@ -605,16 +586,16 @@ void PictureSet::add(const SkIRect& area, uint32_t elapsed, bool split, bool emp
}
#ifdef DEBUG
- XLOG("--- after checking for bases ---");
+ ALOGV("--- after checking for bases ---");
for (Pictures* working = mPictures.begin(); working != mPictures.end(); working++) {
SkIRect currentArea = working->mArea;
- XLOG("picture %d (%d, %d, %d, %d - %d x %d) base: %c picture %x",
- working - first,
- currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
- currentArea.width(), currentArea.height(),
- working->mBase ? 'Y' : 'N', working->mPicture);
+ ALOGV("picture %d (%d, %d, %d, %d - %d x %d) base: %c picture %x",
+ working - first,
+ currentArea.fLeft, currentArea.fTop, currentArea.fRight, currentArea.fBottom,
+ currentArea.width(), currentArea.height(),
+ working->mBase ? 'Y' : 'N', working->mPicture);
}
- XLOG("----------------------------------");
+ ALOGV("----------------------------------");
#endif
}
#endif // FAST_PICTURESET
@@ -658,10 +639,10 @@ void PictureSet::setDimensions(int width, int height, SkRegion* inval)
if (bucketSizeX != mBucketSizeX || bucketSizeY != mBucketSizeY)
clearCache = true;
- XLOG("old width=%d height=%d bucketSizeX=%d bucketSizeY=%d bucketCountX=%d bucketCountY=%d clearCache=%d",
- mWidth, mHeight, mBucketSizeX, mBucketSizeY, mBucketCountX, mBucketCountY, clearCache);
- XLOG("new width=%d height=%d bucketSizeX=%d bucketSizeY=%d bucketCountX=%d bucketCountY=%d clearCache=%d",
- width, height, bucketSizeX, bucketSizeY, bucketCountX, bucketCountY, clearCache);
+ ALOGV("old width=%d height=%d bucketSizeX=%d bucketSizeY=%d bucketCountX=%d bucketCountY=%d clearCache=%d",
+ mWidth, mHeight, mBucketSizeX, mBucketSizeY, mBucketCountX, mBucketCountY, clearCache);
+ ALOGV("new width=%d height=%d bucketSizeX=%d bucketSizeY=%d bucketCountX=%d bucketCountY=%d clearCache=%d",
+ width, height, bucketSizeX, bucketSizeY, bucketCountX, bucketCountY, clearCache);
#endif
if (clearCache)
clear();
@@ -721,7 +702,7 @@ uint32_t getThreadMsec()
bool PictureSet::draw(SkCanvas* canvas)
{
#ifdef FAST_PICTURESET
- XLOG("PictureSet %x draw on canvas %x", this, canvas);
+ ALOGV("PictureSet %x draw on canvas %x", this, canvas);
SkRect bounds;
if (canvas->getClipBounds(&bounds) == false)
return false;
@@ -731,10 +712,10 @@ bool PictureSet::draw(SkCanvas* canvas)
WTF::Vector<Bucket*> list;
gatherBucketsForArea(list, irect);
- XLOG("PictureSet draw on canvas %x, we have %d buckets", canvas, list.size());
+ ALOGV("PictureSet draw on canvas %x, we have %d buckets", canvas, list.size());
for (unsigned int i = 0; i < list.size(); i++) {
Bucket* bucket = list[i];
- XLOG("We paint using bucket %x with %d pictures", bucket, bucket->size());
+ ALOGV("We paint using bucket %x with %d pictures", bucket, bucket->size());
for (unsigned int j = 0; j < bucket->size(); j++) {
BucketPicture& picture = bucket->at(j);
if (!picture.mPicture)
@@ -742,7 +723,7 @@ bool PictureSet::draw(SkCanvas* canvas)
int saved = canvas->save();
SkRect pathBounds;
pathBounds.set(picture.mRealArea);
- XLOG("[%d/%d] draw on canvas with clip %d, %d, %d, %d - %d x %d",
+ ALOGV("[%d/%d] draw on canvas with clip %d, %d, %d, %d - %d x %d",
j, bucket->size(),
picture.mRealArea.fLeft,
picture.mRealArea.fTop,
@@ -1011,26 +992,26 @@ void PictureSet::set(const PictureSet& src)
clear();
setDimensions(src.mWidth, src.mHeight);
#ifdef FAST_PICTURESET
- XLOG("\n--- set picture ---");
+ ALOGV("\n--- set picture ---");
for (BucketMap::const_iterator iter = src.mBuckets.begin();
iter != src.mBuckets.end(); ++iter) {
Bucket* sourceBucket = iter->second;
Bucket* targetBucket = getBucket(iter->first.first-1, iter->first.second-1);
BucketPicture* first = sourceBucket->begin();
BucketPicture* last = sourceBucket->end();
- XLOG("set from bucket %x (%d, %d), %d pictures", sourceBucket,
- iter->first.first, iter->first.second, sourceBucket->size());
+ ALOGV("set from bucket %x (%d, %d), %d pictures", sourceBucket,
+ iter->first.first, iter->first.second, sourceBucket->size());
for (BucketPicture* current = first; current != last; current++) {
- XLOG("set picture %x from bucket %x in bucket %x (%d, %d)",
- current->mPicture, sourceBucket, targetBucket,
- iter->first.first, iter->first.second);
+ ALOGV("set picture %x from bucket %x in bucket %x (%d, %d)",
+ current->mPicture, sourceBucket, targetBucket,
+ iter->first.first, iter->first.second);
SkSafeRef(current->mPicture);
BucketPicture picture = { current->mPicture, current->mArea,
current->mRealArea, current->mBase };
targetBucket->append(picture);
}
}
- XLOG("--- DONE set picture ---\n");
+ ALOGV("--- DONE set picture ---\n");
#else
const Pictures* last = src.mPictures.end();
for (const Pictures* working = src.mPictures.begin(); working != last; working++)
diff --git a/Source/WebKit/android/jni/ViewStateSerializer.cpp b/Source/WebKit/android/jni/ViewStateSerializer.cpp
index d3075a2..2be3ecb 100644
--- a/Source/WebKit/android/jni/ViewStateSerializer.cpp
+++ b/Source/WebKit/android/jni/ViewStateSerializer.cpp
@@ -23,6 +23,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#define LOG_TAG "ViewStateSerializer"
+#define LOG_NDEBUG 1
+
#include "config.h"
#include "BaseLayerAndroid.h"
@@ -44,21 +47,6 @@
#include <JNIHelp.h>
#include <jni.h>
-#ifdef DEBUG
-
-#undef XLOG
-#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "ViewStateSerializer", __VA_ARGS__)
-
-#else
-
-#undef XLOG
-#define XLOG(...)
-
-#undef XLOGC
-#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "ViewStateSerializer", __VA_ARGS__)
-
-#endif // DEBUG
-
namespace android {
enum LayerTypes {
@@ -88,7 +76,7 @@ static bool nativeSerializeViewState(JNIEnv* env, jobject, jint jbaseLayer,
else
return false;
int childCount = baseLayer->countChildren();
- XLOG("BaseLayer has %d child(ren)", childCount);
+ ALOGV("BaseLayer has %d child(ren)", childCount);
stream->write32(childCount);
for (int i = 0; i < childCount; i++) {
LayerAndroid* layer = static_cast<LayerAndroid*>(baseLayer->getChild(i));
@@ -251,12 +239,12 @@ void readTransformationMatrix(SkStream *stream, TransformationMatrix& matrix)
void serializeLayer(LayerAndroid* layer, SkWStream* stream)
{
if (!layer) {
- XLOG("NULL layer!");
+ ALOGV("NULL layer!");
stream->write8(LTNone);
return;
}
if (layer->isMedia() || layer->isVideo()) {
- XLOG("Layer isn't supported for serialization: isMedia: %s, isVideo: %s",
+ ALOGV("Layer isn't supported for serialization: isMedia: %s, isVideo: %s",
layer->isMedia() ? "true" : "false",
layer->isVideo() ? "true" : "false");
stream->write8(LTNone);
@@ -281,7 +269,7 @@ void serializeLayer(LayerAndroid* layer, SkWStream* stream)
// Next up, LayerAndroid fields
stream->writeBool(layer->m_haveClip);
- stream->writeBool(layer->isFixed());
+ stream->writeBool(layer->isPositionFixed());
stream->writeBool(layer->m_backgroundColorSet);
stream->writeBool(layer->isIFrame());
@@ -371,7 +359,7 @@ LayerAndroid* deserializeLayer(int version, SkStream* stream)
else if (type == LTScrollableLayerAndroid)
layer = new ScrollableLayerAndroid((RenderLayer*) 0);
else {
- XLOG("Unexpected layer type: %d, aborting!", type);
+ ALOGV("Unexpected layer type: %d, aborting!", type);
return 0;
}
@@ -479,7 +467,7 @@ LayerAndroid* deserializeLayer(int version, SkStream* stream)
if (childLayer)
layer->addChild(childLayer);
}
- XLOG("Created layer with id %d", layer->uniqueId());
+ ALOGV("Created layer with id %d", layer->uniqueId());
return layer;
}
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp
index 1bba9b8..4fbf6ed 100644
--- a/Source/WebKit/android/jni/WebViewCore.cpp
+++ b/Source/WebKit/android/jni/WebViewCore.cpp
@@ -54,6 +54,7 @@
#include "ExceptionCode.h"
#include "FocusController.h"
#include "Font.h"
+#include "FontCache.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "FrameLoaderClientAndroid.h"
@@ -135,6 +136,7 @@
#include <JNIHelp.h>
#include <JNIUtility.h>
#include <androidfw/KeycodeLabels.h>
+#include <cutils/properties.h>
#include <v8.h>
#include <wtf/CurrentTime.h>
#include <wtf/text/AtomicString.h>
@@ -335,6 +337,7 @@ struct WebViewCore::JavaGlue {
jmethodID m_sendViewInvalidate;
jmethodID m_updateTextfield;
jmethodID m_updateTextSelection;
+ jmethodID m_updateTextSizeAndScroll;
jmethodID m_clearTextEntry;
jmethodID m_restoreScale;
jmethodID m_needTouchEvents;
@@ -382,6 +385,23 @@ struct WebViewCore::JavaGlue {
}
};
+struct WebViewCore::TextFieldInitDataGlue {
+ jmethodID m_constructor;
+ jfieldID m_fieldPointer;
+ jfieldID m_text;
+ jfieldID m_type;
+ jfieldID m_isSpellCheckEnabled;
+ jfieldID m_isTextFieldNext;
+ jfieldID m_isTextFieldPrev;
+ jfieldID m_isAutoCompleteEnabled;
+ jfieldID m_name;
+ jfieldID m_label;
+ jfieldID m_maxLength;
+ jfieldID m_nodeBounds;
+ jfieldID m_nodeLayerId;
+ jfieldID m_contentRect;
+};
+
/*
* WebViewCore Implementation
*/
@@ -397,6 +417,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
: m_touchGeneration(0)
, m_lastGeneration(0)
, m_javaGlue(new JavaGlue)
+ , m_textFieldInitDataGlue(new TextFieldInitDataGlue)
, m_mainFrame(mainframe)
, m_popupReply(0)
, m_blurringNodePointer(0)
@@ -451,6 +472,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
m_javaGlue->m_sendViewInvalidate = GetJMethod(env, clazz, "sendViewInvalidate", "(IIII)V");
m_javaGlue->m_updateTextfield = GetJMethod(env, clazz, "updateTextfield", "(IZLjava/lang/String;I)V");
m_javaGlue->m_updateTextSelection = GetJMethod(env, clazz, "updateTextSelection", "(IIIII)V");
+ m_javaGlue->m_updateTextSizeAndScroll = GetJMethod(env, clazz, "updateTextSizeAndScroll", "(IIIII)V");
m_javaGlue->m_clearTextEntry = GetJMethod(env, clazz, "clearTextEntry", "()V");
m_javaGlue->m_restoreScale = GetJMethod(env, clazz, "restoreScale", "(FF)V");
m_javaGlue->m_needTouchEvents = GetJMethod(env, clazz, "needTouchEvents", "(Z)V");
@@ -484,7 +506,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", "(ILjava/lang/String;IZZZLjava/lang/String;Ljava/lang/String;IIIILandroid/graphics/Rect;I)V");
+ m_javaGlue->m_initEditField = GetJMethod(env, clazz, "initEditField", "(IIILandroid/webkit/WebViewCore$TextFieldInitData;)V");
m_javaGlue->m_updateMatchCount = GetJMethod(env, clazz, "updateMatchCount", "(IILjava/lang/String;)V");
m_javaGlue->m_chromeCanTakeFocus = GetJMethod(env, clazz, "chromeCanTakeFocus", "(I)Z");
m_javaGlue->m_chromeTakeFocus = GetJMethod(env, clazz, "chromeTakeFocus", "(I)V");
@@ -492,6 +514,23 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
env->SetIntField(javaWebViewCore, gWebViewCoreFields.m_nativeClass, (jint)this);
+ jclass tfidClazz = env->FindClass("android/webkit/WebViewCore$TextFieldInitData");
+ m_textFieldInitDataGlue->m_fieldPointer = env->GetFieldID(tfidClazz, "mFieldPointer", "I");
+ m_textFieldInitDataGlue->m_text = env->GetFieldID(tfidClazz, "mText", "Ljava/lang/String;");
+ m_textFieldInitDataGlue->m_type = env->GetFieldID(tfidClazz, "mType", "I");
+ m_textFieldInitDataGlue->m_isSpellCheckEnabled = env->GetFieldID(tfidClazz, "mIsSpellCheckEnabled", "Z");
+ m_textFieldInitDataGlue->m_isTextFieldNext = env->GetFieldID(tfidClazz, "mIsTextFieldNext", "Z");
+ m_textFieldInitDataGlue->m_isTextFieldPrev = env->GetFieldID(tfidClazz, "mIsTextFieldPrev", "Z");
+ m_textFieldInitDataGlue->m_isAutoCompleteEnabled = env->GetFieldID(tfidClazz, "mIsAutoCompleteEnabled", "Z");
+ 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_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");
+ env->DeleteLocalRef(tfidClazz);
+
PageGroup::setShouldTrackVisitedLinks(true);
clearContent();
@@ -729,6 +768,7 @@ void WebViewCore::clearContent()
m_content.clear();
m_addInval.setEmpty();
m_rebuildInval.setEmpty();
+ updateLocale();
}
bool WebViewCore::focusBoundsChanged()
@@ -1360,19 +1400,16 @@ static bool isContentEditable(const WebCore::Node* node)
{
if (!node)
return false;
- Frame* frame = node->document()->frame();
- if (!frame)
- return false;
- return frame->selection()->isContentEditable();
+ return node->isContentEditable();
}
// Returns true if the node is a textfield, textarea, or contentEditable
static bool isTextInput(const WebCore::Node* node)
{
- if (isContentEditable(node))
- return true;
if (!node)
return false;
+ if (isContentEditable(node))
+ return true;
WebCore::RenderObject* renderer = node->renderer();
return renderer && (renderer->isTextField() || renderer->isTextArea());
}
@@ -2864,6 +2901,7 @@ void WebViewCore::scrollFocusedTextInput(float xPercent, int y)
renderText->clientWidth()));
renderText->setScrollLeft(x);
renderText->setScrollTop(y);
+ focus->document()->frame()->selection()->recomputeCaretRect();
}
void WebViewCore::setFocusControllerActive(bool active)
@@ -3311,40 +3349,66 @@ WebCore::IntRect WebViewCore::boundingRect(WebCore::Node* node,
return boundingRect;
}
-void WebViewCore::initEditField(Node* node)
+jobject WebViewCore::createTextFieldInitData(Node* node)
{
- String text = getInputText(node);
- int start = 0;
- int end = 0;
- getSelectionOffsets(node, start, end);
JNIEnv* env = JSC::Bindings::getJNIEnv();
- AutoJObject javaObject = m_javaGlue->object(env);
- if (!javaObject.get())
- return;
- m_textGeneration = 0;
- InputType inputType = getInputType(node);
+ TextFieldInitDataGlue* classDef = m_textFieldInitDataGlue;
+ jclass clazz = env->FindClass("android/webkit/WebViewCore$TextFieldInitData");
+ jobject initData = env->NewObject(clazz, classDef->m_constructor);
+ env->SetIntField(initData, classDef->m_fieldPointer,
+ reinterpret_cast<int>(node));
+ env->SetObjectField(initData, classDef->m_text,
+ wtfStringToJstring(env, getInputText(node), true));
+ env->SetIntField(initData, classDef->m_type, getInputType(node));
+ env->SetBooleanField(initData, classDef->m_isSpellCheckEnabled,
+ isSpellCheckEnabled(node));
Document* document = node->document();
PlatformKeyboardEvent tab(AKEYCODE_TAB, 0, 0, false, false, false, false);
PassRefPtr<KeyboardEvent> tabEvent =
KeyboardEvent::create(tab, document->defaultView());
- Node* nextFocus = document->nextFocusableNode(node, tabEvent.get());
- bool isNextText = isTextInput(nextFocus);
- bool spellCheckEnabled = isSpellCheckEnabled(node);
- int maxLength = getMaxLength(node);
- String label = requestLabel(document->frame(), node);
- bool autoComplete = isAutoCompleteEnabled(node);
- jstring name = wtfStringToJstring(env, getFieldName(node), false);
- jstring fieldText = wtfStringToJstring(env, text, true);
- jstring labelText = wtfStringToJstring(env, text, false);
+ env->SetBooleanField(initData, classDef->m_isTextFieldNext,
+ isTextInput(document->nextFocusableNode(node, tabEvent.get())));
+ env->SetBooleanField(initData, classDef->m_isTextFieldPrev,
+ isTextInput(document->previousFocusableNode(node, tabEvent.get())));
+ env->SetBooleanField(initData, classDef->m_isAutoCompleteEnabled,
+ isAutoCompleteEnabled(node));
+ env->SetObjectField(initData, classDef->m_name,
+ wtfStringToJstring(env, getFieldName(node), false));
+ env->SetObjectField(initData, classDef->m_name,
+ wtfStringToJstring(env, requestLabel(document->frame(), node), false));
+ env->SetIntField(initData, classDef->m_maxLength, getMaxLength(node));
LayerAndroid* layer = 0;
int layerId = platformLayerIdFromNode(node, &layer);
- jobject nodeBounds = intRectToRect(env, boundingRect(node, layer));
+ IntRect bounds = boundingRect(node, layer);
+ env->SetObjectField(initData, classDef->m_nodeBounds,
+ intRectToRect(env, bounds));
+ env->SetIntField(initData, classDef->m_nodeLayerId, layerId);
+ IntRect contentRect;
+ RenderTextControl* rtc = toRenderTextControl(node);
+ if (rtc) {
+ contentRect.setWidth(rtc->scrollWidth());
+ contentRect.setHeight(rtc->scrollHeight());
+ contentRect.move(-rtc->scrollLeft(), -rtc->scrollTop());
+ }
+ env->SetObjectField(initData, classDef->m_contentRect,
+ intRectToRect(env, contentRect));
+ return initData;
+}
+
+void WebViewCore::initEditField(Node* node)
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ m_textGeneration = 0;
+ int start = 0;
+ int end = 0;
+ getSelectionOffsets(node, start, end);
SelectText* selectText = createSelectText(focusedFrame()->selection()->selection());
env->CallVoidMethod(javaObject.get(), m_javaGlue->m_initEditField,
- reinterpret_cast<int>(node), fieldText, inputType,
- spellCheckEnabled, autoComplete, isNextText, name, labelText,
- start, end, reinterpret_cast<int>(selectText), maxLength,
- nodeBounds, layerId);
+ start, end, reinterpret_cast<int>(selectText),
+ createTextFieldInitData(node));
checkException(env);
}
@@ -3740,6 +3804,24 @@ void WebViewCore::updateTextSelection()
checkException(env);
}
+void WebViewCore::updateTextSizeAndScroll(WebCore::Node* node)
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ RenderTextControl* rtc = toRenderTextControl(node);
+ if (!rtc)
+ return;
+ int width = rtc->scrollWidth();
+ int height = rtc->contentHeight();
+ int scrollX = rtc->scrollLeft();
+ int scrollY = rtc->scrollTop();
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_updateTextSizeAndScroll,
+ reinterpret_cast<int>(node), width, height, scrollX, scrollY);
+ checkException(env);
+}
+
void WebViewCore::updateTextfield(WebCore::Node* ptr, bool changeToPassword,
const WTF::String& text)
{
@@ -4255,6 +4337,41 @@ String WebViewCore::getText(int startX, int startY, int endX, int endY)
return text;
}
+/**
+ * Read the persistent locale.
+ */
+void WebViewCore::getLocale(String& language, String& region)
+{
+ char propLang[PROPERTY_VALUE_MAX], propRegn[PROPERTY_VALUE_MAX];
+
+ property_get("persist.sys.language", propLang, "");
+ property_get("persist.sys.country", propRegn, "");
+ if (*propLang == 0 && *propRegn == 0) {
+ /* Set to ro properties, default is en_US */
+ property_get("ro.product.locale.language", propLang, "en");
+ property_get("ro.product.locale.region", propRegn, "US");
+ }
+ language = String(propLang, 2);
+ region = String(propRegn, 2);
+}
+
+void WebViewCore::updateLocale()
+{
+ static String prevLang;
+ static String prevRegn;
+ String language;
+ String region;
+
+ getLocale(language, region);
+
+ if ((language != prevLang) || (region != prevRegn)) {
+ prevLang = language;
+ prevRegn = region;
+ GlyphPageTreeNode::resetRoots();
+ fontCache()->invalidate();
+ }
+}
+
//----------------------------------------------------------------------
// Native JNI methods
//----------------------------------------------------------------------
diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h
index ff55c00..6850111 100644
--- a/Source/WebKit/android/jni/WebViewCore.h
+++ b/Source/WebKit/android/jni/WebViewCore.h
@@ -49,6 +49,7 @@
#include <jni.h>
#include <androidfw/KeycodeLabels.h>
#include <ui/PixelFormat.h>
+#include <utils/threads.h>
namespace WebCore {
class Color;
@@ -228,6 +229,12 @@ namespace android {
*/
void updateTextSelection();
+ /**
+ * Updates the java side with the node's content size and scroll
+ * position.
+ */
+ void updateTextSizeAndScroll(WebCore::Node* node);
+
void clearTextEntry();
// JavaScript support
void jsAlert(const WTF::String& url, const WTF::String& text);
@@ -607,6 +614,12 @@ namespace android {
*/
WebCore::VisiblePosition visiblePositionForWindowPoint(int x, int y);
+ // Retrieves the current locale from system properties
+ void getLocale(String& language, String& region);
+
+ // Handles changes in system locale
+ void updateLocale();
+
// these members are shared with webview.cpp
int m_touchGeneration; // copy of state in WebViewNative triggered by touch
int m_lastGeneration; // last action using up to date cache
@@ -663,6 +676,7 @@ namespace android {
void advanceAnchorNode(DOMSelection* selection, int direction, String& markup, bool ignoreFirstNode, ExceptionCode& ec);
Node* getNextAnchorNode(Node* anchorNode, bool skipFirstHack, int direction);
Node* getImplicitBoundaryNode(Node* node, unsigned offset, int direction);
+ jobject createTextFieldInitData(Node* node);
/**
* Calls into java to reset the text edit field with the
* current contents and selection.
@@ -733,6 +747,8 @@ namespace android {
friend class ListBoxReply;
struct JavaGlue;
struct JavaGlue* m_javaGlue;
+ struct TextFieldInitDataGlue;
+ struct TextFieldInitDataGlue* m_textFieldInitDataGlue;
WebCore::Frame* m_mainFrame;
WebCoreReply* m_popupReply;
int m_blurringNodePointer;