OSDN Git Service

am eecdc5b2: am 4c6c5a28: Merge "Turns out args should not be decoded twice." into...
[android-x86/external-webkit.git] / WebKit / android / jni / WebCoreFrameBridge.cpp
index eff64e1..d59a53b 100644 (file)
@@ -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,10 +329,12 @@ 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;
     mBlockNetworkLoads = false;
+    m_renderSkins = 0;
 }
 
 WebFrame::~WebFrame()
@@ -341,6 +346,7 @@ WebFrame::~WebFrame()
         mJavaFrame->mObj = 0;
     }
     delete mJavaFrame;
+    delete m_renderSkins;
 }
 
 WebFrame* WebFrame::getWebFrame(const WebCore::Frame* frame)
@@ -983,6 +989,51 @@ 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;
+
+        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 +1205,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");
 
@@ -1215,7 +1263,7 @@ static void CreateFrame(JNIEnv* env, jobject obj, jobject javaview, jobject jAss
         // Setup the asset manager.
         AssetManager* am = assetManagerForJavaObject(env, jAssetManager);
         // Initialize our skinning classes
-        WebCore::RenderSkinAndroid::Init(am, directory);
+        webFrame->setRenderSkins(new WebCore::RenderSkinAndroid(am, directory));
     }
     for (int i = WebCore::PlatformBridge::FileUploadLabel;
             i <= WebCore::PlatformBridge::FileUploadNoFileChosenLabel; i++)