diff options
Diffstat (limited to 'WebKit')
-rw-r--r-- | WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp | 5 | ||||
-rw-r--r-- | WebKit/android/jni/WebCoreFrameBridge.cpp | 55 | ||||
-rw-r--r-- | WebKit/android/jni/WebCoreFrameBridge.h | 4 | ||||
-rw-r--r-- | WebKit/android/nav/SelectText.cpp | 138 | ||||
-rw-r--r-- | WebKit/android/plugins/PluginTimer.cpp | 7 |
5 files changed, 133 insertions, 76 deletions
diff --git a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp index 96dd04c..19f4f34 100644 --- a/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp +++ b/WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp @@ -356,6 +356,11 @@ void WebUrlLoaderClient::didReceiveResponse(PassOwnPtr<WebResponse> webResponse) ssl_info.cert->GetChainDEREncodedBytes(&chain_bytes); m_webFrame->setCertificate(chain_bytes[0]); } + + // Look for X-Auto-Login on the main resource to log in the user. + std::string login; + if (m_response->getHeader("x-auto-login", &login)) + m_webFrame->autoLogin(login); } } diff --git a/WebKit/android/jni/WebCoreFrameBridge.cpp b/WebKit/android/jni/WebCoreFrameBridge.cpp index eff64e1..49eac3c 100644 --- a/WebKit/android/jni/WebCoreFrameBridge.cpp +++ b/WebKit/android/jni/WebCoreFrameBridge.cpp @@ -221,6 +221,7 @@ struct WebFrame::JavaBrowserFrame jmethodID mSetCertificate; jmethodID mShouldSaveFormData; jmethodID mSaveFormData; + jmethodID mAutoLogin; AutoJObject frame(JNIEnv* env) { return getRealObject(env, mObj); } @@ -294,6 +295,8 @@ WebFrame::WebFrame(JNIEnv* env, jobject obj, jobject historyList, WebCore::Page* mJavaFrame->mSetCertificate = env->GetMethodID(clazz, "setCertificate", "([B)V"); mJavaFrame->mShouldSaveFormData = env->GetMethodID(clazz, "shouldSaveFormData", "()Z"); mJavaFrame->mSaveFormData = env->GetMethodID(clazz, "saveFormData", "(Ljava/util/HashMap;)V"); + mJavaFrame->mAutoLogin = env->GetMethodID(clazz, "autoLogin", + "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); env->DeleteLocalRef(clazz); LOG_ASSERT(mJavaFrame->mStartLoadingResource, "Could not find method startLoadingResource"); @@ -326,6 +329,7 @@ WebFrame::WebFrame(JNIEnv* env, jobject obj, jobject historyList, WebCore::Page* LOG_ASSERT(mJavaFrame->mSetCertificate, "Could not find method setCertificate"); LOG_ASSERT(mJavaFrame->mShouldSaveFormData, "Could not find method shouldSaveFormData"); LOG_ASSERT(mJavaFrame->mSaveFormData, "Could not find method saveFormData"); + LOG_ASSERT(mJavaFrame->mAutoLogin, "Could not find method autoLogin"); mUserAgent = WTF::String(); mUserInitiatedAction = false; @@ -983,6 +987,54 @@ void WebFrame::setCertificate(const std::string& cert) } #endif +void WebFrame::autoLogin(const std::string& loginHeader) +{ +#ifdef ANDROID_INSTRUMENT + TimeCounterAuto counter(TimerCoutner::JavaCallbackTimeCounter); +#endif + WTF::String header(loginHeader.c_str(), loginHeader.length()); + WTF::Vector<WTF::String> split; + header.split('&', split); + if (!split.isEmpty()) { + WTF::String realm; + WTF::String account; + WTF::String args; + int len = split.size(); + while (len--) { + WTF::String& str = split[len]; + size_t equals = str.find('='); + if (equals == WTF::notFound) + continue; + + WTF::String* result = 0; + if (str.startsWith("realm", false)) + result = &realm; + else if (str.startsWith("account", false)) + result = &account; + else if (str.startsWith("args", false)) + result = &args; + + if (result) + // Decode url escape sequences before sending to the app. + *result = WebCore::decodeURLEscapeSequences(str.substring(equals + 1)); + } + + // realm and args are required parameters. + if (realm.isEmpty() || args.isEmpty()) + return; + + // Args is double-encoded as it contains urls. + args = WebCore::decodeURLEscapeSequences(args); + + JNIEnv* env = getJNIEnv(); + jstring jRealm = wtfStringToJstring(env, realm, true); + jstring jAccount = wtfStringToJstring(env, account); + jstring jArgs = wtfStringToJstring(env, args, true); + env->CallVoidMethod(mJavaFrame->frame(env).get(), + mJavaFrame->mAutoLogin, jRealm, jAccount, jArgs); + } +} + void WebFrame::maybeSavePassword(WebCore::Frame* frame, const WebCore::ResourceRequest& request) { if (request.httpMethod() != "POST") @@ -1154,9 +1206,6 @@ static void CreateFrame(JNIEnv* env, jobject obj, jobject javaview, jobject jAss pageClients.deviceOrientationClient = deviceOrientationC; WebCore::Page* page = new WebCore::Page(pageClients); - // css files without explicit MIMETYPE is treated as generic text files in - // the Java side. So we can't enforce CSS MIMETYPE. - page->settings()->setEnforceCSSMIMETypeInNoQuirksMode(false); editorC->setPage(page); page->setGroupName("android.webkit"); diff --git a/WebKit/android/jni/WebCoreFrameBridge.h b/WebKit/android/jni/WebCoreFrameBridge.h index af7be60..25232e4 100644 --- a/WebKit/android/jni/WebCoreFrameBridge.h +++ b/WebKit/android/jni/WebCoreFrameBridge.h @@ -128,6 +128,10 @@ class WebFrame : public WebCoreRefObject { void setCertificate(const std::string& cert); + // Parse the x-auto-login header and propagate the parameters to the + // application. + void autoLogin(const std::string& loginHeader); + /** * When the user initiates a click, we set mUserInitiatedAction to true. * If a load happens due to this click, then we ask the application if it wants diff --git a/WebKit/android/nav/SelectText.cpp b/WebKit/android/nav/SelectText.cpp index 1524058..bae0feb 100644 --- a/WebKit/android/nav/SelectText.cpp +++ b/WebKit/android/nav/SelectText.cpp @@ -1303,22 +1303,17 @@ static WTF::String text(const SkPicture& picture, const SkIRect& area, return extractor.text(); } -#define CONTROL_OFFSET 0 -#define CONTROL_NOTCH 19 +#define CONTROL_NOTCH 16 #define CONTROL_HEIGHT 35 #define CONTROL_WIDTH 21 -#define STROKE_WIDTH 2.0f -#define STROKE_OUTSET 1.0f -#define STROKE_NOTCH_R 2.2f -#define STROKE_NOTCH_L 1.7f -#define DROP_HEIGHT 4 +#define STROKE_WIDTH 1.0f +#define STROKE_OUTSET 3.5f -#define STROKE_COLOR 0x90000000 -#define FILL_GRADIENT_TOP 0xD0AFD835 -#define FILL_GRADIENT_BOTTOM 0xD0CAD284 -#define DROP_GRADIENT_TOP 0x50000000 -#define DROP_GRADIENT_BOTTOM 0x00000000 +#define STROKE_COLOR 0x66000000 +#define OUTER_COLOR 0x33000000 +#define INNER_COLOR 0xe6aae300 +#define DROP_HEIGHT 4 #define SLOP 35 SelectText::SelectText() @@ -1326,78 +1321,77 @@ SelectText::SelectText() m_picture = 0; reset(); SkPaint paint; - - SkPath startFillPath; - startFillPath.moveTo(-CONTROL_WIDTH + STROKE_OUTSET, CONTROL_NOTCH); - startFillPath.lineTo(-CONTROL_WIDTH + STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET); - startFillPath.lineTo(-STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET); - startFillPath.lineTo(-STROKE_OUTSET, CONTROL_OFFSET + STROKE_NOTCH_R); - startFillPath.close(); - SkPath startStrokePath; - startStrokePath.moveTo(-CONTROL_WIDTH, CONTROL_NOTCH); - startStrokePath.lineTo(-CONTROL_WIDTH, CONTROL_HEIGHT); - startStrokePath.lineTo(0, CONTROL_HEIGHT); - startStrokePath.lineTo(0, CONTROL_OFFSET); - startStrokePath.close(); - SkPoint gradientLine[] = {{0, 0}, {0, CONTROL_HEIGHT}}; - SkColor gradientColors[] = {FILL_GRADIENT_TOP, FILL_GRADIENT_BOTTOM}; - SkShader* fillGradient = SkGradientShader::CreateLinear(gradientLine, - gradientColors, 0, 2, SkShader::kClamp_TileMode); - SkPoint dropLine[] = {{0, CONTROL_HEIGHT}, {0, CONTROL_HEIGHT + DROP_HEIGHT}}; - SkColor dropColors[] = {DROP_GRADIENT_TOP, DROP_GRADIENT_BOTTOM}; - SkShader* dropGradient = SkGradientShader::CreateLinear(dropLine, - dropColors, 0, 2, SkShader::kClamp_TileMode); - SkRect startDropRect = {-CONTROL_WIDTH - STROKE_OUTSET, CONTROL_HEIGHT, - STROKE_OUTSET, CONTROL_HEIGHT + DROP_HEIGHT}; - - SkCanvas* canvas = m_startControl.beginRecording(CONTROL_WIDTH, CONTROL_HEIGHT + DROP_HEIGHT); + SkRect oval; + + SkPath startOuterPath; + oval.set(-CONTROL_WIDTH - STROKE_OUTSET, CONTROL_NOTCH - STROKE_OUTSET, + -CONTROL_WIDTH + STROKE_OUTSET, CONTROL_NOTCH + STROKE_OUTSET); + startOuterPath.arcTo(oval, 180, 45, true); + oval.set(-STROKE_OUTSET, -STROKE_OUTSET, STROKE_OUTSET, STROKE_OUTSET); + startOuterPath.arcTo(oval, 180 + 45, 135, false); + oval.set(-STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET, + STROKE_OUTSET, CONTROL_HEIGHT + STROKE_OUTSET); + startOuterPath.arcTo(oval, 0, 90, false); + oval.set(-CONTROL_WIDTH - STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET, + -CONTROL_WIDTH + STROKE_OUTSET, CONTROL_HEIGHT + STROKE_OUTSET); + startOuterPath.arcTo(oval, 90, 90, false); + startOuterPath.close(); + SkPath startInnerPath; + startInnerPath.moveTo(-CONTROL_WIDTH, CONTROL_NOTCH); + startInnerPath.lineTo(-CONTROL_WIDTH, CONTROL_HEIGHT); + startInnerPath.lineTo(0, CONTROL_HEIGHT); + startInnerPath.lineTo(0, 0); + startInnerPath.close(); + startOuterPath.addPath(startInnerPath, 0, 0); + + SkCanvas* canvas = m_startControl.beginRecording( + CONTROL_WIDTH + STROKE_OUTSET * 2, + CONTROL_HEIGHT + STROKE_OUTSET * 2); paint.setAntiAlias(true); + paint.setColor(INNER_COLOR); paint.setStyle(SkPaint::kFill_Style); - paint.setShader(fillGradient); - canvas->drawPath(startFillPath, paint); - paint.setShader(0); + canvas->drawPath(startInnerPath, paint); + paint.setColor(OUTER_COLOR); + canvas->drawPath(startOuterPath, paint); paint.setStyle(SkPaint::kStroke_Style); paint.setColor(STROKE_COLOR); paint.setStrokeWidth(STROKE_WIDTH); - canvas->drawPath(startStrokePath, paint); - paint.setStyle(SkPaint::kFill_Style); - paint.setColor(0xff000000); - paint.setShader(dropGradient); - canvas->drawRect(startDropRect, paint); + canvas->drawPath(startInnerPath, paint); m_startControl.endRecording(); - SkPath endFillPath; - endFillPath.moveTo(STROKE_OUTSET, CONTROL_OFFSET + STROKE_NOTCH_R); - endFillPath.lineTo(STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET); - endFillPath.lineTo(CONTROL_WIDTH - STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET); - endFillPath.lineTo(CONTROL_WIDTH - STROKE_OUTSET, CONTROL_NOTCH); - endFillPath.close(); - SkPath endStrokePath; - endStrokePath.moveTo(0, CONTROL_OFFSET); - endStrokePath.lineTo(0, CONTROL_HEIGHT); - endStrokePath.lineTo(CONTROL_WIDTH, CONTROL_HEIGHT); - endStrokePath.lineTo(CONTROL_WIDTH, CONTROL_NOTCH); - endStrokePath.close(); - SkRect endDropRect = {-STROKE_OUTSET, CONTROL_HEIGHT, - CONTROL_WIDTH + STROKE_OUTSET, CONTROL_HEIGHT + DROP_HEIGHT}; - - canvas = m_endControl.beginRecording(CONTROL_WIDTH, CONTROL_HEIGHT + DROP_HEIGHT); - paint.setColor(0xff000000); + SkPath endOuterPath; + oval.set(-STROKE_OUTSET, -STROKE_OUTSET, STROKE_OUTSET, STROKE_OUTSET); + endOuterPath.arcTo(oval, 180, 135, true); + oval.set(CONTROL_WIDTH - STROKE_OUTSET, CONTROL_NOTCH - STROKE_OUTSET, + CONTROL_WIDTH + STROKE_OUTSET, CONTROL_NOTCH + STROKE_OUTSET); + endOuterPath.arcTo(oval, 360 - 45, 45, false); + oval.set(CONTROL_WIDTH - STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET, + CONTROL_WIDTH + STROKE_OUTSET, CONTROL_HEIGHT + STROKE_OUTSET); + endOuterPath.arcTo(oval, 0, 90, false); + oval.set(-STROKE_OUTSET, CONTROL_HEIGHT - STROKE_OUTSET, + STROKE_OUTSET, CONTROL_HEIGHT + STROKE_OUTSET); + endOuterPath.arcTo(oval, 90, 90, false); + startOuterPath.close(); + SkPath endInnerPath; + endInnerPath.moveTo(0, 0); + endInnerPath.lineTo(0, CONTROL_HEIGHT); + endInnerPath.lineTo(CONTROL_WIDTH, CONTROL_HEIGHT); + endInnerPath.lineTo(CONTROL_WIDTH, CONTROL_NOTCH); + endInnerPath.close(); + endOuterPath.addPath(endInnerPath, 0, 0); + + canvas = m_endControl.beginRecording(CONTROL_WIDTH + STROKE_OUTSET * 2, + CONTROL_HEIGHT + STROKE_OUTSET * 2); + paint.setColor(INNER_COLOR); paint.setStyle(SkPaint::kFill_Style); - paint.setShader(fillGradient); - canvas->drawPath(endFillPath, paint); - paint.setShader(0); + canvas->drawPath(endInnerPath, paint); + paint.setColor(OUTER_COLOR); + canvas->drawPath(endOuterPath, paint); paint.setStyle(SkPaint::kStroke_Style); paint.setColor(STROKE_COLOR); paint.setStrokeWidth(STROKE_WIDTH); - canvas->drawPath(endStrokePath, paint); - paint.setStyle(SkPaint::kFill_Style); - paint.setColor(0xff000000); - paint.setShader(dropGradient); - canvas->drawRect(endDropRect, paint); + canvas->drawPath(endInnerPath, paint); m_endControl.endRecording(); - SkSafeUnref(fillGradient); - SkSafeUnref(dropGradient); } SelectText::~SelectText() diff --git a/WebKit/android/plugins/PluginTimer.cpp b/WebKit/android/plugins/PluginTimer.cpp index 9ed6a80..dfa7272 100644 --- a/WebKit/android/plugins/PluginTimer.cpp +++ b/WebKit/android/plugins/PluginTimer.cpp @@ -71,7 +71,12 @@ namespace WebCore { if (!m_unscheduled) m_timerFunc(m_instance, m_timerID); - if (!m_repeat || m_unscheduled) + // remove the timer if it is a one-shot timer (!m_repeat) or if is a + // repeating timer that has been unscheduled. In either case we must + // ensure that the refcount is 2 or greater since the PluginTimerList + // could have been deleted by the timerFunc and we must ensure that we + // do not double delete. + if ((!m_repeat || m_unscheduled) && refCount() > 1) deref(); // mark the timer for deletion as it is no longer needed } |