diff options
| -rw-r--r-- | WebCore/html/HTMLBodyElement.cpp | 13 | ||||
| -rw-r--r-- | WebCore/html/HTMLMetaElement.cpp | 8 | ||||
| -rw-r--r-- | WebCore/page/Geolocation.cpp | 56 | ||||
| -rw-r--r-- | WebCore/page/Geolocation.h | 11 | ||||
| -rw-r--r-- | WebCore/page/PositionError.h | 6 | ||||
| -rw-r--r-- | WebCore/plugins/PluginPackage.cpp | 5 | ||||
| -rw-r--r-- | WebCore/plugins/PluginPackage.h | 3 | ||||
| -rw-r--r-- | WebCore/plugins/android/PluginPackageAndroid.cpp | 106 | ||||
| -rw-r--r-- | WebCore/rendering/RenderPartObject.cpp | 109 | ||||
| -rw-r--r-- | WebKit/Android.mk | 1 | ||||
| -rw-r--r-- | WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp | 25 | ||||
| -rwxr-xr-x | WebKit/android/jni/MockGeolocation.cpp | 96 | ||||
| -rw-r--r-- | WebKit/android/jni/WebCoreJniOnLoad.cpp | 4 | ||||
| -rw-r--r-- | WebKit/android/jni/WebViewCore.cpp | 4 |
14 files changed, 258 insertions, 189 deletions
diff --git a/WebCore/html/HTMLBodyElement.cpp b/WebCore/html/HTMLBodyElement.cpp index 9828dab..9852858 100644 --- a/WebCore/html/HTMLBodyElement.cpp +++ b/WebCore/html/HTMLBodyElement.cpp @@ -39,6 +39,10 @@ #include "MappedAttribute.h" #include "ScriptEventListener.h" +#ifdef ANDROID_META_SUPPORT +#include "Settings.h" +#endif + namespace WebCore { using namespace HTMLNames; @@ -173,6 +177,15 @@ void HTMLBodyElement::insertedIntoDocument() setAttribute(marginheightAttr, String::number(marginHeight)); } +#ifdef ANDROID_META_SUPPORT + Settings * settings = document()->settings(); + String host = document()->baseURI().host().lower(); + if (settings->viewportWidth() == -1 && (host.startsWith("m.") || host.startsWith("mobile.") + || host.contains(".m.") || host.contains(".mobile."))) + // fit mobile sites directly in the screen + settings->setMetadataSettings("width", "device-width"); +#endif + // FIXME: This call to scheduleRelayout should not be needed here. // But without it we hang during WebKit tests; need to fix that and remove this. if (FrameView* view = document()->view()) diff --git a/WebCore/html/HTMLMetaElement.cpp b/WebCore/html/HTMLMetaElement.cpp index 48284e3..5d3e925 100644 --- a/WebCore/html/HTMLMetaElement.cpp +++ b/WebCore/html/HTMLMetaElement.cpp @@ -27,6 +27,10 @@ #include "HTMLNames.h" #include "MappedAttribute.h" +#ifdef ANDROID_META_SUPPORT +#include "Settings.h" +#endif + namespace WebCore { using namespace HTMLNames; @@ -68,6 +72,10 @@ void HTMLMetaElement::process() return; if (equalIgnoringCase(name(), "viewport") || equalIgnoringCase(name(), "format-detection")) document()->processMetadataSettings(m_content); + else if (equalIgnoringCase(name(), "HandheldFriendly") && equalIgnoringCase(m_content, "true") + && document()->settings()->viewportWidth() == -1) + // fit mobile sites directly in the screen + document()->settings()->setMetadataSettings("width", "device-width"); #endif // Get the document to process the tag, but only if we're actually part of DOM tree (changing a meta tag while // it's not in the tree shouldn't have any effect on the document) diff --git a/WebCore/page/Geolocation.cpp b/WebCore/page/Geolocation.cpp index 5421eaa..aaf164d 100644 --- a/WebCore/page/Geolocation.cpp +++ b/WebCore/page/Geolocation.cpp @@ -56,9 +56,9 @@ void Geolocation::GeoNotifier::setFatalError(PassRefPtr<PositionError> error) m_timer.startOneShot(0); } -void Geolocation::GeoNotifier::startTimer() +void Geolocation::GeoNotifier::startTimerIfNeeded() { - if (m_errorCallback && m_options->hasTimeout()) + if (m_options->hasTimeout()) m_timer.startOneShot(m_options->timeout() / 1000.0); } @@ -75,8 +75,11 @@ void Geolocation::GeoNotifier::timerFired(Timer<GeoNotifier>*) return; } - RefPtr<PositionError> error = PositionError::create(PositionError::TIMEOUT, "Timed out"); - m_errorCallback->handleEvent(error.get()); + if (m_errorCallback) { + RefPtr<PositionError> error = PositionError::create(PositionError::TIMEOUT, "Timed out"); + m_errorCallback->handleEvent(error.get()); + } + m_geolocation->requestTimedOut(this); } Geolocation::Geolocation(Frame* frame) @@ -107,7 +110,9 @@ void Geolocation::getCurrentPosition(PassRefPtr<PositionCallback> successCallbac RefPtr<PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage); notifier->setFatalError(error.release()); } else { - if (!m_service->startUpdating(notifier->m_options.get())) { + if (m_service->startUpdating(notifier->m_options.get())) + notifier->startTimerIfNeeded(); + else { if (notifier->m_errorCallback) { RefPtr<PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, "Unable to Start"); notifier->m_errorCallback->handleEvent(error.get()); @@ -145,7 +150,9 @@ int Geolocation::watchPosition(PassRefPtr<PositionCallback> successCallback, Pas RefPtr<PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage); notifier->setFatalError(error.release()); } else { - if (!m_service->startUpdating(notifier->m_options.get())) { + if (m_service->startUpdating(notifier->m_options.get())) + notifier->startTimerIfNeeded(); + else { if (notifier->m_errorCallback) { RefPtr<PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, "Unable to Start"); notifier->m_errorCallback->handleEvent(error.get()); @@ -161,6 +168,15 @@ int Geolocation::watchPosition(PassRefPtr<PositionCallback> successCallback, Pas return sIdentifier; } +void Geolocation::requestTimedOut(GeoNotifier* notifier) +{ + // If this is a one-shot request, stop it. + m_oneShots.remove(notifier); + + if (!hasListeners()) + m_service->stopUpdating(); +} + void Geolocation::clearWatch(int watchId) { m_watchers.remove(watchId); @@ -186,10 +202,10 @@ void Geolocation::setIsAllowed(bool allowed) m_allowGeolocation = allowed ? Yes : No; if (isAllowed()) { - startTimers(); makeSuccessCallbacks(); } else { WTF::RefPtr<WebCore::PositionError> error = PositionError::create(PositionError::PERMISSION_DENIED, permissionDeniedErrorMessage); + error->setIsFatal(true); handleError(error.get()); } } @@ -232,7 +248,6 @@ void Geolocation::sendPositionToOneShots(Geoposition* position) RefPtr<GeoNotifier> notifier = *it; ASSERT(notifier->m_successCallback); - notifier->m_timer.stop(); notifier->m_successCallback->handleEvent(position); } } @@ -247,40 +262,39 @@ void Geolocation::sendPositionToWatchers(Geoposition* position) RefPtr<GeoNotifier> notifier = *it; ASSERT(notifier->m_successCallback); - notifier->m_timer.stop(); notifier->m_successCallback->handleEvent(position); } } -void Geolocation::startTimer(Vector<RefPtr<GeoNotifier> >& notifiers) +void Geolocation::stopTimer(Vector<RefPtr<GeoNotifier> >& notifiers) { Vector<RefPtr<GeoNotifier> >::const_iterator end = notifiers.end(); for (Vector<RefPtr<GeoNotifier> >::const_iterator it = notifiers.begin(); it != end; ++it) { RefPtr<GeoNotifier> notifier = *it; - notifier->startTimer(); + notifier->m_timer.stop(); } } -void Geolocation::startTimersForOneShots() +void Geolocation::stopTimersForOneShots() { Vector<RefPtr<GeoNotifier> > copy; copyToVector(m_oneShots, copy); - startTimer(copy); + stopTimer(copy); } -void Geolocation::startTimersForWatchers() +void Geolocation::stopTimersForWatchers() { Vector<RefPtr<GeoNotifier> > copy; copyValuesToVector(m_watchers, copy); - startTimer(copy); + stopTimer(copy); } -void Geolocation::startTimers() +void Geolocation::stopTimers() { - startTimersForOneShots(); - startTimersForWatchers(); + stopTimersForOneShots(); + stopTimersForWatchers(); } void Geolocation::handleError(PositionError* error) @@ -291,6 +305,9 @@ void Geolocation::handleError(PositionError* error) sendErrorToWatchers(error); m_oneShots.clear(); + + if (error->isFatal()) + m_watchers.clear(); } void Geolocation::requestPermission() @@ -315,6 +332,9 @@ void Geolocation::geolocationServicePositionChanged(GeolocationService*) { ASSERT(m_service->lastPosition()); + // Stop all currently running timers. + stopTimers(); + if (!isAllowed()) { // requestPermission() will ask the chrome for permission. This may be // implemented synchronously or asynchronously. In both cases, diff --git a/WebCore/page/Geolocation.h b/WebCore/page/Geolocation.h index 547d284..70a8196 100644 --- a/WebCore/page/Geolocation.h +++ b/WebCore/page/Geolocation.h @@ -78,7 +78,7 @@ private: static PassRefPtr<GeoNotifier> create(Geolocation* geolocation, PassRefPtr<PositionCallback> positionCallback, PassRefPtr<PositionErrorCallback> positionErrorCallback, PassRefPtr<PositionOptions> options) { return adoptRef(new GeoNotifier(geolocation, positionCallback, positionErrorCallback, options)); } void setFatalError(PassRefPtr<PositionError> error); - void startTimer(); + void startTimerIfNeeded(); void timerFired(Timer<GeoNotifier>*); Geolocation* m_geolocation; @@ -99,10 +99,10 @@ private: void sendPositionToOneShots(Geoposition*); void sendPositionToWatchers(Geoposition*); - static void startTimer(Vector<RefPtr<GeoNotifier> >&); - void startTimersForOneShots(); - void startTimersForWatchers(); - void startTimers(); + static void stopTimer(Vector<RefPtr<GeoNotifier> >&); + void stopTimersForOneShots(); + void stopTimersForWatchers(); + void stopTimers(); void makeSuccessCallbacks(); void handleError(PositionError*); @@ -114,6 +114,7 @@ private: virtual void geolocationServiceErrorOccurred(GeolocationService*); void fatalErrorOccurred(GeoNotifier* notifier); + void requestTimedOut(GeoNotifier* notifier); typedef HashSet<RefPtr<GeoNotifier> > GeoNotifierSet; typedef HashMap<int, RefPtr<GeoNotifier> > GeoNotifierMap; diff --git a/WebCore/page/PositionError.h b/WebCore/page/PositionError.h index 1d31f3b..c309061 100644 --- a/WebCore/page/PositionError.h +++ b/WebCore/page/PositionError.h @@ -45,16 +45,22 @@ public: ErrorCode code() const { return m_code; } const String& message() const { return m_message; } + void setIsFatal(bool isFatal) { m_isFatal = isFatal; } + bool isFatal() { return m_isFatal; } private: PositionError(ErrorCode code, const String& message) : m_code(code) , m_message(message) + , m_isFatal(false) { } ErrorCode m_code; String m_message; + // Whether the error is fatal, such that no request can ever obtain a good + // position fix in the future. + bool m_isFatal; }; } // namespace WebCore 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.mk b/WebKit/Android.mk index 784326c..c309910 100644 --- a/WebKit/Android.mk +++ b/WebKit/Android.mk @@ -36,6 +36,7 @@ LOCAL_SRC_FILES := \ android/jni/GeolocationPermissionsBridge.cpp \ android/jni/JavaBridge.cpp \ android/jni/JavaSharedClient.cpp \ + android/jni/MockGeolocation.cpp \ android/jni/PictureSet.cpp \ android/jni/WebCoreFrameBridge.cpp \ android/jni/WebCoreJni.cpp \ diff --git a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp index 7554a84..3ea7e49 100644 --- a/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp +++ b/WebKit/android/WebCoreSupport/FrameLoaderClientAndroid.cpp @@ -426,9 +426,15 @@ static bool TreatAsAttachment(const String& content_disposition) { } void FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFunction func, - const String& MIMEType, const ResourceRequest&) { + const String& MIMEType, const ResourceRequest& request) { ASSERT(m_frame); ASSERT(func); + if (!func) + return; + if (request.isNull()) { + (m_frame->loader()->*func)(PolicyIgnore); + return; + } // Default to Use (display internally). PolicyAction action = PolicyUse; // Check if we should Download instead. @@ -461,13 +467,20 @@ void FrameLoaderClientAndroid::dispatchDecidePolicyForMIMEType(FramePolicyFuncti } void FrameLoaderClientAndroid::dispatchDecidePolicyForNewWindowAction(FramePolicyFunction func, - const NavigationAction&, const ResourceRequest& req, + const NavigationAction&, const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName) { ASSERT(m_frame); + ASSERT(func); + if (!func) + return; + if (request.isNull()) { + (m_frame->loader()->*func)(PolicyIgnore); + return; + } // If we get to this point it means that a link has a target that was not // found by the frame tree. Instead of creating a new frame, return the // current frame in dispatchCreatePage. - if (canHandleRequest(req)) + if (canHandleRequest(request)) (m_frame->loader()->*func)(PolicyUse); else (m_frame->loader()->*func)(PolicyIgnore); @@ -486,6 +499,12 @@ void FrameLoaderClientAndroid::dispatchDecidePolicyForNavigationAction(FramePoli PassRefPtr<FormState> formState) { ASSERT(m_frame); ASSERT(func); + if (!func) + return; + if (request.isNull()) { + (m_frame->loader()->*func)(PolicyIgnore); + return; + } if (action.type() == NavigationTypeFormResubmitted) { m_webFrame->decidePolicyForFormResubmission(func); return; diff --git a/WebKit/android/jni/MockGeolocation.cpp b/WebKit/android/jni/MockGeolocation.cpp new file mode 100755 index 0000000..2f6ca60 --- /dev/null +++ b/WebKit/android/jni/MockGeolocation.cpp @@ -0,0 +1,96 @@ +/* + * Copyright 2009, 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. + */ + +// The functions in this file are used to configure the mock GeolocationService +// for the LayoutTests. + +#include "config.h" + +#include <JNIHelp.h> +#include "Coordinates.h" +#include "GeolocationService.h" +#include "Geoposition.h" +#include "JavaSharedClient.h" +#include "jni_utility.h" +#include "PositionError.h" +#include "WebCoreJni.h" +#include <wtf/CurrentTime.h> + +using namespace WebCore; + +namespace android { + +static const char* javaMockGeolocationClass = "android/webkit/MockGeolocation"; + +static void setPosition(JNIEnv* env, jobject, double latitude, double longitude, double accuracy) +{ + RefPtr<Coordinates> coordinates = Coordinates::create(latitude, + longitude, + false, 0.0, // altitude, + accuracy, + false, 0.0, // altitudeAccuracy, + false, 0.0, // heading + false, 0.0); // speed + RefPtr<Geoposition> position = Geoposition::create(coordinates.release(), WTF::currentTime()); + GeolocationService::setMockPosition(position.release()); +} + +static void setError(JNIEnv* env, jobject, int code, jstring message) +{ + PositionError::ErrorCode codeEnum; + switch (code) { + case PositionError::UNKNOWN_ERROR: + codeEnum = PositionError::UNKNOWN_ERROR; + break; + case PositionError::PERMISSION_DENIED: + codeEnum = PositionError::PERMISSION_DENIED; + break; + case PositionError::POSITION_UNAVAILABLE: + codeEnum = PositionError::POSITION_UNAVAILABLE; + break; + case PositionError::TIMEOUT: + codeEnum = PositionError::TIMEOUT; + break; + default: + ASSERT(false); + } + String messageString = to_string(env, message); + RefPtr<PositionError> error = PositionError::create(codeEnum, messageString); + GeolocationService::setMockError(error.release()); +} + +static JNINativeMethod gMockGeolocationMethods[] = { + { "nativeSetPosition", "(DDD)V", (void*) setPosition }, + { "nativeSetError", "(ILjava/lang/String;)V", (void*) setError } +}; + +int register_mock_geolocation(JNIEnv* env) +{ + jclass mockGeolocation = env->FindClass(javaMockGeolocationClass); + LOG_ASSERT(mockGeolocation, "Unable to find class"); + return jniRegisterNativeMethods(env, javaMockGeolocationClass, gMockGeolocationMethods, NELEM(gMockGeolocationMethods)); +} + +} diff --git a/WebKit/android/jni/WebCoreJniOnLoad.cpp b/WebKit/android/jni/WebCoreJniOnLoad.cpp index 3a29f43..25afc61 100644 --- a/WebKit/android/jni/WebCoreJniOnLoad.cpp +++ b/WebKit/android/jni/WebCoreJniOnLoad.cpp @@ -45,6 +45,7 @@ extern int register_webcorejni(JNIEnv*); extern int register_webstorage(JNIEnv*); #endif extern int register_geolocation_permissions(JNIEnv*); +extern int register_mock_geolocation(JNIEnv*); } @@ -66,7 +67,8 @@ static RegistrationMethod gWebCoreRegMethods[] = { { "WebStorage", android::register_webstorage }, #endif { "WebView", android::register_webview }, - { "GeolocationPermissions", android::register_geolocation_permissions } + { "GeolocationPermissions", android::register_geolocation_permissions }, + { "MockGeolocation", android::register_mock_geolocation } }; EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp index 3e4254d..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(); @@ -1088,7 +1088,7 @@ void WebViewCore::updateCacheOnNodeChange() return; if (CacheBuilder::validNode(m_mainFrame, frame, node)) { RenderObject* renderer = node->renderer(); - if (renderer) { + if (renderer && renderer->style()->visibility() != HIDDEN) { IntRect absBox = renderer->absoluteBoundingBoxRect(); int globalX, globalY; CacheBuilder::GetGlobalOffset(frame, &globalX, &globalY); |
