summaryrefslogtreecommitdiffstats
path: root/WebKit
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit')
-rw-r--r--WebKit/android/WebCoreSupport/WebUrlLoaderClient.cpp5
-rw-r--r--WebKit/android/jni/WebCoreFrameBridge.cpp55
-rw-r--r--WebKit/android/jni/WebCoreFrameBridge.h4
-rw-r--r--WebKit/android/nav/SelectText.cpp138
-rw-r--r--WebKit/android/plugins/PluginTimer.cpp7
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
}