summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WebCore/plugins/PluginPackage.cpp5
-rw-r--r--WebCore/plugins/PluginPackage.h3
-rw-r--r--WebCore/plugins/android/PluginPackageAndroid.cpp106
-rw-r--r--WebCore/rendering/RenderPartObject.cpp109
-rw-r--r--WebKit/android/jni/WebViewCore.cpp2
5 files changed, 64 insertions, 161 deletions
diff --git a/WebCore/plugins/PluginPackage.cpp b/WebCore/plugins/PluginPackage.cpp
index 8cdda24..2a65fb6 100644
--- a/WebCore/plugins/PluginPackage.cpp
+++ b/WebCore/plugins/PluginPackage.cpp
@@ -139,11 +139,6 @@ void PluginPackage::unloadWithoutShutdown()
ASSERT(m_loadCount == 0);
ASSERT(m_module);
-#if defined(ANDROID_PLUGINS)
- // Remove the Java object from PluginList.
- unregisterPluginObject();
-#endif
-
// <rdar://5530519>: Crash when closing tab with pdf file (Reader 7 only)
// If the plugin has subclassed its parent window, as with Reader 7, we may have
// gotten here by way of the plugin's internal window proc forwarding a message to our
diff --git a/WebCore/plugins/PluginPackage.h b/WebCore/plugins/PluginPackage.h
index 905e85b..43d93ed 100644
--- a/WebCore/plugins/PluginPackage.h
+++ b/WebCore/plugins/PluginPackage.h
@@ -110,9 +110,6 @@ namespace WebCore {
#if defined(ANDROID_PLUGINS)
// Java Plugin object.
jobject m_pluginObject;
- // Called from unloadWithoutShutdown() to remove the object
- // from the PluginList.
- void unregisterPluginObject();
#endif
};
diff --git a/WebCore/plugins/android/PluginPackageAndroid.cpp b/WebCore/plugins/android/PluginPackageAndroid.cpp
index 0dd8342..e3c0e56 100644
--- a/WebCore/plugins/android/PluginPackageAndroid.cpp
+++ b/WebCore/plugins/android/PluginPackageAndroid.cpp
@@ -238,74 +238,6 @@ static jobject createPluginObject(const char *name,
return pluginObject;
}
-static jobject getPluginListObject()
-{
- JNIEnv *env = JSC::Bindings::getJNIEnv();
- // Get WebView.getPluginList()
- jclass webViewClass = env->FindClass("android/webkit/WebView");
- if(!webViewClass) {
- PLUGIN_LOG("Couldn't find class android.webkit.WebView\n");
- return 0;
- }
- jmethodID getPluginList = env->GetStaticMethodID(
- webViewClass,
- "getPluginList",
- "()Landroid/webkit/PluginList;");
- if(!getPluginList) {
- PLUGIN_LOG("Couldn't find android.webkit.WebView.getPluginList()\n");
- return 0;
- }
- // Get the PluginList instance
- jobject pluginListObject = env->CallStaticObjectMethod(webViewClass,
- getPluginList);
- if(!pluginListObject) {
- PLUGIN_LOG("Couldn't get PluginList object\n");
- return 0;
- }
- return pluginListObject;
-}
-
-static bool addPluginObjectToList(jobject pluginList, jobject plugin)
-{
- // Add the Plugin object
- JNIEnv *env = JSC::Bindings::getJNIEnv();
- jclass pluginListClass = env->FindClass("android/webkit/PluginList");
- if(!pluginListClass) {
- PLUGIN_LOG("Couldn't find class android.webkit.PluginList\n");
- return false;
- }
- jmethodID addPlugin = env->GetMethodID(
- pluginListClass,
- "addPlugin",
- "(Landroid/webkit/Plugin;)V");
- if(!addPlugin) {
- PLUGIN_LOG("Couldn't find android.webkit.PluginList.addPlugin()\n");
- return false;
- }
- env->CallVoidMethod(pluginList, addPlugin, plugin);
- return true;
-}
-
-static void removePluginObjectFromList(jobject pluginList, jobject plugin)
-{
- // Remove the Plugin object
- JNIEnv *env = JSC::Bindings::getJNIEnv();
- jclass pluginListClass = env->FindClass("android/webkit/PluginList");
- if(!pluginListClass) {
- PLUGIN_LOG("Couldn't find class android.webkit.PluginList\n");
- return;
- }
- jmethodID removePlugin = env->GetMethodID(
- pluginListClass,
- "removePlugin",
- "(Landroid/webkit/Plugin;)V");
- if(!removePlugin) {
- PLUGIN_LOG("Couldn't find android.webkit.PluginList.removePlugin()\n");
- return;
- }
- env->CallVoidMethod(pluginList, removePlugin, plugin);
-}
-
bool PluginPackage::load()
{
PLUGIN_LOG("tid:%d isActive:%d isLoaded:%d loadCount:%d\n",
@@ -379,23 +311,6 @@ bool PluginPackage::load()
return true;
}
-void PluginPackage::unregisterPluginObject()
-{
- PLUGIN_LOG("unregisterPluginObject\n");
- // Called by unloadWithoutShutdown(). Remove the plugin from the
- // PluginList
- if(m_pluginObject) {
- jobject pluginListObject = getPluginListObject();
- if(pluginListObject) {
- removePluginObjectFromList(pluginListObject, m_pluginObject);
- }
- // Remove a reference to the Plugin object so it can
- // garbage collect.
- JSC::Bindings::getJNIEnv()->DeleteGlobalRef(m_pluginObject);
- m_pluginObject = 0;
- }
-}
-
bool PluginPackage::fetchInfo()
{
PLUGIN_LOG("Fetch Info Loading \"%s\"\n", m_path.utf8().data());
@@ -501,27 +416,6 @@ bool PluginPackage::fetchInfo()
PLUGIN_LOG("Couldn't create Java Plugin\n");
return false;
}
-
- // Add the Plugin to the PluginList. This list is used to show the
- // user the list of plugins installed in the webkit.
-
- // The list of plugins are also available from the global static
- // function PluginDatabase::installedPlugins(). However, the method
- // on WebView to get the plugin list is a static method, and runs in the
- // UI thread. We can not easily drop all the GlobalRefs this implementation
- // has and switch to just calling through JNI to aforementioned API as
- // WebKit runs in another thread and the WebView call would need to change
- // to being async.
- jobject pluginListObject = getPluginListObject();
- if(!pluginListObject) {
- PLUGIN_LOG("Couldn't get PluginList object\n");
- return false;
- }
- if(!addPluginObjectToList(pluginListObject, pluginObject)) {
- PLUGIN_LOG("Couldn't add Plugin to PluginList\n");
- m_NPP_Shutdown();
- return false;
- }
// Retain the Java Plugin object
m_pluginObject = JSC::Bindings::getJNIEnv()->NewGlobalRef(pluginObject);
diff --git a/WebCore/rendering/RenderPartObject.cpp b/WebCore/rendering/RenderPartObject.cpp
index 2964e39..0e7655b 100644
--- a/WebCore/rendering/RenderPartObject.cpp
+++ b/WebCore/rendering/RenderPartObject.cpp
@@ -332,46 +332,58 @@ void RenderPartObject::layout()
RenderPart::calcWidth();
RenderPart::calcHeight();
// Some IFrames have a width and/or height of 1 when they are meant to be
- // hidden. If that is the case, don't try to expand.
- int w = width();
- int h = height();
- if (widget() && widget()->isFrameView() &&
- w > 1 && h > 1) {
- FrameView* view = static_cast<FrameView*>(widget());
- RenderView* root = NULL;
- if (view->frame() && view->frame()->document() &&
- view->frame()->document()->renderer() && view->frame()->document()->renderer()->isRenderView())
- root = static_cast<RenderView*>(view->frame()->document()->renderer());
- if (root) {
- // Update the dimensions to get the correct minimum preferred width
- updateWidgetPosition();
-
- int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
- int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
- // Use the preferred width if it is larger.
- setWidth(max(w, root->minPrefWidth()) + extraWidth);
-
- // Resize the view to recalc the height.
- int height = h - extraHeight;
- int width = w - extraWidth;
- if (width > view->width())
- height = 0;
- if (width != view->width() || height != view->height()) {
- view->resize(width, height);
- root->setNeedsLayout(true, false);
+ // hidden. If that is the case, do not try to expand.
+ if (node()->hasTagName(iframeTag) && widget() && widget()->isFrameView()
+ && width() > 1 && height() > 1) {
+ HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node());
+ bool scrolling = element->scrollingMode() != ScrollbarAlwaysOff;
+ bool widthIsFixed = style()->width().isFixed();
+ bool heightIsFixed = style()->height().isFixed();
+ // If an iframe has a fixed dimension and suppresses scrollbars, it
+ // will disrupt layout if we force it to expand. Plus on a desktop,
+ // the extra content is not accessible.
+ if (scrolling || !widthIsFixed || !heightIsFixed) {
+ FrameView* view = static_cast<FrameView*>(widget());
+ RenderView* root = view ? view->frame()->contentRenderer() : NULL;
+ RenderPart* owner = view->frame()->ownerRenderer();
+ if (root && style()->visibility() != HIDDEN
+ && (!owner || owner->style()->visibility() != HIDDEN)) {
+ // Update the dimensions to get the correct minimum preferred
+ // width
+ updateWidgetPosition();
+
+ int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
+ int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
+ // Use the preferred width if it is larger and only if
+ // scrollbars are visible or the width style is not fixed.
+ if (scrolling || !widthIsFixed)
+ setWidth(max(width(), root->minPrefWidth()) + extraWidth);
+
+ // Resize the view to recalc the height.
+ int h = height() - extraHeight;
+ int w = width() - extraWidth;
+ if (w > view->width())
+ h = 0;
+ if (w != view->width() || h != view->height()) {
+ view->resize(w, h);
+ root->setNeedsLayout(true, false);
+ }
+ // Layout the view.
+ if (view->needsLayout())
+ view->layout();
+ int contentHeight = view->contentsHeight();
+ int contentWidth = view->contentsWidth();
+ // Only change the width or height if scrollbars are visible or
+ // if the style is not a fixed value. Use the maximum value so
+ // that iframes never shrink.
+ if (scrolling || !heightIsFixed)
+ setHeight(max(height(), contentHeight + extraHeight));
+ if (scrolling || !widthIsFixed)
+ setWidth(max(width(), contentWidth + extraWidth));
+
+ // Update one last time
+ updateWidgetPosition();
}
- // Layout the view.
- if (view->needsLayout())
- view->layout();
- int contentHeight = view->contentsHeight();
- int contentWidth = view->contentsWidth();
- // Do not shrink iframes with a specified height.
- if (contentHeight > (h - extraHeight) || style()->height().isAuto())
- setHeight(contentHeight + extraHeight);
- setWidth(contentWidth + extraWidth);
-
- // Update one last time
- updateWidgetPosition();
}
}
#else
@@ -392,12 +404,16 @@ void RenderPartObject::layout()
#ifdef FLATTEN_IFRAME
void RenderPartObject::calcWidth() {
RenderPart::calcWidth();
- if (!widget() || !widget()->isFrameView())
+ if (!node()->hasTagName(iframeTag) || !widget() || !widget()->isFrameView())
return;
FrameView* view = static_cast<FrameView*>(widget());
RenderView* root = static_cast<RenderView*>(view->frame()->contentRenderer());
if (!root)
return;
+ // Do not expand if the scrollbars are suppressed and the width is fixed.
+ bool scrolling = static_cast<HTMLIFrameElement*>(node())->scrollingMode() != ScrollbarAlwaysOff;
+ if (!scrolling && style()->width().isFixed())
+ return;
// Update the dimensions to get the correct minimum preferred
// width
updateWidgetPosition();
@@ -413,7 +429,7 @@ void RenderPartObject::calcWidth() {
while (view->needsLayout())
view->layout();
- setWidth(view->contentsWidth() + extraWidth);
+ setWidth(max(width(), view->contentsWidth() + extraWidth));
// Update one last time to ensure the dimensions.
updateWidgetPosition();
@@ -421,12 +437,16 @@ void RenderPartObject::calcWidth() {
void RenderPartObject::calcHeight() {
RenderPart::calcHeight();
- if (!widget() || !widget()->isFrameView())
+ if (!node()->hasTagName(iframeTag) || !widget() || !widget()->isFrameView())
return;
FrameView* view = static_cast<FrameView*>(widget());
RenderView* root = static_cast<RenderView*>(view->frame()->contentRenderer());
if (!root)
return;
+ // Do not expand if the scrollbars are suppressed and the height is fixed.
+ bool scrolling = static_cast<HTMLIFrameElement*>(node())->scrollingMode() != ScrollbarAlwaysOff;
+ if (!scrolling && style()->height().isFixed())
+ return;
// Update the widget
updateWidgetPosition();
@@ -434,11 +454,8 @@ void RenderPartObject::calcHeight() {
while (view->needsLayout())
view->layout();
- // Do not shrink the height if the size is specified
- int h = view->contentsHeight();
int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
- if (h > height() - extraHeight || style()->height().isAuto())
- setHeight(h + extraHeight);
+ setHeight(max(width(), view->contentsHeight() + extraHeight));
// Update one last time to ensure the dimensions.
updateWidgetPosition();
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index c16d0a3..aa96b18 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -440,7 +440,7 @@ void WebViewCore::recordPictureSet(PictureSet* content)
// If the frame doesn't have an owner then it is the top frame and the
// view size is the frame size.
WebCore::RenderPart* owner = frame->ownerRenderer();
- if (owner) {
+ if (owner && owner->style()->visibility() == VISIBLE) {
int x = owner->x();
int y = owner->y();