diff options
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r-- | Source/WebKit/android/WebCoreSupport/EditorClientAndroid.cpp | 18 | ||||
-rw-r--r-- | Source/WebKit/android/WebCoreSupport/WebRequest.cpp | 14 | ||||
-rw-r--r-- | Source/WebKit/android/WebCoreSupport/WebRequest.h | 1 | ||||
-rw-r--r-- | Source/WebKit/android/jni/PictureSet.cpp | 159 | ||||
-rw-r--r-- | Source/WebKit/android/jni/ViewStateSerializer.cpp | 30 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.cpp | 179 | ||||
-rw-r--r-- | Source/WebKit/android/jni/WebViewCore.h | 16 |
7 files changed, 262 insertions, 155 deletions
diff --git a/Source/WebKit/android/WebCoreSupport/EditorClientAndroid.cpp b/Source/WebKit/android/WebCoreSupport/EditorClientAndroid.cpp index 785f0a8..042c227 100644 --- a/Source/WebKit/android/WebCoreSupport/EditorClientAndroid.cpp +++ b/Source/WebKit/android/WebCoreSupport/EditorClientAndroid.cpp @@ -228,8 +228,22 @@ void EditorClientAndroid::checkGrammarOfString(unsigned short const*, int, WTF:: void EditorClientAndroid::checkSpellingOfString(unsigned short const*, int, int*, int*) {} String EditorClientAndroid::getAutoCorrectSuggestionForMisspelledWord(const String&) { return String(); } void EditorClientAndroid::textFieldDidEndEditing(Element*) {} -void EditorClientAndroid::textDidChangeInTextArea(Element*) {} -void EditorClientAndroid::textDidChangeInTextField(Element*) {} +void EditorClientAndroid::textDidChangeInTextArea(Element* element) +{ + Frame* frame = m_page->focusController()->focusedOrMainFrame(); + if (!frame || !frame->view()) + return; + WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view()); + webViewCore->updateTextSizeAndScroll(element); +} +void EditorClientAndroid::textDidChangeInTextField(Element* element) +{ + Frame* frame = m_page->focusController()->focusedOrMainFrame(); + if (!frame || !frame->view()) + return; + WebViewCore* webViewCore = WebViewCore::getWebViewCore(frame->view()); + webViewCore->updateTextSizeAndScroll(element); +} void EditorClientAndroid::textFieldDidBeginEditing(Element*) {} void EditorClientAndroid::ignoreWordInSpellDocument(String const&) {} diff --git a/Source/WebKit/android/WebCoreSupport/WebRequest.cpp b/Source/WebKit/android/WebCoreSupport/WebRequest.cpp index fea7afa..4c479e3 100644 --- a/Source/WebKit/android/WebCoreSupport/WebRequest.cpp +++ b/Source/WebKit/android/WebCoreSupport/WebRequest.cpp @@ -81,7 +81,6 @@ base::LazyInstance<RequestPackageName> s_packageName(base::LINKER_INITIALIZED); WebRequest::WebRequest(WebUrlLoaderClient* loader, const WebResourceRequest& webResourceRequest) : m_urlLoader(loader) - , m_androidUrl(false) , m_url(webResourceRequest.url()) , m_userAgent(webResourceRequest.userAgent()) , m_loadState(Created) @@ -108,7 +107,6 @@ WebRequest::WebRequest(WebUrlLoaderClient* loader, const WebResourceRequest& web WebRequest::WebRequest(WebUrlLoaderClient* loader, const WebResourceRequest& webResourceRequest, UrlInterceptResponse* intercept) : m_urlLoader(loader) , m_interceptResponse(intercept) - , m_androidUrl(true) , m_url(webResourceRequest.url()) , m_userAgent(webResourceRequest.userAgent()) , m_loadState(Created) @@ -293,15 +291,9 @@ void WebRequest::handleInterceptedURL() // Get the MIME type from the URL. "text/html" is a last resort, hopefully overridden. std::string mimeType("text/html"); if (mime == "") { - // Gmail appends the MIME to the end of the URL, with a ? separator. - size_t mimeTypeIndex = m_url.find_last_of('?'); - if (mimeTypeIndex != std::string::npos) { - mimeType.assign(m_url.begin() + mimeTypeIndex + 1, m_url.end()); - } else { - // Get the MIME type from the file extension, if any. - FilePath path(m_url); - net::GetMimeTypeFromFile(path, &mimeType); - } + // Get the MIME type from the file extension, if any. + FilePath path(m_url); + net::GetMimeTypeFromFile(path, &mimeType); } else { // Set from the intercept response. mimeType = mime; diff --git a/Source/WebKit/android/WebCoreSupport/WebRequest.h b/Source/WebKit/android/WebCoreSupport/WebRequest.h index 285e577..d9054e9 100644 --- a/Source/WebKit/android/WebCoreSupport/WebRequest.h +++ b/Source/WebKit/android/WebCoreSupport/WebRequest.h @@ -107,7 +107,6 @@ private: OwnPtr<net::URLRequest> m_request; scoped_refptr<net::IOBuffer> m_networkBuffer; scoped_ptr<UrlInterceptResponse> m_interceptResponse; - bool m_androidUrl; std::string m_url; std::string m_userAgent; LoadState m_loadState; 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; |