summaryrefslogtreecommitdiffstats
path: root/WebKit/android/plugins/PluginWidgetAndroid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/android/plugins/PluginWidgetAndroid.cpp')
-rw-r--r--WebKit/android/plugins/PluginWidgetAndroid.cpp71
1 files changed, 56 insertions, 15 deletions
diff --git a/WebKit/android/plugins/PluginWidgetAndroid.cpp b/WebKit/android/plugins/PluginWidgetAndroid.cpp
index 60d7058..6318276 100644
--- a/WebKit/android/plugins/PluginWidgetAndroid.cpp
+++ b/WebKit/android/plugins/PluginWidgetAndroid.cpp
@@ -29,7 +29,6 @@
#include "Element.h"
#include "Frame.h"
#include "PluginPackage.h"
-#include "PluginSurface.h"
#include "PluginView.h"
#include "PluginWidgetAndroid.h"
#include "ScrollView.h"
@@ -49,11 +48,19 @@ PluginWidgetAndroid::PluginWidgetAndroid(WebCore::PluginView* view)
m_visibleDocRect.setEmpty();
m_hasFocus = false;
m_zoomLevel = 0;
+ m_javaClassName = NULL;
+ m_childView = NULL;
}
PluginWidgetAndroid::~PluginWidgetAndroid() {
if (m_core) {
m_core->removePlugin(this);
+ if (m_childView) {
+ m_core->destroySurface(m_childView);
+ }
+ }
+ if (m_javaClassName) {
+ free(m_javaClassName);
}
m_flipPixelRef->safeUnref();
}
@@ -68,13 +75,48 @@ static SkBitmap::Config computeConfig(bool isTransparent) {
: SkBitmap::kRGB_565_Config;
}
+/*
+ * Returns the name of the apk that contains this plugin. The caller is
+ * responsible for calling free(...) on the char* that is returned.
+ */
+static char* getPackageName(PluginPackage* pluginPackage) {
+
+ // get the directory where the plugin library is stored. The structure of
+ // the path looks like /data/app/plugin.package.name/lib.
+ const char* pluginDir = pluginPackage->parentDirectory().latin1().data();
+
+ // trim "/lib" off the directory name and store in tempString
+ int length = strlen(pluginDir) - 4; // -4 for "/lib"
+ char* tempString = (char*) malloc(length + 1); // +1 for null termination
+ strncpy(tempString, pluginDir, length);
+ tempString[length] = '\0';
+
+ // find the final '/' in tempString
+ char* result = strrchr(tempString, '/');
+
+ char* packageName = NULL;
+ if (result) {
+ // duplicate the tempString without the leading '/'
+ packageName = strdup(result+1);
+ }
+
+ // free extra memory and return the package name
+ free(tempString);
+ return packageName;
+}
+
void PluginWidgetAndroid::setWindow(NPWindow* window, bool isTransparent) {
m_pluginWindow = window;
if (m_drawingModel == kSurface_ANPDrawingModel) {
- if (m_surface) {
+ if (!m_childView) {
IntPoint docPoint = frameToDocumentCoords(window->x, window->y);
- m_surface->attach(docPoint.x(), docPoint.y(), window->width, window->height);
+ char* packageName = getPackageName(m_pluginView->plugin());
+ m_childView = m_core->createSurface(packageName, m_javaClassName,
+ m_pluginView->instance(),
+ docPoint.x(), docPoint.y(),
+ window->width, window->height);
+ free(packageName);
}
} else {
m_flipPixelRef->safeUnref();
@@ -83,7 +125,18 @@ void PluginWidgetAndroid::setWindow(NPWindow* window, bool isTransparent) {
}
}
+bool PluginWidgetAndroid::setJavaClassName(const char* className) {
+ m_javaClassName = strdup(className);
+ return (m_javaClassName != NULL);
+}
+
bool PluginWidgetAndroid::setDrawingModel(ANPDrawingModel model) {
+
+ // disallow the surface drawing model if no java class name has been given
+ if (model == kSurface_ANPDrawingModel && m_javaClassName == NULL) {
+ return false;
+ }
+
m_drawingModel = model;
return true;
}
@@ -210,18 +263,6 @@ bool PluginWidgetAndroid::isAcceptingEvent(ANPEventFlag flag) {
return m_eventFlags & flag;
}
-ANPSurface* PluginWidgetAndroid::createRasterSurface(ANPBitmapFormat format,
- bool fixedSize) {
- if (m_drawingModel != kSurface_ANPDrawingModel) {
- return NULL;
- }
- m_surface.set(new android::PluginSurface(this, format, fixedSize));
- ANPSurface* surface = new ANPSurface;
- surface->data = m_surface.get();
- surface->type = kRaster_ANPSurfaceType;
- return surface;
-}
-
void PluginWidgetAndroid::setVisibleScreen(const ANPRectI& visibleDocRect, float zoom) {
// TODO update the bitmap size based on the zoom? (for kBitmap_ANPDrawingModel)