diff options
19 files changed, 168 insertions, 164 deletions
diff --git a/Source/WebCore/platform/graphics/android/BaseTile.cpp b/Source/WebCore/platform/graphics/android/BaseTile.cpp index 70b98b0..ed2ad3e 100644 --- a/Source/WebCore/platform/graphics/android/BaseTile.cpp +++ b/Source/WebCore/platform/graphics/android/BaseTile.cpp @@ -28,8 +28,8 @@ #if USE(ACCELERATED_COMPOSITING) -#include "RasterRenderer.h" #include "GLUtils.h" +#include "RasterRenderer.h" #include "TextureInfo.h" #include "TilesManager.h" @@ -64,15 +64,25 @@ BaseTile::BaseTile() , m_repaintPending(false) , m_usable(true) , m_lastDirtyPicture(0) - , m_fullRepaintA(true) - , m_fullRepaintB(true) , m_lastPaintedPicture(0) { #ifdef DEBUG_COUNT ClassTracker::instance()->increment("BaseTile"); #endif - m_currentDirtyArea = &m_dirtyAreaA; + m_currentDirtyAreaIndex = 0; m_renderer = new RasterRenderer(); + + // For EglImage Mode, the internal buffer should be 2. + // And for Async Surface Texture mode, this is 3. + if (TilesManager::instance()->getSharedTextureMode() == EglImageMode) + m_maxBufferNumber = 2; + else + m_maxBufferNumber = 3; + + m_dirtyArea = new SkRegion[m_maxBufferNumber]; + m_fullRepaint = new bool[m_maxBufferNumber]; + for (int i = 0; i < m_maxBufferNumber; i++) + m_fullRepaint[i] = true; } BaseTile::~BaseTile() @@ -82,6 +92,8 @@ BaseTile::~BaseTile() m_texture->release(this); delete m_renderer; + delete[] m_dirtyArea; + delete[] m_fullRepaint; #ifdef DEBUG_COUNT ClassTracker::instance()->decrement("BaseTile"); @@ -122,10 +134,10 @@ bool BaseTile::removeTexture(BaseTileTexture* texture) void BaseTile::fullInval() { - m_dirtyAreaA.setEmpty(); - m_dirtyAreaB.setEmpty(); - m_fullRepaintA = true; - m_fullRepaintB = true; + for (int i = 0; i < m_maxBufferNumber; i++) { + m_dirtyArea[i].setEmpty(); + m_fullRepaint[i] = true; + } m_dirty = true; } @@ -143,8 +155,8 @@ void BaseTile::markAsDirty(int unsigned pictureCount, { android::AutoMutex lock(m_atomicSync); m_lastDirtyPicture = pictureCount; - m_dirtyAreaA.op(dirtyArea, SkRegion::kUnion_Op); - m_dirtyAreaB.op(dirtyArea, SkRegion::kUnion_Op); + for (int i = 0; i < m_maxBufferNumber; i++) + m_dirtyArea[i].op(dirtyArea, SkRegion::kUnion_Op); m_dirty = true; } @@ -260,15 +272,14 @@ void BaseTile::paintBitmap() m_atomicSync.lock(); bool dirty = m_dirty; BaseTileTexture* texture = m_texture; - SkRegion dirtyArea = *m_currentDirtyArea; + SkRegion dirtyArea = m_dirtyArea[m_currentDirtyAreaIndex]; float scale = m_scale; const int x = m_x; const int y = m_y; m_atomicSync.unlock(); - if (!dirty || !texture) { + if (!dirty || !texture) return; - } TiledPage* tiledPage = m_page; @@ -299,12 +310,12 @@ void BaseTile::paintBitmap() SkRegion::Iterator cliperator(dirtyArea); bool fullRepaint = false; + // TODO: Implement the partial invalidate in Surface Texture Mode - if (((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA) - || ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB) - || textureInfo->m_width != tileWidth - || textureInfo->m_height != tileHeight - || textureInfo->getSharedTextureMode() == SurfaceTextureMode) { + if (m_fullRepaint[m_currentDirtyAreaIndex] + || textureInfo->m_width != tileWidth + || textureInfo->m_height != tileHeight + || textureInfo->getSharedTextureMode() == SurfaceTextureMode) { fullRepaint = true; } @@ -379,12 +390,7 @@ void BaseTile::paintBitmap() m_lastPaintedPicture = pictureCount; // set the fullrepaint flags - - if ((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA) - m_fullRepaintA = false; - - if ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB) - m_fullRepaintB = false; + m_fullRepaint[m_currentDirtyAreaIndex] = false; // The various checks to see if we are still dirty... @@ -394,18 +400,19 @@ void BaseTile::paintBitmap() m_dirty = true; if (fullRepaint) - m_currentDirtyArea->setEmpty(); + m_dirtyArea[m_currentDirtyAreaIndex].setEmpty(); else - m_currentDirtyArea->op(dirtyArea, SkRegion::kDifference_Op); + m_dirtyArea[m_currentDirtyAreaIndex].op(dirtyArea, SkRegion::kDifference_Op); - if (!m_currentDirtyArea->isEmpty()) + if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty()) m_dirty = true; // Now we can swap the dirty areas + // TODO: For surface texture in Async mode, the index will be updated + // according to the current buffer just dequeued. + m_currentDirtyAreaIndex = (m_currentDirtyAreaIndex+1) % m_maxBufferNumber; - m_currentDirtyArea = m_currentDirtyArea == &m_dirtyAreaA ? &m_dirtyAreaB : &m_dirtyAreaA; - - if (!m_currentDirtyArea->isEmpty()) + if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty()) m_dirty = true; if (!m_dirty) diff --git a/Source/WebCore/platform/graphics/android/BaseTile.h b/Source/WebCore/platform/graphics/android/BaseTile.h index 8a812f8..b5fc7ba 100644 --- a/Source/WebCore/platform/graphics/android/BaseTile.h +++ b/Source/WebCore/platform/graphics/android/BaseTile.h @@ -125,11 +125,10 @@ private: unsigned int m_lastDirtyPicture; // store the dirty region - SkRegion m_dirtyAreaA; - SkRegion m_dirtyAreaB; - bool m_fullRepaintA; - bool m_fullRepaintB; - SkRegion* m_currentDirtyArea; + SkRegion* m_dirtyArea; + bool* m_fullRepaint; + int m_maxBufferNumber; + int m_currentDirtyAreaIndex; // stores the id of the latest picture painted to the tile. If the id is 0 // then we know that the picture has not yet been painted an there is nothing diff --git a/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp b/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp index 4d1dec1..f66019a 100644 --- a/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp +++ b/Source/WebCore/platform/graphics/android/BaseTileTexture.cpp @@ -39,7 +39,8 @@ namespace WebCore { BaseTileTexture::BaseTileTexture(uint32_t w, uint32_t h) - : DoubleBufferedTexture(eglGetCurrentContext(), SurfaceTextureMode) + : DoubleBufferedTexture(eglGetCurrentContext(), + TilesManager::instance()->getSharedTextureMode()) , m_usedLevel(-1) , m_owner(0) , m_delayedReleaseOwner(0) diff --git a/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp b/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp index 429a125..e015f5a 100644 --- a/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/GraphicsContextAndroid.cpp @@ -624,10 +624,10 @@ static void setrectForUnderline(SkRect* r, GraphicsContext* context, const Float if (lineThickness < 1) // Do we really need/want this? lineThickness = 1; #endif - r->fLeft = SkIntToScalar(point.x()); - r->fTop = SkIntToScalar(point.y() + yOffset); - r->fRight = r->fLeft + SkIntToScalar(width); - r->fBottom = r->fTop + SkFloatToScalar(lineThickness); + r->fLeft = point.x(); + r->fTop = point.y() + yOffset; + r->fRight = r->fLeft + width; + r->fBottom = r->fTop + lineThickness; } void GraphicsContext::drawLineForText(const FloatPoint& pt, float width, bool) diff --git a/Source/WebCore/platform/graphics/android/ShaderProgram.cpp b/Source/WebCore/platform/graphics/android/ShaderProgram.cpp index 655af0e..f9f4c4c 100644 --- a/Source/WebCore/platform/graphics/android/ShaderProgram.cpp +++ b/Source/WebCore/platform/graphics/android/ShaderProgram.cpp @@ -267,7 +267,7 @@ void ShaderProgram::setViewport(SkRect& viewport) m_viewport = viewport; } -void ShaderProgram::setProjectionMatrix(SkRect& geometry) +void ShaderProgram::setProjectionMatrix(SkRect& geometry, GLint projectionMatrixHandle) { TransformationMatrix translate; translate.translate3d(geometry.fLeft, geometry.fTop, 0.0); @@ -278,20 +278,21 @@ void ShaderProgram::setProjectionMatrix(SkRect& geometry) GLfloat projectionMatrix[16]; GLUtils::toGLMatrix(projectionMatrix, total); - glUniformMatrix4fv(m_hProjectionMatrix, 1, GL_FALSE, projectionMatrix); + glUniformMatrix4fv(projectionMatrixHandle, 1, GL_FALSE, projectionMatrix); } void ShaderProgram::drawQuadInternal(SkRect& geometry, GLint textureId, float opacity, GLint program, + GLint projectionMatrixHandle, GLint texSampler, GLenum textureTarget, GLint position, GLint alpha) { glUseProgram(program); - setProjectionMatrix(geometry); + setProjectionMatrix(geometry, projectionMatrixHandle); glActiveTexture(GL_TEXTURE0); glUniform1i(texSampler, 0); @@ -315,14 +316,17 @@ void ShaderProgram::drawQuad(SkRect& geometry, int textureId, float opacity, { if (textureTarget == GL_TEXTURE_2D) { drawQuadInternal(geometry, textureId, opacity, m_program, + m_hProjectionMatrix, m_hTexSampler, GL_TEXTURE_2D, m_hPosition, alpha()); } else if (textureTarget == GL_TEXTURE_EXTERNAL_OES) { drawQuadInternal(geometry, textureId, opacity, m_surfTexOESProgram, + m_hSTOESProjectionMatrix, m_hSTOESTexSampler, GL_TEXTURE_EXTERNAL_OES, m_hSTOESPosition, m_hSTOESAlpha); } else if (!textureTarget) { drawQuadInternal(geometry, textureId, opacity, m_surfTex2DProgram, + m_hST2DProjectionMatrix, m_hST2DTexSampler, GL_TEXTURE_2D, m_hST2DPosition, m_hST2DAlpha); } diff --git a/Source/WebCore/platform/graphics/android/ShaderProgram.h b/Source/WebCore/platform/graphics/android/ShaderProgram.h index 2577fb0..c64a9b9 100644 --- a/Source/WebCore/platform/graphics/android/ShaderProgram.h +++ b/Source/WebCore/platform/graphics/android/ShaderProgram.h @@ -81,12 +81,13 @@ class ShaderProgram { private: GLuint loadShader(GLenum shaderType, const char* pSource); GLuint createProgram(const char* vertexSource, const char* fragmentSource); - void setProjectionMatrix(SkRect& geometry); + void setProjectionMatrix(SkRect& geometry, GLint projectionMatrixHandle); void setBlendingState(bool enableBlending); void drawQuadInternal(SkRect& geometry, GLint textureId, float opacity, - GLint program, GLint texSampler, GLenum textureTarget, + GLint program, GLint projectionMatrixHandle, + GLint texSampler, GLenum textureTarget, GLint position, GLint alpha); void drawLayerQuadInternal(const GLfloat* projectionMatrix, int textureId, diff --git a/Source/WebCore/platform/graphics/android/TilesManager.h b/Source/WebCore/platform/graphics/android/TilesManager.h index 2ef9e66..fe53666 100644 --- a/Source/WebCore/platform/graphics/android/TilesManager.h +++ b/Source/WebCore/platform/graphics/android/TilesManager.h @@ -126,6 +126,10 @@ public: m_showVisualIndicator = showVisualIndicator; } + SharedTextureMode getSharedTextureMode() { + return SurfaceTextureMode; + } + private: TilesManager(); diff --git a/Source/WebKit/android/WebCoreSupport/ChromiumIncludes.h b/Source/WebKit/android/WebCoreSupport/ChromiumIncludes.h index 670b307..dac555f 100644 --- a/Source/WebKit/android/WebCoreSupport/ChromiumIncludes.h +++ b/Source/WebKit/android/WebCoreSupport/ChromiumIncludes.h @@ -47,12 +47,12 @@ #include <android/net/android_network_library_impl.h> #include <base/callback.h> -#include <base/synchronization/lock.h> +#include <base/memory/ref_counted.h> #include <base/message_loop_proxy.h> #include <base/openssl_util.h> -#include <base/ref_counted.h> #include <base/string_util.h> #include <base/synchronization/condition_variable.h> +#include <base/synchronization/lock.h> #include <base/sys_string_conversions.h> #include <base/threading/thread.h> #include <base/time.h> @@ -86,7 +86,7 @@ #include <autofill/autofill_profile.h> #include <autofill/personal_data_manager.h> #include <base/logging.h> -#include <base/scoped_vector.h> +#include <base/memory/scoped_vector.h> #include <base/string16.h> #include <base/utf_string_conversions.h> #include <chrome/browser/autofill/autofill_host.h> diff --git a/Source/WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp b/Source/WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp index 3779ba8..77e3c32 100644 --- a/Source/WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp +++ b/Source/WebKit/android/WebCoreSupport/UrlInterceptResponse.cpp @@ -46,6 +46,7 @@ public: LOG_ALWAYS_FATAL_IF(!m_read); m_close = env->GetMethodID(inputStreamClass, "close", "()V"); LOG_ALWAYS_FATAL_IF(!m_close); + env->DeleteLocalRef(inputStreamClass); } ~JavaInputStreamWrapper() { @@ -112,6 +113,7 @@ UrlInterceptResponse::UrlInterceptResponse(JNIEnv* env, jobject response) { } env->DeleteLocalRef(javaResponse); + env->DeleteLocalRef(stream); env->DeleteLocalRef(mimeStr); env->DeleteLocalRef(encodingStr); } diff --git a/Source/WebKit/android/WebCoreSupport/WebCookieJar.cpp b/Source/WebKit/android/WebCoreSupport/WebCookieJar.cpp index dfb249d..1dc4637 100644 --- a/Source/WebKit/android/WebCoreSupport/WebCookieJar.cpp +++ b/Source/WebKit/android/WebCoreSupport/WebCookieJar.cpp @@ -165,14 +165,14 @@ int WebCookieJar::getNumCookiesInDatabase() } // From CookiePolicy in chromium -int WebCookieJar::CanGetCookies(const GURL&, const GURL&, net::CompletionCallback*) +int WebCookieJar::CanGetCookies(const GURL&, const GURL&) const { MutexLocker lock(m_allowCookiesMutex); return m_allowCookies ? net::OK : net::ERR_ACCESS_DENIED; } // From CookiePolicy in chromium -int WebCookieJar::CanSetCookie(const GURL&, const GURL&, const std::string&, net::CompletionCallback*) +int WebCookieJar::CanSetCookie(const GURL&, const GURL&, const std::string&) const { MutexLocker lock(m_allowCookiesMutex); return m_allowCookies ? net::OK : net::ERR_ACCESS_DENIED; diff --git a/Source/WebKit/android/WebCoreSupport/WebCookieJar.h b/Source/WebKit/android/WebCoreSupport/WebCookieJar.h index 1f4266c..b6490af 100644 --- a/Source/WebKit/android/WebCoreSupport/WebCookieJar.h +++ b/Source/WebKit/android/WebCoreSupport/WebCookieJar.h @@ -43,8 +43,8 @@ public: static void flush(); // CookiePolicy implementation from external/chromium - virtual int CanGetCookies(const GURL& url, const GURL& first_party_for_cookies, net::CompletionCallback*); - virtual int CanSetCookie(const GURL& url, const GURL& first_party_for_cookies, const std::string& cookie_line, net::CompletionCallback*); + virtual int CanGetCookies(const GURL& url, const GURL& first_party_for_cookies) const; + virtual int CanSetCookie(const GURL& url, const GURL& first_party_for_cookies, const std::string& cookie_line) const; bool allowCookies(); void setAllowCookies(bool allow); @@ -70,7 +70,7 @@ private: scoped_refptr<SQLitePersistentCookieStore> m_cookieDb; scoped_refptr<net::CookieStore> m_cookieStore; bool m_allowCookies; - WTF::Mutex m_allowCookiesMutex; + mutable WTF::Mutex m_allowCookiesMutex; }; } diff --git a/Source/WebKit/android/WebCoreSupport/WebViewClientError.cpp b/Source/WebKit/android/WebCoreSupport/WebViewClientError.cpp index 59542da..d5270a9 100644 --- a/Source/WebKit/android/WebCoreSupport/WebViewClientError.cpp +++ b/Source/WebKit/android/WebCoreSupport/WebViewClientError.cpp @@ -98,7 +98,6 @@ WebViewClientError ToWebViewClientError(net::Error error) { case ERR_SSL_BAD_RECORD_MAC_ALERT: case ERR_SSL_UNSAFE_NEGOTIATION: case ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY: - case ERR_SSL_SNAP_START_NPN_MISPREDICTION: case ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED: case ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY: return ERROR_FAILED_SSL_HANDSHAKE; diff --git a/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.cpp b/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.cpp index 6af0875..1116b7f 100644 --- a/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.cpp +++ b/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.cpp @@ -52,31 +52,31 @@ using namespace WebCore::HTMLNames; namespace webkit_glue { FormField::FormField() - : max_length_(0), - is_autofilled_(false) { + : max_length(0), + is_autofilled(false) { } // TODO: This constructor should probably be deprecated and the // functionality moved to FormManager. FormField::FormField(const HTMLFormControlElement& element) - : max_length_(0), - is_autofilled_(false) { - name_ = nameForAutoFill(element); + : max_length(0), + is_autofilled(false) { + name = nameForAutoFill(element); // TODO: Extract the field label. For now we just use the field // name. - label_ = name_; + label = name; - form_control_type_ = formControlType(element); - if (form_control_type_ == kText) { + form_control_type = formControlType(element); + if (form_control_type == kText) { const HTMLInputElement& input_element = static_cast<const HTMLInputElement&>(element); - value_ = WTFStringToString16(input_element.value()); - max_length_ = input_element.size(); - is_autofilled_ = input_element.isAutofilled(); - } else if (form_control_type_ == kSelectOne) { + value = WTFStringToString16(input_element.value()); + max_length = input_element.size(); + is_autofilled = input_element.isAutofilled(); + } else if (form_control_type == kSelectOne) { const HTMLSelectElement& const_select_element = static_cast<const HTMLSelectElement&>(element); HTMLSelectElement& select_element = const_cast<HTMLSelectElement&>(const_select_element); - value_ = WTFStringToString16(select_element.value()); + value = WTFStringToString16(select_element.value()); // For select-one elements copy option strings. WTF::Vector<Element*> list_items = select_element.listItems(); @@ -87,16 +87,16 @@ FormField::FormField(const HTMLFormControlElement& element) } } - TrimWhitespace(value_, TRIM_LEADING, &value_); + TrimWhitespace(value, TRIM_LEADING, &value); } -FormField::FormField(const string16& label, const string16& name, const string16& value, const string16& form_control_type, int max_length, bool is_autofilled) - : label_(label), - name_(name), - value_(value), - form_control_type_(form_control_type), - max_length_(max_length), - is_autofilled_(is_autofilled) { +FormField::FormField(const string16& _label, const string16& _name, const string16& _value, const string16& _form_control_type, int _max_length, bool _is_autofilled) + : label(_label), + name(_name), + value(_value), + form_control_type(_form_control_type), + max_length(_max_length), + is_autofilled(_is_autofilled) { } FormField::~FormField() { @@ -105,10 +105,10 @@ FormField::~FormField() { bool FormField::operator==(const FormField& field) const { // A FormField stores a value, but the value is not part of the identity of // the field, so we don't want to compare the values. - return (label_ == field.label_ && - name_ == field.name_ && - form_control_type_ == field.form_control_type_ && - max_length_ == field.max_length_); + return (label == field.label && + name == field.name && + form_control_type == field.form_control_type && + max_length == field.max_length); } bool FormField::operator!=(const FormField& field) const { @@ -116,24 +116,24 @@ bool FormField::operator!=(const FormField& field) const { } bool FormField::StrictlyEqualsHack(const FormField& field) const { - return (label_ == field.label_ && - name_ == field.name_ && - value_ == field.value_ && - form_control_type_ == field.form_control_type_ && - max_length_ == field.max_length_); + return (label == field.label && + name == field.name && + value == field.value && + form_control_type == field.form_control_type && + max_length == field.max_length); } std::ostream& operator<<(std::ostream& os, const FormField& field) { return os - << UTF16ToUTF8(field.label()) + << UTF16ToUTF8(field.label) << " " - << UTF16ToUTF8(field.name()) + << UTF16ToUTF8(field.name) << " " - << UTF16ToUTF8(field.value()) + << UTF16ToUTF8(field.value) << " " - << UTF16ToUTF8(field.form_control_type()) + << UTF16ToUTF8(field.form_control_type) << " " - << field.max_length(); + << field.max_length; } } // namespace webkit_glue diff --git a/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.h b/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.h index c5e3ecc..9379c09 100644 --- a/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.h +++ b/Source/WebKit/android/WebCoreSupport/autofill/FormFieldAndroid.h @@ -48,23 +48,17 @@ public: FormField(const string16& label, const string16& name, const string16& value, const string16& form_control_type, int max_length, bool is_autofilled); virtual ~FormField(); - const string16& label() const { return label_; } - const string16& name() const { return name_; } - const string16& value() const { return value_; } - const string16& form_control_type() const { return form_control_type_; } - int max_length() const { return max_length_; } - bool is_autofilled() const { return is_autofilled_; } + string16 label; + string16 name; + string16 value; + string16 form_control_type; + int max_length; + bool is_autofilled; // Returns option string for elements for which they make sense (select-one, // for example) for the rest of elements return an empty array. const std::vector<string16>& option_strings() const { return option_strings_; } - void set_label(const string16& label) { label_ = label; } - void set_name(const string16& name) { name_ = name; } - void set_value(const string16& value) { value_ = value; } - void set_form_control_type(const string16& form_control_type) { form_control_type_ = form_control_type; } - void set_max_length(int max_length) { max_length_ = max_length; } - void set_autofilled(bool is_autofilled) { is_autofilled_ = is_autofilled; } void set_option_strings(const std::vector<string16>& strings) { option_strings_ = strings; } // Equality tests for identity which does not include |value_| or |size_|. @@ -79,12 +73,6 @@ public: bool StrictlyEqualsHack(const FormField& field) const; private: - string16 label_; - string16 name_; - string16 value_; - string16 form_control_type_; - int max_length_; - bool is_autofilled_; std::vector<string16> option_strings_; }; diff --git a/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp b/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp index 9652794..44a8c34 100644 --- a/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp +++ b/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp @@ -310,8 +310,8 @@ void FormManager::HTMLFormControlElementToFormField(HTMLFormControlElement* elem // The label is not officially part of a HTMLFormControlElement; however, the // labels for all form control elements are scraped from the DOM and set in // WebFormElementToFormData. - field->set_name(nameForAutoFill(*element)); - field->set_form_control_type(formControlType(*element)); + field->name = nameForAutoFill(*element); + field->form_control_type = formControlType(*element); if (extract_mask & EXTRACT_OPTIONS) { std::vector<string16> option_strings; @@ -321,8 +321,8 @@ void FormManager::HTMLFormControlElementToFormField(HTMLFormControlElement* elem if (formControlType(*element) == kText) { HTMLInputElement* input_element = static_cast<HTMLInputElement*>(element); - field->set_max_length(input_element->maxLength()); - field->set_autofilled(input_element->isAutofilled()); + field->max_length = input_element->maxLength(); + field->is_autofilled = input_element->isAutofilled(); } if (!(extract_mask & EXTRACT_VALUE)) @@ -359,7 +359,7 @@ void FormManager::HTMLFormControlElementToFormField(HTMLFormControlElement* elem if (value.size() > kMaxDataLength) value = value.substr(0, kMaxDataLength); - field->set_value(value); + field->value = value; } // static @@ -442,7 +442,7 @@ bool FormManager::HTMLFormElementToFormData(HTMLFormElement* element, Requiremen // TODO: A label element is mapped to a form control element's id. // field->name() will contain the id only if the name does not exist. Add // an id() method to HTMLFormControlElement and use that here. - name_map[field->name()] = field; + name_map[field->name] = field; fields_extracted[i] = true; } @@ -465,7 +465,7 @@ bool FormManager::HTMLFormElementToFormData(HTMLFormElement* element, Requiremen std::map<string16, FormField*>::iterator iter = name_map.find(nameForAutoFill(*field_element)); if (iter != name_map.end()) - iter->second->set_label(FindChildText(label)); + iter->second->label = FindChildText(label); } // Loop through the form control elements, extracting the label text from the @@ -482,8 +482,8 @@ bool FormManager::HTMLFormElementToFormData(HTMLFormElement* element, Requiremen continue; const HTMLFormControlElement* control_element = static_cast<HTMLFormControlElement*>(control_elements[i]); - if (form_fields[field_idx]->label().empty()) - form_fields[field_idx]->set_label(FormManager::InferLabelForElement(*control_element)); + if (form_fields[field_idx]->label.empty()) + form_fields[field_idx]->label = FormManager::InferLabelForElement(*control_element); ++field_idx; @@ -786,13 +786,13 @@ void FormManager::ForEachMatchingFormField(FormElement* form, Node* node, Requir // Search forward in the |form| for a corresponding field. size_t k = j; - while (k < data.fields.size() && element_name != data.fields[k].name()) + while (k < data.fields.size() && element_name != data.fields[k].name) k++; if (k >= data.fields.size()) continue; - DCHECK_EQ(data.fields[k].name(), element_name); + DCHECK_EQ(data.fields[k].name, element_name); bool is_initiating_node = false; @@ -829,7 +829,7 @@ void FormManager::ForEachMatchingFormField(FormElement* form, Node* node, Requir void FormManager::FillFormField(HTMLFormControlElement* field, const FormField* data, bool is_initiating_node) { // Nothing to fill. - if (data->value().empty()) + if (data->value.empty()) return; if (formControlType(*field) == kText) { @@ -837,7 +837,7 @@ void FormManager::FillFormField(HTMLFormControlElement* field, const FormField* // If the maxlength attribute contains a negative value, maxLength() // returns the default maxlength value. - input_element->setValue(data->value().substr(0, input_element->maxLength()).c_str()); + input_element->setValue(data->value.substr(0, input_element->maxLength()).c_str()); input_element->setAutofilled(true); if (is_initiating_node) { int length = input_element->value().length(); @@ -845,13 +845,13 @@ void FormManager::FillFormField(HTMLFormControlElement* field, const FormField* } } else if (formControlType(*field) == kSelectOne) { HTMLSelectElement* select_element = static_cast<HTMLSelectElement*>(field); - select_element->setValue(data->value().c_str()); + select_element->setValue(data->value.c_str()); } } void FormManager::PreviewFormField(HTMLFormControlElement* field, const FormField* data, bool is_initiating_node) { // Nothing to preview. - if (data->value().empty()) + if (data->value.empty()) return; // Only preview input fields. @@ -862,7 +862,7 @@ void FormManager::PreviewFormField(HTMLFormControlElement* field, const FormFiel // If the maxlength attribute contains a negative value, maxLength() // returns the default maxlength value. - input_element->setSuggestedValue(data->value().substr(0, input_element->maxLength()).c_str()); + input_element->setSuggestedValue(data->value.substr(0, input_element->maxLength()).c_str()); input_element->setAutofilled(true); if (is_initiating_node) input_element->setSelectionRange(0, input_element->suggestedValue().length()); diff --git a/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.cpp b/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.cpp index ff4f593..7ab7abd 100644 --- a/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.cpp +++ b/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.cpp @@ -160,7 +160,7 @@ void WebAutofill::formFieldFocused(WebCore::HTMLFormControlElement* formFieldEle // Get the FormField from the Node. webkit_glue::FormField* formField = new webkit_glue::FormField; FormManager::HTMLFormControlElementToFormField(formFieldElement, FormManager::EXTRACT_NONE, formField); - formField->set_label(FormManager::LabelForElement(*formFieldElement)); + formField->label = FormManager::LabelForElement(*formFieldElement); webkit_glue::FormData* form = new webkit_glue::FormData; mFormManager->FindFormWithFormControlElement(formFieldElement, FormManager::REQUIRE_AUTOCOMPLETE, form); @@ -235,22 +235,22 @@ void WebAutofill::setProfile(const string16& fullName, const string16& emailAddr const string16& state, const string16& zipCode, const string16& country, const string16& phoneNumber) { if (!mAutofillProfile) - mAutofillProfile.set(new AutoFillProfile()); + mAutofillProfile.set(new AutofillProfile()); // Update the profile. // Constants for Autofill field types are found in external/chromium/chrome/browser/autofill/field_types.h. - mAutofillProfile->SetInfo(AutofillType(NAME_FULL), fullName); - mAutofillProfile->SetInfo(AutofillType(EMAIL_ADDRESS), emailAddress); - mAutofillProfile->SetInfo(AutofillType(COMPANY_NAME), companyName); - mAutofillProfile->SetInfo(AutofillType(ADDRESS_HOME_LINE1), addressLine1); - mAutofillProfile->SetInfo(AutofillType(ADDRESS_HOME_LINE2), addressLine2); - mAutofillProfile->SetInfo(AutofillType(ADDRESS_HOME_CITY), city); - mAutofillProfile->SetInfo(AutofillType(ADDRESS_HOME_STATE), state); - mAutofillProfile->SetInfo(AutofillType(ADDRESS_HOME_ZIP), zipCode); - mAutofillProfile->SetInfo(AutofillType(ADDRESS_HOME_COUNTRY), country); - mAutofillProfile->SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), phoneNumber); - - std::vector<AutoFillProfile> profiles; + mAutofillProfile->SetInfo(AutofillFieldType(NAME_FULL), fullName); + mAutofillProfile->SetInfo(AutofillFieldType(EMAIL_ADDRESS), emailAddress); + mAutofillProfile->SetInfo(AutofillFieldType(COMPANY_NAME), companyName); + mAutofillProfile->SetInfo(AutofillFieldType(ADDRESS_HOME_LINE1), addressLine1); + mAutofillProfile->SetInfo(AutofillFieldType(ADDRESS_HOME_LINE2), addressLine2); + mAutofillProfile->SetInfo(AutofillFieldType(ADDRESS_HOME_CITY), city); + mAutofillProfile->SetInfo(AutofillFieldType(ADDRESS_HOME_STATE), state); + mAutofillProfile->SetInfo(AutofillFieldType(ADDRESS_HOME_ZIP), zipCode); + mAutofillProfile->SetInfo(AutofillFieldType(ADDRESS_HOME_COUNTRY), country); + mAutofillProfile->SetInfo(AutofillFieldType(PHONE_HOME_WHOLE_NUMBER), phoneNumber); + + std::vector<AutofillProfile> profiles; profiles.push_back(*mAutofillProfile); updateProfileLabel(); mTabContents->profile()->GetPersonalDataManager()->SetProfiles(&profiles); @@ -258,9 +258,9 @@ void WebAutofill::setProfile(const string16& fullName, const string16& emailAddr bool WebAutofill::updateProfileLabel() { - std::vector<AutoFillProfile*> profiles; + std::vector<AutofillProfile*> profiles; profiles.push_back(mAutofillProfile.get()); - return AutoFillProfile::AdjustInferredLabels(&profiles); + return AutofillProfile::AdjustInferredLabels(&profiles); } void WebAutofill::clearProfiles() diff --git a/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.h b/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.h index a2f56a2..5300087 100644 --- a/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.h +++ b/Source/WebKit/android/WebCoreSupport/autofill/WebAutofill.h @@ -37,7 +37,7 @@ #include <wtf/ThreadingPrimitives.h> class AutofillManager; -class AutoFillProfile; +class AutofillProfile; class AutoFillHost; namespace WebCore { @@ -99,7 +99,7 @@ private: OwnPtr<AutofillManager> mAutofillManager; OwnPtr<AutoFillHost> mAutofillHost; OwnPtr<TabContents> mTabContents; - OwnPtr<AutoFillProfile> mAutofillProfile; + OwnPtr<AutofillProfile> mAutofillProfile; typedef std::vector<webkit_glue::FormData, std::allocator<webkit_glue::FormData> > FormList; FormList mForms; diff --git a/Source/WebKit/android/jni/WebCoreFrameBridge.cpp b/Source/WebKit/android/jni/WebCoreFrameBridge.cpp index bdb502e..5ec4468 100644 --- a/Source/WebKit/android/jni/WebCoreFrameBridge.cpp +++ b/Source/WebKit/android/jni/WebCoreFrameBridge.cpp @@ -525,7 +525,9 @@ WebFrame::shouldInterceptRequest(const WTF::String& url) env->DeleteLocalRef(urlStr); if (response == 0) return 0; - return new UrlInterceptResponse(env, response); + UrlInterceptResponse* result = new UrlInterceptResponse(env, response); + env->DeleteLocalRef(response); + return result; } void @@ -1398,6 +1400,10 @@ static void DestroyFrame(JNIEnv* env, jobject obj) if (fl) fl->detachFromParent(); delete page; + + // Force remove all deleted pages in the page cache + WebCore::pageCache()->releaseAutoreleasedPagesNow(); + view->deref(); SET_NATIVE_FRAME(env, obj, 0); @@ -1767,37 +1773,36 @@ private: JNIEnv* env = getJNIEnv(); // JavaInstance creates a global ref to instance in its constructor. env->DeleteGlobalRef(m_instance->instance()); - // Set the object to a weak reference. - m_instance->setInstance(env->NewWeakGlobalRef(instance)); + // Create a weak ref, cache it, and set the underlying JavaInstance to use it. + m_weakRef = env->NewWeakGlobalRef(instance); + m_instance->setInstance(m_weakRef); } ~WeakJavaInstance() { + // TODO: Check whether it's OK for calls to begin() and end() to be unbalanced. + // See b/5006441 + if (m_beginEndDepth) + LOGW("Unbalanced calls to WeakJavaInstance::begin() / end()"); JNIEnv* env = getJNIEnv(); - // Store the weak reference so we can delete it later. - jweak weak = m_instance->instance(); // The JavaInstance destructor attempts to delete the global ref stored // in m_instance. Since we replaced it in our constructor with a weak // reference, restore the global ref here so the vm will not complain. - m_instance->setInstance(env->NewGlobalRef( - getRealObject(env, m_instance->instance()).get())); + m_instance->setInstance(env->NewGlobalRef(m_weakRef)); // Delete the weak reference. - env->DeleteWeakGlobalRef(weak); + env->DeleteWeakGlobalRef(m_weakRef); } virtual void begin() { if (m_beginEndDepth++ > 0) return; - m_weakRef = m_instance->instance(); JNIEnv* env = getJNIEnv(); // This is odd. getRealObject returns an AutoJObject which is used to // cleanly create and delete a local reference. But, here we need to // maintain the local reference across calls to virtualBegin() and // virtualEnd(). So, release the local reference from the AutoJObject // and delete the local reference in virtualEnd(). - m_realObject = getRealObject(env, m_weakRef).release(); - // Point to the real object - m_instance->setInstance(m_realObject); + m_instance->setInstance(getRealObject(env, m_weakRef).release()); // Call the base class method INHERITED::begin(); } @@ -1809,7 +1814,7 @@ private: // Call the base class method first to pop the local frame. INHERITED::end(); // Get rid of the local reference to the real object. - getJNIEnv()->DeleteLocalRef(m_realObject); + getJNIEnv()->DeleteLocalRef(m_instance->instance()); // Point back to the WeakReference. m_instance->setInstance(m_weakRef); } @@ -1820,7 +1825,6 @@ private: #elif USE(V8) typedef JavaInstanceJobject INHERITED; #endif - jobject m_realObject; jweak m_weakRef; // The current depth of nested calls to virtualBegin and virtualEnd. int m_beginEndDepth; diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp index 966a540..1c51b14 100644 --- a/Source/WebKit/android/jni/WebViewCore.cpp +++ b/Source/WebKit/android/jni/WebViewCore.cpp @@ -2971,16 +2971,11 @@ void WebViewCore::openFileChooser(PassRefPtr<WebCore::FileChooser> chooser) checkException(env); env->DeleteLocalRef(jAcceptType); - const UChar* string = static_cast<const UChar*>(env->GetStringChars(jName, 0)); + WTF::String wtfString = jstringToWtfString(env, jName); + env->DeleteLocalRef(jName); - if (!string) - return; - - WTF::String webcoreString = jstringToWtfString(env, jName); - env->ReleaseStringChars(jName, string); - - if (webcoreString.length()) - chooser->chooseFile(webcoreString); + if (!wtfString.isEmpty()) + chooser->chooseFile(wtfString); } void WebViewCore::listBoxRequest(WebCoreReply* reply, const uint16_t** labels, size_t count, const int enabled[], size_t enabledCount, |