18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2009, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
8e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
10e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
14e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
26e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_TAG "WebCore"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginView.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
352c02e355bf0631c0bec3496fab67f45710c5cd21Grace Kloba#include "FocusController.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLPlugInElement.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Image.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KeyboardEvent.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MouseEvent.h"
48ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project#include "NetworkStateNotifier.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformGraphicsContext.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformKeyboardEvent.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginMainThreadScheduler.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginPackage.h"
55f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#include "Touch.h"
5656ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger#include "TouchEvent.h"
57f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch#include "TouchList.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "android_graphics.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkCanvas.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npruntime_impl.h"
61109a58c31072b14f5b2c0493ed6c5a1855f82fd7Feng Qian// #include "runtime_root.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "utils/SystemClock.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScriptController.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
65109a58c31072b14f5b2c0493ed6c5a1855f82fd7Feng Qian
66109a58c31072b14f5b2c0493ed6c5a1855f82fd7Feng Qian#if USE(JSC)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/JSLock.h>
68109a58c31072b14f5b2c0493ed6c5a1855f82fd7Feng Qian#endif
69109a58c31072b14f5b2c0493ed6c5a1855f82fd7Feng Qian
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/ASCIICType.h>
71109a58c31072b14f5b2c0493ed6c5a1855f82fd7Feng Qian// #include "runtime.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebViewCore.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
74a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger/* Controls the printing of log messages in this file. This must be defined
75a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger   before PluginDebugAndroid.h is included.
76a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger */
77d68483b2c8871634da4f12a5c7c272c47ee8e646Grace Kloba// #define PLUGIN_DEBUG_LOCAL
78a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger#define TRACE_KEY_EVENTS 0
79a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDebug.h"
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDebugAndroid.h"
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginViewBridgeAndroid.h"
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginWidgetAndroid.h"
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "android_npapi.h"
862c05b037dcbc9de2f41781747422c2098c42c16eDerek Sollenberger#include "ANPNativeWindow_npapi.h"
8710d4052577e66430f5a3716ec51a401f1b4b21c2Derek Sollenberger#include "ANPSurface_npapi.h"
88f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger#include "ANPSystem_npapi.h"
89136290ef021ff9a9bf9152124a5fa42069acfdfcDerek Sollenberger#include "ANPVideo_npapi.h"
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkANP.h"
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkFlipPixelRef.h"
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPAudioTrackInterfaceV0_Init(ANPInterface* value);
9649bf866973cb3b2a6c74c0eab864e9562e4cbab1Derek Sollenbergerextern void ANPAudioTrackInterfaceV1_Init(ANPInterface* value);
97a6ac9647bf473365f8d817790e11aeda7374a6d8Mike Reedextern void ANPBitmapInterfaceV0_Init(ANPInterface* value);
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPCanvasInterfaceV0_Init(ANPInterface* value);
99d026980fde6eb3b01c1fe49441174e89cd1be298Mike Reedextern void ANPEventInterfaceV0_Init(ANPInterface* value);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPLogInterfaceV0_Init(ANPInterface* value);
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPMatrixInterfaceV0_Init(ANPInterface* value);
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPOffscreenInterfaceV0_Init(ANPInterface* value);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPPaintInterfaceV0_Init(ANPInterface* value);
1042ca6453fc4f0b0ba77f29630f3036d1765db9702Mike Reedextern void ANPPathInterfaceV0_Init(ANPInterface* value);
105f86737b0ce8c81f2b529503f83eb8b064769eecaDerek Sollenbergerextern void ANPSurfaceInterfaceV0_Init(ANPInterface* value);
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPTypefaceInterfaceV0_Init(ANPInterface* value);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern void ANPWindowInterfaceV0_Init(ANPInterface* value);
1081f7eee5350a1e078daa31e06b09a911f3fc6cb37Derek Sollenbergerextern void ANPWindowInterfaceV1_Init(ANPInterface* value);
109efe71a4f8c22057f6b18aca6c3cd46769d23468cDerek Sollenbergerextern void ANPWindowInterfaceV2_Init(ANPInterface* value);
1100a2bed53555947aea37912d694f9c7c376490808Grace Klobaextern void ANPSystemInterfaceV0_Init(ANPInterface* value);
1119bd15c56f90a9621fccfd28b9017ef1c3dba5ad7Derek Sollenbergerextern void ANPSystemInterfaceV1_Init(ANPInterface* value);
1122ba37aad78022aacc4d5eca0063532222ed6b444Derek Sollenbergerextern void ANPSystemInterfaceV2_Init(ANPInterface* value);
1132c05b037dcbc9de2f41781747422c2098c42c16eDerek Sollenbergerextern void ANPNativeWindowInterfaceV0_Init(ANPInterface* value);
114136290ef021ff9a9bf9152124a5fa42069acfdfcDerek Sollenbergerextern void ANPVideoInterfaceV0_Init(ANPInterface* value);
115b8c086775bdf98e932daead992eb960767248f44Derek Sollenbergerextern void ANPVideoInterfaceV1_Init(ANPInterface* value);
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct VarProcPair {
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int         enumValue;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t      size;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void        (*proc)(ANPInterface*);
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define VARPROCLINE(name)   \
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    k##name##_ANPGetValue, sizeof(ANP##name), ANP##name##_Init
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const VarProcPair gVarProcs[] = {
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VARPROCLINE(AudioTrackInterfaceV0)    },
12849bf866973cb3b2a6c74c0eab864e9562e4cbab1Derek Sollenberger    { VARPROCLINE(AudioTrackInterfaceV1)    },
129a6ac9647bf473365f8d817790e11aeda7374a6d8Mike Reed    { VARPROCLINE(BitmapInterfaceV0)        },
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VARPROCLINE(CanvasInterfaceV0)        },
131d026980fde6eb3b01c1fe49441174e89cd1be298Mike Reed    { VARPROCLINE(EventInterfaceV0)         },
132a6ac9647bf473365f8d817790e11aeda7374a6d8Mike Reed    { VARPROCLINE(LogInterfaceV0)           },
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VARPROCLINE(MatrixInterfaceV0)        },
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VARPROCLINE(PaintInterfaceV0)         },
1352ca6453fc4f0b0ba77f29630f3036d1765db9702Mike Reed    { VARPROCLINE(PathInterfaceV0)          },
136f86737b0ce8c81f2b529503f83eb8b064769eecaDerek Sollenberger    { VARPROCLINE(SurfaceInterfaceV0)       },
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VARPROCLINE(TypefaceInterfaceV0)      },
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    { VARPROCLINE(WindowInterfaceV0)        },
1391f7eee5350a1e078daa31e06b09a911f3fc6cb37Derek Sollenberger    { VARPROCLINE(WindowInterfaceV1)        },
140efe71a4f8c22057f6b18aca6c3cd46769d23468cDerek Sollenberger    { VARPROCLINE(WindowInterfaceV2)        },
1410a2bed53555947aea37912d694f9c7c376490808Grace Kloba    { VARPROCLINE(SystemInterfaceV0)        },
1429bd15c56f90a9621fccfd28b9017ef1c3dba5ad7Derek Sollenberger    { VARPROCLINE(SystemInterfaceV1)        },
1432ba37aad78022aacc4d5eca0063532222ed6b444Derek Sollenberger    { VARPROCLINE(SystemInterfaceV2)        },
1442c05b037dcbc9de2f41781747422c2098c42c16eDerek Sollenberger    { VARPROCLINE(NativeWindowInterfaceV0)  },
145136290ef021ff9a9bf9152124a5fa42069acfdfcDerek Sollenberger    { VARPROCLINE(VideoInterfaceV0)         },
146b8c086775bdf98e932daead992eb960767248f44Derek Sollenberger    { VARPROCLINE(VideoInterfaceV1)         },
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*  return true if var was an interface request (error will be set accordingly)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false if var is not a recognized interface (and ignore error param)
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool anp_getInterface(NPNVariable var, void* value, NPError* error) {
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const VarProcPair* iter = gVarProcs;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const VarProcPair* stop = gVarProcs + SK_ARRAY_COUNT(gVarProcs);
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (iter < stop) {
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (iter->enumValue == var) {
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ANPInterface* i = reinterpret_cast<ANPInterface*>(value);
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (i->inSize < iter->size) {
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                SkDebugf("------- interface %d, expected size %d, allocated %d\n",
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                         var, iter->size, i->inSize);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                *error = NPERR_INCOMPATIBLE_VERSION_ERROR;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                iter->proc(i);
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                *error = NPERR_NO_ERROR;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        iter += 1;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkDebugf("------ unknown NPNVariable %d\n", var);
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing std::min;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WTF;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::platformInit()
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setPlatformWidget(new PluginViewBridgeAndroid());
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_isWindowed = false;   // we don't support windowed yet
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_window = new PluginWidgetAndroid(this);
191a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.type = NPWindowTypeDrawable;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_npWindow.window = 0;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
195a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
1968667eaf175b0748a1d8783beeeecedfaa983a074Steve Blockbool PluginView::platformStart()
197b32f88b61a9162a5194ab02c12fc3aff6140e30eBen Murdoch{
1988667eaf175b0748a1d8783beeeecedfaa983a074Steve Block    return true;
199b32f88b61a9162a5194ab02c12fc3aff6140e30eBen Murdoch}
200b32f88b61a9162a5194ab02c12fc3aff6140e30eBen Murdoch
2018667eaf175b0748a1d8783beeeecedfaa983a074Steve Blockvoid PluginView::platformDestroy()
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_window;
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2066ca0f0452f06325e4abd3acca40a0a2f13fb644cDerek SollenbergerPlatformLayer* PluginView::platformLayer() const
2076ca0f0452f06325e4abd3acca40a0a2f13fb644cDerek Sollenberger{
2086ca0f0452f06325e4abd3acca40a0a2f13fb644cDerek Sollenberger    return (PlatformLayer*) m_window->getLayer();
2096ca0f0452f06325e4abd3acca40a0a2f13fb644cDerek Sollenberger}
2106ca0f0452f06325e4abd3acca40a0a2f13fb644cDerek Sollenberger
211a9cf40bab64a29201b65761ca30f9ff0c7e3e271Steve Block#if ENABLE(TOUCH_EVENTS)
21256ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenbergervoid PluginView::handleTouchEvent(TouchEvent* event)
21356ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger{
21456ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    if (!m_window->isAcceptingEvent(kTouch_ANPEventFlag))
21556ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger        return;
21656ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger
2176ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins    if (!m_window->inFullScreen() && m_parentFrame->document()->focusedNode() != m_element)
2186ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins        return;
2196ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins
22056ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    ANPEvent evt;
22136d976165f994e4071601d8824987f25a0a8da07Huahui Wu    SkANP::InitEvent(&evt, kMultiTouch_ANPEventType);
22256ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger
22356ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    const AtomicString& type = event->type();
22456ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    if (eventNames().touchstartEvent == type)
22536d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.action = kDown_ANPTouchAction;
22656ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    else if (eventNames().touchendEvent == type)
22736d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.action = kUp_ANPTouchAction;
22856ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    else if (eventNames().touchmoveEvent == type)
22936d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.action = kMove_ANPTouchAction;
23056ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    else if (eventNames().touchcancelEvent == type)
23136d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.action = kCancel_ANPTouchAction;
2326ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins    else if (eventNames().touchlongpressEvent == type)
23336d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.action = kLongPress_ANPTouchAction;
2346ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins    else if (eventNames().touchdoubletapEvent == type)
23536d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.action = kDoubleTap_ANPTouchAction;
2366ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins    else
23756ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger        return;
23856ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger
23936d976165f994e4071601d8824987f25a0a8da07Huahui Wu    // set the id and timestamp
24036d976165f994e4071601d8824987f25a0a8da07Huahui Wu    evt.data.multiTouch.id = 0; // TODO
24136d976165f994e4071601d8824987f25a0a8da07Huahui Wu    evt.data.multiTouch.timestamp = 0; // TODO
242d5e46442a26bd94d35230562671fc1979b3bb7a0Derek Sollenberger
2439c3f8716aa3ce8ca612b4200c02a8530cfd599baBen Murdoch    // In the event of a touchend (up) or touchcancel event, we must ask the changedTouch for the
244f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch    // co-ordinates as there is no touch in touches anymore.
24536d976165f994e4071601d8824987f25a0a8da07Huahui Wu    TouchList* touches = (evt.data.multiTouch.action == kUp_ANPTouchAction
24636d976165f994e4071601d8824987f25a0a8da07Huahui Wu        || evt.data.multiTouch.action == kCancel_ANPTouchAction) ? event->changedTouches() : event->touches();
247f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch
24836d976165f994e4071601d8824987f25a0a8da07Huahui Wu    // set each touchPoint
24936d976165f994e4071601d8824987f25a0a8da07Huahui Wu    int pointerCount = touches->length();
25036d976165f994e4071601d8824987f25a0a8da07Huahui Wu    evt.data.multiTouch.pointerCount = pointerCount;
25136d976165f994e4071601d8824987f25a0a8da07Huahui Wu    evt.data.multiTouch.touchPoint = new TouchPoint[pointerCount];
25236d976165f994e4071601d8824987f25a0a8da07Huahui Wu
25336d976165f994e4071601d8824987f25a0a8da07Huahui Wu    for (int x = 0; x < evt.data.multiTouch.pointerCount; x++) {
25436d976165f994e4071601d8824987f25a0a8da07Huahui Wu        Touch* touch = touches->item(x);
25536d976165f994e4071601d8824987f25a0a8da07Huahui Wu        // Convert to coordinates that are relative to the plugin.
25636d976165f994e4071601d8824987f25a0a8da07Huahui Wu        IntPoint localPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(IntPoint(touch->pageX(), touch->pageY())));
25736d976165f994e4071601d8824987f25a0a8da07Huahui Wu
25836d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.touchPoint[x].id = touch->identifier();
25936d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.touchPoint[x].x = localPos.x();
26036d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.touchPoint[x].y = localPos.y();
26136d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.touchPoint[x].pressure = 1; // TODO
26236d976165f994e4071601d8824987f25a0a8da07Huahui Wu        evt.data.multiTouch.touchPoint[x].size = 1; // TODO
26336d976165f994e4071601d8824987f25a0a8da07Huahui Wu    }
26456ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger
2656ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins    if (m_window->sendEvent(evt))
2663d0d3fdaa1308448b47592c03cda81c7f9e1f789Grace Kloba        event->preventDefault();
26736d976165f994e4071601d8824987f25a0a8da07Huahui Wu
26836d976165f994e4071601d8824987f25a0a8da07Huahui Wu    // cleanup the touch points we allocated
26936d976165f994e4071601d8824987f25a0a8da07Huahui Wu    delete[] evt.data.multiTouch.touchPoint;
27056ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger}
271a9cf40bab64a29201b65761ca30f9ff0c7e3e271Steve Block#endif
27256ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::handleMouseEvent(MouseEvent* event)
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString& type = event->type();
276d3fd788536f3fe65035a8fbba4ede47701716c43Derek Sollenberger    bool isUp = (eventNames().mouseupEvent == type);
277d3fd788536f3fe65035a8fbba4ede47701716c43Derek Sollenberger    bool isDown = (eventNames().mousedownEvent == type);
278a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ANPEvent    evt;
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2813a9f8eaff978cf1a11c725266c852f8d43755539Derek Sollenberger    if (isUp || isDown) {
2826ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins        SkANP::InitEvent(&evt, kMouse_ANPEventType);
283d3fd788536f3fe65035a8fbba4ede47701716c43Derek Sollenberger        evt.data.mouse.action = isUp ? kUp_ANPMouseAction : kDown_ANPMouseAction;
284d5e46442a26bd94d35230562671fc1979b3bb7a0Derek Sollenberger
285f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch        // Convert to coordinates that are relative to the plugin.
286f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch        IntPoint localPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation()));
287f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch        evt.data.mouse.x = localPos.x();
288f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch        evt.data.mouse.y = localPos.y();
289f5306da72ab6bb63f7ae07371e687f72a75c2fb2Ben Murdoch
2902c02e355bf0631c0bec3496fab67f45710c5cd21Grace Kloba        if (isDown) {
291a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba            // The plugin needs focus to receive keyboard and touch events
292a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba            m_element->focus();
293a622a48d6cc2bea33d2467de9d31feb1b03b03ebGrace Kloba            event->setDefaultHandled();
2942c02e355bf0631c0bec3496fab67f45710c5cd21Grace Kloba        }
295a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger    }
296a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger    else {
297a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger      return;
298a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger    }
299a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
3002eb76d0bcdf5cdc45cf6188c8bb76a409612235bDerek Sollenberger    if (m_window->sendEvent(evt)) {
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ANPKeyModifier make_modifiers(bool shift, bool alt) {
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ANPKeyModifier mod = 0;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (shift) {
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mod |= kShift_ANPKeyModifier;
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (alt) {
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mod |= kAlt_ANPKeyModifier;
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mod;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
316c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenbergervoid PluginView::handleFocusEvent(bool hasFocus)
317c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger{
318c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    ANPEvent evt;
319c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    SkANP::InitEvent(&evt, kLifecycle_ANPEventType);
320c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    evt.data.lifecycle.action = hasFocus ? kGainFocus_ANPLifecycleAction :
321c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger                                           kLoseFocus_ANPLifecycleAction;
322c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    m_window->sendEvent(evt);
323c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger
324c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    // redraw the plugin which subsequently invalidates the nav cache
325c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    IntRect rect = IntRect(m_npWindow.x, m_npWindow.y,
326c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger                           m_npWindow.width, m_npWindow.height);
327c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    m_window->webViewCore()->contentInvalidate(rect);
328c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger}
329c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::handleKeyboardEvent(KeyboardEvent* event)
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33256ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger    if (!m_window->isAcceptingEvent(kKey_ANPEventFlag))
33356ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger        return;
33456ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const PlatformKeyboardEvent* pke = event->keyEvent();
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (NULL == pke) {
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
340939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger    bool ignoreEvent = false;
341939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ANPEvent evt;
3436ed4a4e9a23ead7c910239171daf02b8fbecc17bLeon Scroggins    SkANP::InitEvent(&evt, kKey_ANPEventType);
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (pke->type()) {
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PlatformKeyboardEvent::KeyDown:
347a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger#if TRACE_KEY_EVENTS
348a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger            PLUGIN_LOG("--------- KeyDown, ignore\n");
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
350939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger            ignoreEvent = true;
351939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger            break;
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PlatformKeyboardEvent::RawKeyDown:
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            evt.data.key.action = kDown_ANPKeyAction;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PlatformKeyboardEvent::Char:
356a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger#if TRACE_KEY_EVENTS
357a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger            PLUGIN_LOG("--------- Char, ignore\n");
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
359939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger            ignoreEvent = true;
360939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger            break;
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PlatformKeyboardEvent::KeyUp:
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            evt.data.key.action = kUp_ANPKeyAction;
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
365a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger#if TRACE_KEY_EVENTS
366a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger            PLUGIN_LOG("------ unexpected keyevent type %d\n", pke->type());
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
368939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger            ignoreEvent = true;
369939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger            break;
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
371939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger
372939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger    /* the plugin should be the only party able to return nav control to the
373939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger     * browser UI. Therefore, if we discard an event on behalf of the plugin
374939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger     * we should mark the event as being handled.
375939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger     */
376939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger    if (ignoreEvent) {
377939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger        int keyCode = pke->nativeVirtualKeyCode();
378939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger        if (keyCode >= kDpadUp_ANPKeyCode && keyCode <= kDpadCenter_ANPKeyCode)
379939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger            event->setDefaultHandled();
380939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger        return;
381939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger    }
382939b5797c66ea70736c01eaec2dc694c909035d3Derek Sollenberger
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    evt.data.key.nativeCode = pke->nativeVirtualKeyCode();
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    evt.data.key.virtualCode = pke->windowsVirtualKeyCode();
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    evt.data.key.repeatCount = pke->repeatCount();
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    evt.data.key.modifiers = make_modifiers(pke->shiftKey(), pke->altKey());
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    evt.data.key.unichar = pke->unichar();
388a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
3892eb76d0bcdf5cdc45cf6188c8bb76a409612235bDerek Sollenberger    if (m_window->sendEvent(evt)) {
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->setDefaultHandled();
391fcce71fa296bf3b42bfc978caa059c55ce8df998Grace Kloba    } else if (m_window->inFullScreen()){
392fcce71fa296bf3b42bfc978caa059c55ce8df998Grace Kloba        // while in the full screen mode, always consumes the key events and
393fcce71fa296bf3b42bfc978caa059c55ce8df998Grace Kloba        // keeps the document focus
394fcce71fa296bf3b42bfc978caa059c55ce8df998Grace Kloba        event->setDefaultHandled();
395c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger    } else {
396c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger        // remove the plugin from the document's focus
397c7d9090583638605a2c8a779642ad09d1a228520Derek Sollenberger        m_parentFrame->document()->focusedNodeRemoved();
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
401c02eba192362e2ea83fdfbe0be51a08429ec4123Ben MurdochNPError PluginView::handlePostReadFile(Vector<char>& buffer, uint32_t len, const char* buf)
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NPERR_GENERIC_ERROR;
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
407cb5893797cc223f846046c4bd0875a894edab5c0Steve Blockbool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // our interface query is valid with no NPP instance
410cb5893797cc223f846046c4bd0875a894edab5c0Steve Block    *result = NPERR_GENERIC_ERROR;
41127a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger
41227a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger    switch (variable) {
41327a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger        case NPNVisOfflineBool: {
41427a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger            if (value != NULL) {
41527a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger                bool* retValue = static_cast<bool*>(value);
41627a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger                *retValue = !networkStateNotifier().onLine();
417cb5893797cc223f846046c4bd0875a894edab5c0Steve Block                *result = NPERR_NO_ERROR;
418cb5893797cc223f846046c4bd0875a894edab5c0Steve Block                return true;
41927a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger            }
4208e08406dc0936ffd02b77605bb1a638553a8b568Cary Clark            break;
42127a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger        }
42227a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger        case kJavaContext_ANPGetValue: {
42327a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger            jobject* retObject = static_cast<jobject*>(value);
42427a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger            *retObject = android::WebViewCore::getApplicationContext();
425cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            *result = NPERR_NO_ERROR;
426cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
42727a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger        }
4288e08406dc0936ffd02b77605bb1a638553a8b568Cary Clark        default:
4298e08406dc0936ffd02b77605bb1a638553a8b568Cary Clark            ; // do nothing
430ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project    }
43127a298a6476fbd78e67f35441e1428bc878a969dDerek Sollenberger
432cb5893797cc223f846046c4bd0875a894edab5c0Steve Block    (void)anp_getInterface(variable, value, result);
433cb5893797cc223f846046c4bd0875a894edab5c0Steve Block    return true;
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::setParent(ScrollView* parent)
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
438a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger    PLUGIN_LOG("--%p SetParent old=[%p], new=[%p] \n", instance(), this->parent(), parent);
439a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::setParent(parent);
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
442f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger    if (parent) {
443f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger        // the widget needs initialized now so that the plugin has access to
444f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger        // WebViewCore when NPP_New is called
445f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger        if (m_window && !m_window->webViewCore()) {
446f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger            android::WebViewCore* c = android::WebViewCore::getWebViewCore(this->parent());
447f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger            m_window->init(c);
448f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger        }
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        init();
450f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger
451f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger        /* Our widget needs to recompute its m_windowRect which then sets
452f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger           the NPWindowRect if necessary.  This ensures that if NPWindowRect
453f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger           is set prior to parent() being set that we still (1) notify the
454f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger           plugin of its current rect and (2) that we execute our logic in
455f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger           PluginWidgetAndroid in response to changes to NPWindowRect.
456f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger         */
457f7acc0456b574d63f33aaad3bbbec5344f74ce4bDerek Sollenberger        updatePluginWidget();
458f2a6f2e2f867d06fd84e859cdc37c3293357a6ffDerek Sollenberger    }
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4611f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Klobavoid PluginView::setNPWindowRect(const IntRect&)
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4631f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba    setNPWindowIfNeeded();
4641f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba}
465a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
4661f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Klobavoid PluginView::setNPWindowIfNeeded()
4671f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba{
468a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger    PLUGIN_LOG("--%p SetWindow isStarted=[%d] \n", instance(), m_isStarted);
469a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger
4701f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba    if (!m_isStarted || !parent())
4711f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba        return;
472a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
4731f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba    // in Android, plugin always get the setwindow() in the page coordinate.
4741f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba
4751f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba    // the m_npWindow is relative to the page
4763d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.x = m_pageRect.x();
4773d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.y = m_pageRect.y();
4783d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.width = m_pageRect.width();
4793d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.height = m_pageRect.height();
4801f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba
4813d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.clipRect.left = m_pageRect.x();
4823d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.clipRect.top = m_pageRect.y();
4833d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.clipRect.right = m_pageRect.x() + m_pageRect.width();
4843d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba    m_npWindow.clipRect.bottom = m_pageRect.y() + m_pageRect.height();
485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_plugin->pluginFuncs()->setwindow) {
487a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger#if USE(JSC)
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSC::JSLock::DropAllLocks dropAllLocks(false);
489a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger#endif
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(true);
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_plugin->pluginFuncs()->setwindow(m_instance, &m_npWindow);
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setCallingPlugin(false);
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
494a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
495e0204f4150fd9c321f119dc78d9e23e3164b4b1dDerek Sollenberger    m_window->setWindow(&m_npWindow, m_isTransparent);
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498cb5893797cc223f846046c4bd0875a894edab5c0Steve Blockbool PluginView::platformGetValue(NPNVariable variable, void* value, NPError* result)
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (variable) {
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPNVWindowNPObject: {
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NPObject* windowScriptObject =
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_parentFrame->script()->windowScriptNPObject();
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Return value is expected to be retained, as described
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // here:
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // <http://www.mozilla.org/projects/plugin/npruntime.html>
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (windowScriptObject)
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                _NPN_RetainObject(windowScriptObject);
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            void** v = (void**)value;
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *v = windowScriptObject;
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
514cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            *result = NPERR_NO_ERROR;
515cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPNVPluginElementNPObject: {
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NPObject* pluginScriptObject = 0;
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_element->hasTagName(appletTag) ||
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_element->hasTagName(embedTag) ||
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_element->hasTagName(objectTag)) {
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                HTMLPlugInElement* pluginElement =
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        static_cast<HTMLPlugInElement*>(m_element);
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                pluginScriptObject = pluginElement->getNPObject();
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Return value is expected to be retained, as described
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // here:
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // <http://www.mozilla.org/projects/plugin/npruntime.html>
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (pluginScriptObject)
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                _NPN_RetainObject(pluginScriptObject);
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            void** v = (void**)value;
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *v = pluginScriptObject;
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
538cb5893797cc223f846046c4bd0875a894edab5c0Steve Block           *result = NPERR_NO_ERROR;
539cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case NPNVnetscapeWindow: {
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Return the top level WebView Java object associated
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // with this instance.
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            jobject *retObject = static_cast<jobject*>(value);
546b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            // TODO: Is it safe for this to be NULL? It looks from the NPNVWindowNPObject case that it is.
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *retObject = android::WebViewCore::getWebViewCore(parent())->getWebViewJavaObject();
548cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            *result = NPERR_NO_ERROR;
549cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
551ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project
552ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project        case NPNVisOfflineBool: {
553ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project            if (value == NULL) {
554cb5893797cc223f846046c4bd0875a894edab5c0Steve Block              *result = NPERR_GENERIC_ERROR;
555cb5893797cc223f846046c4bd0875a894edab5c0Steve Block              return true;
556ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project            }
557ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project            bool* retValue = static_cast<bool*>(value);
558ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project            *retValue = !networkStateNotifier().onLine();
559cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            *result = NPERR_NO_ERROR;
560cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
561ba96c5ad9d140287cc378faec6bd9384836a00e6The Android Open Source Project        }
562a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kSupportedDrawingModel_ANPGetValue: {
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            uint32_t* bits = reinterpret_cast<uint32_t*>(value);
565838afd1be683057ebaf5cf85359bf9a567602b7bDerek Sollenberger            *bits = kBitmap_ANPDrawingModel & kSurface_ANPDrawingModel;
566cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            *result = NPERR_NO_ERROR;
567cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
568838afd1be683057ebaf5cf85359bf9a567602b7bDerek Sollenberger        }
569838afd1be683057ebaf5cf85359bf9a567602b7bDerek Sollenberger
570838afd1be683057ebaf5cf85359bf9a567602b7bDerek Sollenberger        case kJavaContext_ANPGetValue: {
571838afd1be683057ebaf5cf85359bf9a567602b7bDerek Sollenberger            jobject* retObject = static_cast<jobject*>(value);
572b4d178df818e8b6e7a1cfbb0e34bbf7bb9d74ec9Steve Block            // TODO: Is it safe for this to be NULL? It looks from the NPNVWindowNPObject case that it is.
573838afd1be683057ebaf5cf85359bf9a567602b7bDerek Sollenberger            *retObject = android::WebViewCore::getWebViewCore(parent())->getContext();
574cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            *result = NPERR_NO_ERROR;
575cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
577a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: {
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NPError error = NPERR_GENERIC_ERROR;
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (void)anp_getInterface(variable, value, &error);
581cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            *result = error;
582cb5893797cc223f846046c4bd0875a894edab5c0Steve Block            return true;
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNPError PluginView::platformSetValue(NPPVariable variable, void* value)
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPError error = NPERR_GENERIC_ERROR;
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (variable) {
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case kRequestDrawingModel_ANPSetValue: {
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ANPDrawingModel model = reinterpret_cast<ANPDrawingModel>(value);
594f86737b0ce8c81f2b529503f83eb8b064769eecaDerek Sollenberger            if (m_window->setDrawingModel(model))
595f86737b0ce8c81f2b529503f83eb8b064769eecaDerek Sollenberger                error = NPERR_NO_ERROR;
59656ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger            break;
59756ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger        }
59856ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger        case kAcceptEvents_ANPSetValue : {
59956ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger            if(value) {
60056ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger                ANPEventFlags flags = *reinterpret_cast<ANPEventFlags*>(value);
60156ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger                m_window->updateEventFlags(flags);
60256ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger                error = NPERR_NO_ERROR;
60356ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger            }
60456ce2fa12f7492cf355cfb37b80b679d7921f6d4Derek Sollenberger            break;
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return error;
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(const IntRect& r)
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_window->inval(r, true);
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRect(NPRect* rect)
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect r;
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (rect) {
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r = IntRect(rect->left, rect->top,
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    rect->right - rect->left, rect->bottom - rect->top);
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r = IntRect(0, 0, m_npWindow.width, m_npWindow.height);
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_window->inval(r, true);
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::invalidateRegion(NPRegion region)
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we don't support/define regions (yet), so do nothing
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::forceRedraw()
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this->invalidateRect(0);
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64188a30a51ea8b4aa85ab99022c9244e25c16623adBen Murdochvoid PluginView::setFocus(bool focused)
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64388a30a51ea8b4aa85ab99022c9244e25c16623adBen Murdoch    Widget::setFocus(focused);
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//    SkDebugf("------------- setFocus %p\n", this);
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::show()
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(true);
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::show();
651d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
652d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger    if (platformPluginWidget())
6531d7ddf2fb889b97549e1041bbbf53e481b4ced2cDerek Sollenberger        platformPluginWidget()->layoutSurface();
654d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::hide()
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(false);
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Widget::hide();
661d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
662d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger   if (platformPluginWidget())
6631d7ddf2fb889b97549e1041bbbf53e481b4ced2cDerek Sollenberger        platformPluginWidget()->layoutSurface();
664d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger}
665d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
666d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenbergervoid PluginView::setParentVisible(bool visible) {
667d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
668d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger    if (isParentVisible() == visible)
669d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger        return;
670d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
671d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger    Widget::setParentVisible(visible);
672d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
673d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger    if (platformPluginWidget())
6741d7ddf2fb889b97549e1041bbbf53e481b4ced2cDerek Sollenberger        platformPluginWidget()->layoutSurface();
675d3de9b89fbda35c06ad20c069229c2849ac5ff2dDerek Sollenberger
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginView::paint(GraphicsContext* context, const IntRect& rect)
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_isStarted) {
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Draw the "missing plugin" image
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paintMissingPluginIcon(context, rect);
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
685a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect frame = frameRect();
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame.width() || !frame.height()) {
688840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        PLUGIN_LOG("--%p FrameRect Dimensions are (0,0).\n", instance());
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
691a2c69492fd11733119d4f6ce3540acdfee9bf88cDerek Sollenberger
692840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger    if (m_window->isSurfaceDrawingModel()) {
693840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        /* the document position of the frame (e.g. iFrame) containing the
694840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger           surface may have changed, which requires us to to update the global
695840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger           coordinates of the surface. This is necessary because the plugin has
696840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger           not moved within its parent frame and therefore will not get any
697840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger           notification of its global position change.
698840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger         */
699840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        updatePluginWidget();
7001d7ddf2fb889b97549e1041bbbf53e481b4ced2cDerek Sollenberger        m_window->setSurfaceClip(context->platformContext()->mCanvas->getTotalClip().getBounds());
701840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger    } else {
702840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        m_window->inval(rect, false);
703840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        context->save();
704840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        context->translate(frame.x(), frame.y());
705840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        m_window->draw(android_gc2canvas(context));
706840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger        context->restore();
707840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger    }
708840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger
709840357963b3a1369006e7b640e829ff1dbc0118cDerek Sollenberger
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid PluginView::updatePluginWidget()
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    FrameView* frameView = static_cast<FrameView*>(parent());
715a506357ecbae5e506e0c3e46b6ebac632fd22328Derek Sollenberger    PLUGIN_LOG("--%p UpdatePluginWidget frame=[%p] \n", instance(), frameView);
716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (frameView) {
7171f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba        m_windowRect = frameView->contentsToWindow(frameRect());
7181f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba
7193d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba        IntRect oldPageRect = m_pageRect;
7203d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba
7213d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba        // only the top ScrollView can have the offset
7223d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba        m_pageRect = m_windowRect;
7233d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba        ScrollView* top = parent();
7243d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba        while (top->parent())
7253d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba            top = top->parent();
7263d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba        m_pageRect.move(top->scrollOffset());
7273d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba
7283d6ec5413643e3b591840267fc122b1b88e1f278Grace Kloba        if (m_pageRect != oldPageRect)
7291f15f3a9f6dc2a169bbd160e2e1abb161f9927d9Grace Kloba            setNPWindowIfNeeded();
730635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7336d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Blockvoid PluginView::halt() {
7346d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Block    notImplemented();
7356d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Block}
7366d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Block
7376d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Blockvoid PluginView::restart() {
7386d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Block    notImplemented();
7396d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Block}
7406d0ea8657f54a650eefa9438bf9e2f4c0709b534Steve Block
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
742