/*
 * Copyright 2007, The Android Open Source Project
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// This prefix file is for Android only. It should contain only:
//    - the special trick to catch us using new or delete without including "config.h"
// Things that need to be defined globally should go into "config.h".

#include <limits.h>
#include <math.h>   // !!! is this allowed as a standard include?
#include <pthread.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>

// Both JavaScriptCore and WebCore include config.h in almost every file.
// Unfortunately only one gets picked up if we compile all the files in one
// library. Since they can operate together, include it here so it is always
// pulled in.
#include <JavaScriptCore/config.h>

#ifdef __cplusplus
#define PREFIX_FOR_WEBCORE 1
#define EXPORT __attribute__((visibility("default")))

#include <algorithm>
#include "stl_iterator_base.h"
#include "heap.h"
#include <memory>
#include <new>

#endif

#ifdef __cplusplus
#define new ("if you use new/delete make sure to include config.h at the top of the file"()) 
#define delete ("if you use new/delete make sure to include config.h at the top of the file"()) 
#endif

typedef short int   flex_int16_t;
typedef int     flex_int32_t;
typedef signed char     flex_int8_t;
typedef unsigned short int  flex_uint16_t;
typedef unsigned int    flex_uint32_t;
typedef unsigned char   flex_uint8_t;

#define FLATTEN_FRAMESET
#define FLATTEN_IFRAME

#define ANDROID_EXPOSE_COLUMN_GAP

#define ANDROID_LAYOUT

// Allows us to select all of the text in a <textarea> in onfocus
#define ANDROID_SELECT_TEXT_AREAS

#define ANDROID_FIX

// Fix for issue 878095.  Only call onBlur on an element if it has an
// onBlur event.
#define ANDROID_IGNORE_BLUR

// Passes the webkit-originated changes of a focused textfield to our UI thread
#define ANDROID_ACCEPT_CHANGES_TO_FOCUSED_TEXTFIELDS

// Fix for an issue where WebKit was scrolling a focused element onscreen.
// Unnecessary for us, since we handle scrolling outside of WebKit.
#define ANDROID_SCROLL_FIX

#define ANDROID_META_SUPPORT

// Give public access to a private method in HTMLSelectElement so that
// we can use information from the java UI to deselect items of the element.
#define ANDROID_DESELECT_SELECT

// Converts ListBoxes to dropdown popup lists.
#define ANDROID_LISTBOX_USES_MENU_LIST

#define ANDROID_ALLOW_TRANSPARENT_BACKGROUNDS
#define ANDROID_HISTORY_CLIENT
#define ANDROID_MULTIPLE_WINDOWS
#define ANDROID_CSS_TAP_HIGHLIGHT_COLOR

// Hack to make File Upload buttons draw disabled.
// Will be removed if/when we get file uploads working.
#define ANDROID_DISABLE_UPLOAD

#define ANDROID_BLOCK_NETWORK_IMAGE

// Changes needed to support native plugins (npapi.h). If the change is generic,
// it may be under a different #define (see: PLUGIN_PLATFORM_SETVALUE,
// PLUGIN_SCHEDULE_TIMER)
#define ANDROID_PLUGINS

// Prevent Webkit from drawing the selection in textfields/textareas, since we 
// draw it ourselves in the UI thread.
#define ANDROID_DO_NOT_DRAW_TEXTFIELD_SELECTION

// This should possibly be patched back to WebKit since they seem to lose the
// user gesture hint. If we do decide to patch this back, the user gesture flag
// should probably be passed in the NavigationAction rather than the
// ResourceRequest.
#define ANDROID_USER_GESTURE

// Add support for the orientation window property
#define ANDROID_ORIENTATION_SUPPORT

// This enables a portable implementation of NPN_[Un]ScheduleTimer
// Will submit this as a patch to apple
#define PLUGIN_SCHEDULE_TIMER

// This adds platformInit() and platformSetValue() to pluginview
// Will submit this as a patch to apple
#define PLUGIN_PLATFORM_SETVALUE

// This enables logging the DOM tree, Render tree even for the release build
#define ANDROID_DOM_LOGGING

// Notify WebViewCore when a clipped out rectangle is drawn,
// so that all invals are captured by the display tree.  
#define ANDROID_CAPTURE_OFFSCREEN_PAINTS

// This disables the css position:fixed to the Browser window. Instead the fixed
// element will be always fixed to the top page.
#define ANDROID_DISABLE_POSITION_FIXED

// Fix exceptions not surfacing through NPAPI bindings to the
// JavaScriptCore execution context.
#define ANDROID_NPN_SETEXCEPTION 1

// Enable dumping the display tree to a file (triggered in WebView.java)
#define ANDROID_DUMP_DISPLAY_TREE

// Allow webkit to initiate scroll when going to an anchor on a page
// The implementation is not acceptable to webkit. Either scrollRectToVisible
// needs additional flavor or parameter to know that it can't be ignored,
// and/or script engine must keep whether event was user initiated.
#define ANDROID_SCROLL_ON_GOTO_ANCHOR

// Animated GIF support.
#define ANDROID_ANIMATED_GIF