/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.webkitsecurity.cts;

import java.util.Date;

import android.net.Uri;
import android.util.Log;

import junit.framework.Assert;

import java.io.File;
import java.io.FileInputStream;

import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.MimeTypeMap;

import android.cts.util.PollingCheck;

import android.content.Context;
import android.content.res.AssetManager;

import android.test.UiThreadTest;
import android.test.ActivityInstrumentationTestCase2;

import android.webkitsecurity.cts.WebViewStubActivity;

/*
 * This file acts as a template for the generation of other webkit tests.
 * 
 * The contents of the assets/webkitsecuritytests directory will be scanned
 * for html files, and for each one found a new class will be generated based
 * on this template.
 *
 * The specific things that have to be done to this template are:
 *
 *     1. Change the name to Webkit + javify(testname) + Test
 *     2. Change the private TEST_PATH value to the test's name
 *     3. Change the logtag to shellify(testname)
 *     4. Change the constructor name to <classname>
 *     5. Save this as <classname>.java
 *     6. TODO: Remove this comment
 *
 */

public class WebkitEmptyAnonymousBlockRemoveCrashTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
    private static final String LOGTAG = "WebkitEmptyAnonymousBlockRemoveCrashTest";
    private static final String TEST_PATH = "empty-anonymous-block-remove-crash.html";
    private static final int INITIAL_PROGRESS = 100;
    private static long TEST_TIMEOUT = 20000L;
    private static long TIME_FOR_LAYOUT = 1000L;

    private WebView mWebView;
    private boolean mIsUiThreadDone;

    public WebkitEmptyAnonymousBlockRemoveCrashTest() {
        super("android.webkitsecurity.cts", WebViewStubActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mWebView = getActivity().getWebView();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    @UiThreadTest
    public void testWebkitCrashes() throws Exception {

        // set up the webview
        mWebView = new WebView(getActivity());
        getActivity().setContentView(mWebView);

        // We need to be able to run JS for most of these tests
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);

        // Get the url for the test
        Log.d(LOGTAG, TEST_PATH);
        String url = "file:///android_asset/" + TEST_PATH;

        Log.d(LOGTAG, url.toString());

        // Run the test
        assertLoadUrlSuccessfully(url);
    }

    private void assertLoadUrlSuccessfully(String url) {
        mWebView.loadUrl(url);
        waitForLoadComplete();
    }

    private void waitForLoadComplete() {
        new PollingCheck(TEST_TIMEOUT) {
            @Override
            protected boolean check() {
                return mWebView.getProgress() == 100;
            }
        }.run();
        try {
            Thread.sleep(TIME_FOR_LAYOUT);
        } catch (InterruptedException e) {
            Log.w(LOGTAG, "waitForLoadComplete() interrupted while sleeping for layout delay.");
        }
    }
}
