[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da

weinig at apple.com weinig at apple.com
Wed Dec 22 18:41:23 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 2e7a7cdaf963dac0830a7d3c5bba8ae4dc3b2cbf
Author: weinig at apple.com <weinig at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Dec 15 21:52:51 2010 +0000

    WebKit2: Can't add files to an <input type=file>
    https://bugs.webkit.org/show_bug.cgi?id=51087
    
    Reviewed by Anders Carlsson.
    
    WebCore:
    
    Add exported function.
    
    * WebCore.exp.in:
    
    WebKit2:
    
    * Scripts/webkit2/messages.py:
    Adds new types.
    
    * Shared/API/c/WKBase.h:
    Adds WKOpenPanelParametersRef and WKOpenPanelResultListenerRef.
    
    * Shared/APIObject.h:
    Adds TypeOpenPanelParameters and TypeOpenPanelResultListener.
    
    * Shared/WebOpenPanelParameters.cpp: Added.
    (WebKit::WebOpenPanelParameters::create):
    (WebKit::WebOpenPanelParameters::WebOpenPanelParameters):
    (WebKit::WebOpenPanelParameters::~WebOpenPanelParameters):
    (WebKit::WebOpenPanelParameters::Data::encode):
    (WebKit::WebOpenPanelParameters::Data::decode):
    * Shared/WebOpenPanelParameters.h: Added.
    (WebKit::WebOpenPanelParameters::allowMultipleFiles):
    (WebKit::WebOpenPanelParameters::type):
    Class representing options one can pass to open panel.
    
    * UIProcess/API/C/WKAPICast.h:
    Add casts for WebOpenPanelParameters and WebOpenPanelResultListenerProxy.
    
    * UIProcess/API/C/WKOpenPanelParameters.cpp: Added.
    (WKOpenPanelParametersGetTypeID):
    (WKOpenPanelParametersGetAllowsMultipleFiles):
    * UIProcess/API/C/WKOpenPanelParameters.h: Added.
    * UIProcess/API/C/WKOpenPanelResultListener.cpp: Added.
    (WKOpenPanelResultListenerGetTypeID):
    (WKOpenPanelResultListenerChooseFiles):
    (WKOpenPanelResultListenerCancel):
    * UIProcess/API/C/WKOpenPanelResultListener.h: Added.
    Add API wrappers.
    
    * UIProcess/API/C/WKPage.h:
    Add new UI callback, WKPageRunOpenPanelCallback.
    
    * UIProcess/API/C/WebKit2.h:
    Add includes for new API headers.
    
    * UIProcess/API/qt/qwkpage.cpp:
    (QWKPage::QWKPage):
    Stub out the runOpenPanel callback.
    
    * UIProcess/WebOpenPanelResultListenerProxy.cpp: Added.
    (WebKit::WebOpenPanelResultListenerProxy::WebOpenPanelResultListenerProxy):
    (WebKit::WebOpenPanelResultListenerProxy::~WebOpenPanelResultListenerProxy):
    (WebKit::WebOpenPanelResultListenerProxy::chooseFiles):
    (WebKit::WebOpenPanelResultListenerProxy::cancel):
    (WebKit::WebOpenPanelResultListenerProxy::invalidate):
    * UIProcess/WebOpenPanelResultListenerProxy.h: Added.
    (WebKit::WebOpenPanelResultListenerProxy::create):
    (WebKit::WebOpenPanelResultListenerProxy::type):
    Adds the listener used to choose files for <input type=file>
    
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::runOpenPanel):
    (WebKit::WebPageProxy::didChooseFilesForOpenPanel):
    (WebKit::WebPageProxy::didCancelForOpenPanel):
    * UIProcess/WebPageProxy.h:
    * UIProcess/WebPageProxy.messages.in:
    * UIProcess/WebUIClient.cpp:
    (WebKit::WebUIClient::runOpenPanel):
    * UIProcess/WebUIClient.h:
    * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    (WebKit::WebChromeClient::runOpenPanel):
    * WebProcess/WebPage/WebOpenPanelResultListener.cpp: Added.
    (WebKit::WebOpenPanelResultListener::create):
    (WebKit::WebOpenPanelResultListener::WebOpenPanelResultListener):
    (WebKit::WebOpenPanelResultListener::~WebOpenPanelResultListener):
    (WebKit::WebOpenPanelResultListener::didChooseFiles):
    * WebProcess/WebPage/WebOpenPanelResultListener.h: Added.
    (WebKit::WebOpenPanelResultListener::disconnectFromPage):
    * WebProcess/WebPage/WebPage.cpp:
    (WebKit::WebPage::close):
    (WebKit::WebPage::setActiveOpenPanelResultListener):
    (WebKit::WebPage::didChooseFilesForOpenPanel):
    (WebKit::WebPage::didCancelForOpenPanel):
    * WebProcess/WebPage/WebPage.h:
    (WebKit::WebPage::activeOpenPanelResultListener):
    * WebProcess/WebPage/WebPage.messages.in:
    Pipe through file choosing.
    
    * WebKit2.pro:
    * WebKit2.xcodeproj/project.pbxproj:
    * win/WebKit2.vcproj:
    * win/WebKit2Generated.make:
    Add new files.
    
    WebKitTools:
    
    * MiniBrowser/mac/BrowserWindowController.m:
    (runOpenPanel):
    (-[BrowserWindowController awakeFromNib]):
    Add simple implementation of runOpenPanel callback.
    
    * MiniBrowser/win/BrowserView.cpp:
    (BrowserView::create):
    * WebKitTestRunner/TestController.cpp:
    (WTR::createOtherPage):
    (WTR::TestController::initialize):
    Stub out runOpenPanel callback.
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74139 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 63ac79a..b645203 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,14 @@
+2010-12-15  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Anders Carlsson.
+
+        WebKit2: Can't add files to an <input type=file>
+        https://bugs.webkit.org/show_bug.cgi?id=51087
+
+        Add exported function.
+
+        * WebCore.exp.in:
+
 2010-12-15  Andreas Kling  <andreas.kling at nokia.com>
 
         Reviewed by Antonio Gomes.
diff --git a/WebCore/WebCore.exp.in b/WebCore/WebCore.exp.in
index f9480aa..2e41cd8 100644
--- a/WebCore/WebCore.exp.in
+++ b/WebCore/WebCore.exp.in
@@ -223,10 +223,10 @@ __ZN7WebCore12EventHandler15handleAccessKeyERKNS_21PlatformKeyboardEventE
 __ZN7WebCore12EventHandler15sendScrollEventEv
 __ZN7WebCore12EventHandler16handleWheelEventERNS_18PlatformWheelEventE
 __ZN7WebCore12EventHandler17scrollRecursivelyENS_15ScrollDirectionENS_17ScrollGranularityEPNS_4NodeE
-__ZN7WebCore12EventHandler24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityEPNS_4NodeE
 __ZN7WebCore12EventHandler20hitTestResultAtPointERKNS_8IntPointEbbNS_17HitTestScrollbarsEjRKNS_7IntSizeE
 __ZN7WebCore12EventHandler21handleMousePressEventERKNS_18PlatformMouseEventE
 __ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_18PlatformMouseEventE
+__ZN7WebCore12EventHandler24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityEPNS_4NodeE
 __ZN7WebCore12EventHandler27capsLockStateMayHaveChangedEv
 __ZN7WebCore12EventHandler7mouseUpEP7NSEvent
 __ZN7WebCore12EventHandler8keyEventEP7NSEvent
@@ -273,6 +273,7 @@ __ZN7WebCore12SharedBuffer12createNSDataEv
 __ZN7WebCore12SharedBuffer24createWithContentsOfFileERKN3WTF6StringE
 __ZN7WebCore12SharedBufferC1EPKci
 __ZN7WebCore12SharedBufferD1Ev
+__ZN7WebCore12SpellChecker8didCheckEiRKN3WTF6VectorINS_19SpellCheckingResultELm0EEE
 __ZN7WebCore12TextEncodingC1ERKN3WTF6StringE
 __ZN7WebCore12TextIterator11rangeLengthEPKNS_5RangeEb
 __ZN7WebCore12TextIterator26rangeFromLocationAndLengthEPNS_7ElementEiib
@@ -519,9 +520,9 @@ __ZN7WebCore23ReplaceSelectionCommandC1EPNS_8DocumentEN3WTF10PassRefPtrINS_16Doc
 __ZN7WebCore23createFragmentFromNodesEPNS_8DocumentERKN3WTF6VectorIPNS_4NodeELm0EEE
 __ZN7WebCore23overrideDefaultLanguageERKN3WTF6StringE
 __ZN7WebCore24BinaryPropertyListWriter17writePropertyListEv
-__ZN7WebCore24DocumentMarkerController14markersForNodeEPNS_4NodeE
 __ZN7WebCore24DocumentMarkerController13removeMarkersENS_14DocumentMarker10MarkerTypeE
 __ZN7WebCore24DocumentMarkerController14markersForNodeEPNS_4NodeE
+__ZN7WebCore24DocumentMarkerController14markersForNodeEPNS_4NodeE
 __ZN7WebCore24DocumentMarkerController23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE
 __ZN7WebCore24contextMenuItemTagItalicEv
 __ZN7WebCore24contextMenuItemTagStylesEv
@@ -924,7 +925,6 @@ __ZN7WebCore9makeRangeERKNS_15VisiblePositionES2_
 __ZN7WebCore9pageCacheEv
 __ZN7WebCore9plainTextEPKNS_5RangeENS_20TextIteratorBehaviorE
 __ZN7WebCore9toElementEN3JSC7JSValueE
-__ZN7WebCore12SpellChecker8didCheckEiRKN3WTF6VectorINS_19SpellCheckingResultELm0EEE
 __ZNK3JSC8Bindings10RootObject12globalObjectEv
 __ZNK3WTF6String14createCFStringEv
 __ZNK7WebCore10Credential11persistenceEv
@@ -1090,6 +1090,7 @@ __ZNK7WebCore4Font10floatWidthERKNS_7TextRunEPN3WTF7HashSetIPKNS_14SimpleFontDat
 __ZNK7WebCore4Font8drawTextEPNS_15GraphicsContextERKNS_7TextRunERKNS_10FloatPointEii
 __ZNK7WebCore4KURL11createCFURLEv
 __ZNK7WebCore4KURL11isLocalFileEv
+__ZNK7WebCore4KURL14fileSystemPathEv
 __ZNK7WebCore4KURL17lastPathComponentEv
 __ZNK7WebCore4KURL4hostEv
 __ZNK7WebCore4KURL4pathEv
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index aa8c33e..ee22d95 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,99 @@
+2010-12-15  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Anders Carlsson.
+
+        WebKit2: Can't add files to an <input type=file>
+        https://bugs.webkit.org/show_bug.cgi?id=51087
+
+        * Scripts/webkit2/messages.py:
+        Adds new types.
+
+        * Shared/API/c/WKBase.h:
+        Adds WKOpenPanelParametersRef and WKOpenPanelResultListenerRef.
+
+        * Shared/APIObject.h:
+        Adds TypeOpenPanelParameters and TypeOpenPanelResultListener.
+
+        * Shared/WebOpenPanelParameters.cpp: Added.
+        (WebKit::WebOpenPanelParameters::create):
+        (WebKit::WebOpenPanelParameters::WebOpenPanelParameters):
+        (WebKit::WebOpenPanelParameters::~WebOpenPanelParameters):
+        (WebKit::WebOpenPanelParameters::Data::encode):
+        (WebKit::WebOpenPanelParameters::Data::decode):
+        * Shared/WebOpenPanelParameters.h: Added.
+        (WebKit::WebOpenPanelParameters::allowMultipleFiles):
+        (WebKit::WebOpenPanelParameters::type):
+        Class representing options one can pass to open panel.
+
+        * UIProcess/API/C/WKAPICast.h:
+        Add casts for WebOpenPanelParameters and WebOpenPanelResultListenerProxy.
+
+        * UIProcess/API/C/WKOpenPanelParameters.cpp: Added.
+        (WKOpenPanelParametersGetTypeID):
+        (WKOpenPanelParametersGetAllowsMultipleFiles):
+        * UIProcess/API/C/WKOpenPanelParameters.h: Added.
+        * UIProcess/API/C/WKOpenPanelResultListener.cpp: Added.
+        (WKOpenPanelResultListenerGetTypeID):
+        (WKOpenPanelResultListenerChooseFiles):
+        (WKOpenPanelResultListenerCancel):
+        * UIProcess/API/C/WKOpenPanelResultListener.h: Added.
+        Add API wrappers.
+
+        * UIProcess/API/C/WKPage.h:
+        Add new UI callback, WKPageRunOpenPanelCallback.
+
+        * UIProcess/API/C/WebKit2.h:
+        Add includes for new API headers.
+
+        * UIProcess/API/qt/qwkpage.cpp:
+        (QWKPage::QWKPage):
+        Stub out the runOpenPanel callback.
+
+        * UIProcess/WebOpenPanelResultListenerProxy.cpp: Added.
+        (WebKit::WebOpenPanelResultListenerProxy::WebOpenPanelResultListenerProxy):
+        (WebKit::WebOpenPanelResultListenerProxy::~WebOpenPanelResultListenerProxy):
+        (WebKit::WebOpenPanelResultListenerProxy::chooseFiles):
+        (WebKit::WebOpenPanelResultListenerProxy::cancel):
+        (WebKit::WebOpenPanelResultListenerProxy::invalidate):
+        * UIProcess/WebOpenPanelResultListenerProxy.h: Added.
+        (WebKit::WebOpenPanelResultListenerProxy::create):
+        (WebKit::WebOpenPanelResultListenerProxy::type):
+        Adds the listener used to choose files for <input type=file>
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::runOpenPanel):
+        (WebKit::WebPageProxy::didChooseFilesForOpenPanel):
+        (WebKit::WebPageProxy::didCancelForOpenPanel):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/WebUIClient.cpp:
+        (WebKit::WebUIClient::runOpenPanel):
+        * UIProcess/WebUIClient.h:
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::runOpenPanel):
+        * WebProcess/WebPage/WebOpenPanelResultListener.cpp: Added.
+        (WebKit::WebOpenPanelResultListener::create):
+        (WebKit::WebOpenPanelResultListener::WebOpenPanelResultListener):
+        (WebKit::WebOpenPanelResultListener::~WebOpenPanelResultListener):
+        (WebKit::WebOpenPanelResultListener::didChooseFiles):
+        * WebProcess/WebPage/WebOpenPanelResultListener.h: Added.
+        (WebKit::WebOpenPanelResultListener::disconnectFromPage):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::close):
+        (WebKit::WebPage::setActiveOpenPanelResultListener):
+        (WebKit::WebPage::didChooseFilesForOpenPanel):
+        (WebKit::WebPage::didCancelForOpenPanel):
+        * WebProcess/WebPage/WebPage.h:
+        (WebKit::WebPage::activeOpenPanelResultListener):
+        * WebProcess/WebPage/WebPage.messages.in:
+        Pipe through file choosing.
+
+        * WebKit2.pro:
+        * WebKit2.xcodeproj/project.pbxproj:
+        * win/WebKit2.vcproj:
+        * win/WebKit2Generated.make:
+        Add new files.
+
 2010-12-15  Anders Carlsson  <andersca at apple.com>
 
         Reviewed by Maciej Stachowiak.
diff --git a/WebKit2/Scripts/webkit2/messages.py b/WebKit2/Scripts/webkit2/messages.py
index 8fb6f8c..4adabae 100644
--- a/WebKit2/Scripts/webkit2/messages.py
+++ b/WebKit2/Scripts/webkit2/messages.py
@@ -249,8 +249,8 @@ def message_to_struct_declaration(message):
 
 def struct_or_class(namespace, type):
     structs = frozenset([
-        'WebCore::KeypressCommand',
         'WebCore::CompositionUnderline',
+        'WebCore::KeypressCommand',
         'WebCore::PluginInfo',
         'WebCore::ViewportArguments',
         'WebCore::WindowFeatures',
@@ -258,6 +258,7 @@ def struct_or_class(namespace, type):
         'WebKit::PlatformPopupMenuData',
         'WebKit::PluginProcessCreationParameters',
         'WebKit::WebNavigationDataStore',
+        'WebKit::WebOpenPanelParameters::Data',
         'WebKit::WebPageCreationParameters',
         'WebKit::WebPreferencesStore',
         'WebKit::WebProcessCreationParameters',
@@ -411,13 +412,13 @@ def headers_for_type(type):
 
     special_cases = {
         'WTF::String': '<wtf/text/WTFString.h>',
+        'WebCore::CompositionUnderline': '<WebCore/Editor.h>',
         'WebCore::KeypressCommand': '<WebCore/KeyboardEvent.h>',
         'WebCore::PluginInfo': '<WebCore/PluginData.h>',
-        'WebCore::CompositionUnderline': '<WebCore/Editor.h>',
         'WebKit::WebKeyboardEvent': '"WebEvent.h"',
         'WebKit::WebMouseEvent': '"WebEvent.h"',
-        'WebKit::WebWheelEvent': '"WebEvent.h"',
         'WebKit::WebTouchEvent': '"WebEvent.h"',
+        'WebKit::WebWheelEvent': '"WebEvent.h"',
     }
     if type in special_cases:
         return [special_cases[type]]
diff --git a/WebKit2/Shared/API/c/WKBase.h b/WebKit2/Shared/API/c/WKBase.h
index 08eb5e3..cf5bb5b 100644
--- a/WebKit2/Shared/API/c/WKBase.h
+++ b/WebKit2/Shared/API/c/WKBase.h
@@ -73,6 +73,8 @@ typedef const struct OpaqueWKFrame* WKFrameRef;
 typedef const struct OpaqueWKFramePolicyListener* WKFramePolicyListenerRef;
 typedef const struct OpaqueWKInspector* WKInspectorRef;
 typedef const struct OpaqueWKNavigationData* WKNavigationDataRef;
+typedef const struct OpaqueWKOpenPanelParameters* WKOpenPanelParametersRef;
+typedef const struct OpaqueWKOpenPanelResultListener* WKOpenPanelResultListenerRef;
 typedef const struct OpaqueWKPage* WKPageRef;
 typedef const struct OpaqueWKPageGroup* WKPageGroupRef;
 typedef const struct OpaqueWKPreferences* WKPreferencesRef;
diff --git a/WebKit2/Shared/APIObject.h b/WebKit2/Shared/APIObject.h
index 52b7a57..e625b3a 100644
--- a/WebKit2/Shared/APIObject.h
+++ b/WebKit2/Shared/APIObject.h
@@ -69,6 +69,8 @@ public:
         TypeFramePolicyListener,
         TypeInspector,
         TypeNavigationData,
+        TypeOpenPanelParameters,
+        TypeOpenPanelResultListener,
         TypePage,
         TypePageGroup,
         TypePreferences,
diff --git a/WebKit2/Shared/WebOpenPanelParameters.cpp b/WebKit2/Shared/WebOpenPanelParameters.cpp
new file mode 100644
index 0000000..821477b
--- /dev/null
+++ b/WebKit2/Shared/WebOpenPanelParameters.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#include "WebOpenPanelParameters.h"
+
+#include "WebCoreArgumentCoders.h"
+
+namespace WebKit {
+
+PassRefPtr<WebOpenPanelParameters> WebOpenPanelParameters::create(const Data& data)
+{
+    return adoptRef(new WebOpenPanelParameters(data));
+}
+
+WebOpenPanelParameters::WebOpenPanelParameters(const Data& data)
+    : m_data(data)
+{
+}
+
+WebOpenPanelParameters::~WebOpenPanelParameters()
+{
+}
+
+void WebOpenPanelParameters::Data::encode(CoreIPC::ArgumentEncoder* encoder) const
+{
+    encoder->encode(CoreIPC::In(allowMultipleFiles, allowsDirectoryUpload, acceptTypes, filenames));
+}
+
+bool WebOpenPanelParameters::Data::decode(CoreIPC::ArgumentDecoder* decoder, Data& result)
+{
+    return decoder->decode(CoreIPC::Out(result.allowMultipleFiles, result.allowsDirectoryUpload, result.acceptTypes, result.filenames));
+}
+
+} // namespace WebCore
diff --git a/WebKit2/Shared/WebOpenPanelParameters.h b/WebKit2/Shared/WebOpenPanelParameters.h
new file mode 100644
index 0000000..e8546dc
--- /dev/null
+++ b/WebKit2/Shared/WebOpenPanelParameters.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#ifndef WebOpenPanelParameters_h
+#define WebOpenPanelParameters_h
+
+#include "APIObject.h"
+#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
+
+namespace CoreIPC {
+    class ArgumentDecoder;
+    class ArgumentEncoder;
+}
+
+namespace WebKit {
+
+class WebOpenPanelParameters : public APIObject {
+public:
+    static const Type APIType = TypeOpenPanelParameters;
+
+    struct Data {
+        void encode(CoreIPC::ArgumentEncoder*) const;
+        static bool decode(CoreIPC::ArgumentDecoder*, Data&);
+
+        bool allowMultipleFiles;
+        bool allowsDirectoryUpload;
+        String acceptTypes;
+        Vector<String> filenames;
+    };
+
+    static PassRefPtr<WebOpenPanelParameters> create(const Data&);
+    ~WebOpenPanelParameters();
+
+    bool allowMultipleFiles() const { return m_data.allowMultipleFiles; } 
+
+private:
+    explicit WebOpenPanelParameters(const Data&);
+
+    virtual Type type() const { return APIType; }
+
+    Data m_data;
+};
+
+} // namespace WebKit
+
+#endif // WebOpenPanelParameters_h
diff --git a/WebKit2/UIProcess/API/C/WKAPICast.h b/WebKit2/UIProcess/API/C/WKAPICast.h
index 93c28a6..b8ffcc4 100644
--- a/WebKit2/UIProcess/API/C/WKAPICast.h
+++ b/WebKit2/UIProcess/API/C/WKAPICast.h
@@ -53,6 +53,8 @@ class WebFramePolicyListenerProxy;
 class WebFrameProxy;
 class WebInspectorProxy;
 class WebNavigationData;
+class WebOpenPanelParameters;
+class WebOpenPanelResultListenerProxy;
 class WebPageGroup;
 class WebPageProxy;
 class WebPreferences;
@@ -70,6 +72,8 @@ WK_ADD_API_MAPPING(WKFormSubmissionListenerRef, WebFormSubmissionListenerProxy)
 WK_ADD_API_MAPPING(WKFramePolicyListenerRef, WebFramePolicyListenerProxy)
 WK_ADD_API_MAPPING(WKFrameRef, WebFrameProxy)
 WK_ADD_API_MAPPING(WKNavigationDataRef, WebNavigationData)
+WK_ADD_API_MAPPING(WKOpenPanelParametersRef, WebOpenPanelParameters)
+WK_ADD_API_MAPPING(WKOpenPanelResultListenerRef, WebOpenPanelResultListenerProxy)
 WK_ADD_API_MAPPING(WKPageGroupRef, WebPageGroup)
 WK_ADD_API_MAPPING(WKPageRef, WebPageProxy)
 WK_ADD_API_MAPPING(WKPreferencesRef, WebPreferences)
diff --git a/WebKit2/UIProcess/API/C/WKOpenPanelParameters.cpp b/WebKit2/UIProcess/API/C/WKOpenPanelParameters.cpp
new file mode 100644
index 0000000..3cf89cf
--- /dev/null
+++ b/WebKit2/UIProcess/API/C/WKOpenPanelParameters.cpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#include "WKOpenPanelParameters.h"
+
+#include "WKAPICast.h"
+#include "WebOpenPanelParameters.h"
+
+using namespace WebKit;
+
+WKTypeID WKOpenPanelParametersGetTypeID()
+{
+    return toAPI(WebOpenPanelParameters::APIType);
+}
+
+bool WKOpenPanelParametersGetAllowsMultipleFiles(WKOpenPanelParametersRef parametersRef)
+{
+    return toImpl(parametersRef)->allowMultipleFiles();
+}
diff --git a/WebKit2/UIProcess/API/C/WKOpenPanelParameters.h b/WebKit2/UIProcess/API/C/WKOpenPanelParameters.h
new file mode 100644
index 0000000..f32731c
--- /dev/null
+++ b/WebKit2/UIProcess/API/C/WKOpenPanelParameters.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#ifndef WKOpenPanelParameters_h
+#define WKOpenPanelParameters_h
+
+#include <WebKit2/WKBase.h>
+
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+WK_EXPORT WKTypeID WKOpenPanelParametersGetTypeID();
+
+WK_EXPORT bool WKOpenPanelParametersGetAllowsMultipleFiles(WKOpenPanelParametersRef parameters);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* WKOpenPanelParameters_h */
diff --git a/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.cpp b/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.cpp
new file mode 100644
index 0000000..5b143f2
--- /dev/null
+++ b/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#include "WKOpenPanelResultListener.h"
+
+#include "WKAPICast.h"
+#include "WebOpenPanelResultListenerProxy.h"
+
+using namespace WebKit;
+
+WKTypeID WKOpenPanelResultListenerGetTypeID()
+{
+    return toAPI(WebOpenPanelResultListenerProxy::APIType);
+}
+
+void WKOpenPanelResultListenerChooseFiles(WKOpenPanelResultListenerRef listenerRef, WKArrayRef fileURLsRef)
+{
+    toImpl(listenerRef)->chooseFiles(toImpl(fileURLsRef));
+}
+
+void WKOpenPanelResultListenerCancel(WKOpenPanelResultListenerRef listenerRef)
+{
+    toImpl(listenerRef)->cancel();
+}
diff --git a/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.h b/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.h
new file mode 100644
index 0000000..d581738
--- /dev/null
+++ b/WebKit2/UIProcess/API/C/WKOpenPanelResultListener.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#ifndef WKOpenPanelResultListener_h
+#define WKOpenPanelResultListener_h
+
+#include <WebKit2/WKBase.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+WK_EXPORT WKTypeID WKOpenPanelResultListenerGetTypeID();
+
+WK_EXPORT void WKOpenPanelResultListenerChooseFiles(WKOpenPanelResultListenerRef listener, WKArrayRef fileURLs);
+WK_EXPORT void WKOpenPanelResultListenerCancel(WKOpenPanelResultListenerRef listener);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* WKOpenPanelResultListener_h */
diff --git a/WebKit2/UIProcess/API/C/WKPage.h b/WebKit2/UIProcess/API/C/WKPage.h
index 8a82b81..7b2919a 100644
--- a/WebKit2/UIProcess/API/C/WKPage.h
+++ b/WebKit2/UIProcess/API/C/WKPage.h
@@ -154,7 +154,7 @@ typedef bool (*WKPageRunBeforeUnloadConfirmPanelCallback)(WKPageRef page, WKStri
 typedef void (*WKPageDidDrawCallback)(WKPageRef page, const void *clientInfo);
 typedef void (*WKPageDidScrollCallback)(WKPageRef page, const void *clientInfo);
 typedef unsigned long long (*WKPageExceededDatabaseQuotaCallback)(WKPageRef page, WKFrameRef frame, WKSecurityOriginRef origin, WKStringRef databaseName, WKStringRef displayName, unsigned long long currentQuota, unsigned long long currentUsage, unsigned long long expectedUsage, const void *clientInfo);
-
+typedef void (*WKPageRunOpenPanelCallback)(WKPageRef page, WKFrameRef frame, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void *clientInfo);
 
 struct WKPageUIClient {
     int                                                                 version;
@@ -182,6 +182,7 @@ struct WKPageUIClient {
     WKPageDidDrawCallback                                               didDraw;
     WKPageDidScrollCallback                                             pageDidScroll;
     WKPageExceededDatabaseQuotaCallback                                 exceededDatabaseQuota;
+    WKPageRunOpenPanelCallback                                          runOpenPanel;
 };
 typedef struct WKPageUIClient WKPageUIClient;
 
diff --git a/WebKit2/UIProcess/API/C/WebKit2.h b/WebKit2/UIProcess/API/C/WebKit2.h
index 70d8aaf..5c56722 100644
--- a/WebKit2/UIProcess/API/C/WebKit2.h
+++ b/WebKit2/UIProcess/API/C/WebKit2.h
@@ -43,6 +43,8 @@
 #include <WebKit2/WKMutableDictionary.h>
 #include <WebKit2/WKNavigationData.h>
 #include <WebKit2/WKNumber.h>
+#include <WebKit2/WKOpenPanelParameters.h>
+#include <WebKit2/WKOpenPanelResultListener.h>
 #include <WebKit2/WKPage.h>
 #include <WebKit2/WKPageGroup.h>
 #include <WebKit2/WKPreferences.h>
diff --git a/WebKit2/UIProcess/API/qt/qwkpage.cpp b/WebKit2/UIProcess/API/qt/qwkpage.cpp
index f445d2f..3f6d15e 100644
--- a/WebKit2/UIProcess/API/qt/qwkpage.cpp
+++ b/WebKit2/UIProcess/API/qt/qwkpage.cpp
@@ -360,7 +360,8 @@ QWKPage::QWKPage(QWKContext* context)
         0,  /* runBeforeUnloadConfirmPanel */
         0,  /* didDraw */
         0,  /* pageDidScroll */
-        0   /* exceededDatabaseQuota */
+        0,  /* exceededDatabaseQuota */
+        0   /* runOpenPanel */
     };
     WKPageSetPageUIClient(pageRef(), &uiClient);
 }
diff --git a/WebKit2/UIProcess/WebOpenPanelResultListenerProxy.cpp b/WebKit2/UIProcess/WebOpenPanelResultListenerProxy.cpp
new file mode 100644
index 0000000..de2d174
--- /dev/null
+++ b/WebKit2/UIProcess/WebOpenPanelResultListenerProxy.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#include "WebOpenPanelResultListenerProxy.h"
+
+#include "ImmutableArray.h"
+#include "WebPageProxy.h"
+#include <WebCore/KURL.h>
+#include <wtf/Vector.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+WebOpenPanelResultListenerProxy::WebOpenPanelResultListenerProxy(WebPageProxy* page)
+    : m_page(page)
+{
+}
+
+WebOpenPanelResultListenerProxy::~WebOpenPanelResultListenerProxy()
+{
+}
+
+void WebOpenPanelResultListenerProxy::chooseFiles(ImmutableArray* fileURLsArray)
+{
+    if (!m_page)
+        return;
+
+    size_t size = fileURLsArray->size();
+
+    Vector<String> filePaths;
+    filePaths.reserveInitialCapacity(size);
+
+    for (size_t i = 0; i < size; ++i) {
+        WebURL* webURL = fileURLsArray->at<WebURL>(i);
+        if (webURL) {
+            KURL url(KURL(), webURL->string()); 
+            filePaths.uncheckedAppend(url.fileSystemPath());
+        }
+    }
+
+    m_page->didChooseFilesForOpenPanel(filePaths);
+}
+
+void WebOpenPanelResultListenerProxy::cancel()
+{
+    if (!m_page)
+        return;
+
+    m_page->didCancelForOpenPanel();
+}
+
+void WebOpenPanelResultListenerProxy::invalidate()
+{
+    m_page = 0;
+}
+
+} // namespace WebKit
diff --git a/WebKit2/UIProcess/WebOpenPanelResultListenerProxy.h b/WebKit2/UIProcess/WebOpenPanelResultListenerProxy.h
new file mode 100644
index 0000000..ba931dc
--- /dev/null
+++ b/WebKit2/UIProcess/WebOpenPanelResultListenerProxy.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#ifndef WebOpenPanelResultListenerProxy_h
+#define WebOpenPanelResultListenerProxy_h
+
+#include "APIObject.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebKit {
+
+class ImmutableArray;
+class WebPageProxy;
+
+class WebOpenPanelResultListenerProxy : public APIObject {
+public:
+    static const Type APIType = TypeFramePolicyListener;
+
+    static PassRefPtr<WebOpenPanelResultListenerProxy> create(WebPageProxy* page)
+    {
+        return adoptRef(new WebOpenPanelResultListenerProxy(page));
+    }
+
+    virtual ~WebOpenPanelResultListenerProxy();
+
+    void chooseFiles(ImmutableArray*);
+    void cancel();
+
+    void invalidate();
+
+private:
+    WebOpenPanelResultListenerProxy(WebPageProxy*);
+
+    virtual Type type() const { return APIType; }
+
+    RefPtr<WebPageProxy> m_page;
+};
+
+} // namespace WebKit
+
+#endif // WebOpenPanelResultListenerProxy_h
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index a3f2fea..8f6c298 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -47,6 +47,7 @@
 #include "WebEvent.h"
 #include "WebFormSubmissionListenerProxy.h"
 #include "WebFramePolicyListenerProxy.h"
+#include "WebOpenPanelResultListenerProxy.h"
 #include "WebPageCreationParameters.h"
 #include "WebPageGroup.h"
 #include "WebPageGroupData.h"
@@ -231,6 +232,11 @@ void WebPageProxy::close()
     }
 #endif
 
+    if (m_openPanelResultListener) {
+        m_openPanelResultListener->invalidate();
+        m_openPanelResultListener = 0;
+    }
+
     m_pageTitle = String();
     m_toolTip = String();
 
@@ -1251,6 +1257,19 @@ void WebPageProxy::pageDidScroll()
     m_uiClient.pageDidScroll(this);
 }
 
+void WebPageProxy::runOpenPanel(uint64_t frameID, const WebOpenPanelParameters::Data& data)
+{
+    if (m_openPanelResultListener) {
+        m_openPanelResultListener->invalidate();
+        m_openPanelResultListener = 0;
+    }
+
+    m_openPanelResultListener = WebOpenPanelResultListenerProxy::create(this);
+
+    if (!m_uiClient.runOpenPanel(this, process()->webFrame(frameID), data, m_openPanelResultListener.get()))
+        didCancelForOpenPanel();
+}
+
 #if PLATFORM(QT)
 void WebPageProxy::didChangeContentsSize(const WebCore::IntSize& size)
 {
@@ -1433,6 +1452,29 @@ void WebPageProxy::contextMenuItemSelected(const WebContextMenuItemData& item)
     process()->send(Messages::WebPage::DidSelectItemFromActiveContextMenu(item), m_pageID);
 }
 
+void WebPageProxy::didChooseFilesForOpenPanel(const Vector<String>& fileURLs)
+{
+    if (!isValid())
+        return;
+
+    // FIXME: This also needs to send a sandbox extension for these paths.
+    process()->send(Messages::WebPage::DidChooseFilesForOpenPanel(fileURLs), m_pageID);
+
+    m_openPanelResultListener->invalidate();
+    m_openPanelResultListener = 0;
+}
+
+void WebPageProxy::didCancelForOpenPanel()
+{
+    if (!isValid())
+        return;
+
+    process()->send(Messages::WebPage::DidCancelForOpenPanel(), m_pageID);
+    
+    m_openPanelResultListener->invalidate();
+    m_openPanelResultListener = 0;
+}
+
 void WebPageProxy::registerEditCommand(PassRefPtr<WebEditCommandProxy> commandProxy, UndoOrRedo undoOrRedo)
 {
     m_pageClient->registerEditCommand(commandProxy, undoOrRedo);
@@ -1617,6 +1659,11 @@ void WebPageProxy::processDidCrash()
     }
 #endif
 
+    if (m_openPanelResultListener) {
+        m_openPanelResultListener->invalidate();
+        m_openPanelResultListener = 0;
+    }
+
     m_pageTitle = String();
     m_toolTip = String();
 
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index d8f0cb2..977ef2b 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -78,6 +78,7 @@ class NativeWebKeyboardEvent;
 class PageClient;
 class PlatformCertificateInfo;
 class StringPairVector;
+class WebOpenPanelResultListenerProxy;
 class WebBackForwardList;
 class WebBackForwardListItem;
 class WebContextMenuProxy;
@@ -270,8 +271,13 @@ public:
     void setResizesToContentsUsingLayoutSize(const WebCore::IntSize&);
 #endif
 
+    // Called by the WebContextMenuProxy.
     void contextMenuItemSelected(const WebContextMenuItemData&);
 
+    // Called by the WebOpenPanelResultListenerProxy.
+    void didChooseFilesForOpenPanel(const Vector<String>&);
+    void didCancelForOpenPanel();
+
     WebPageCreationParameters creationParameters(const WebCore::IntSize&) const;
 
 #if PLATFORM(QT)
@@ -338,6 +344,8 @@ private:
     void runBeforeUnloadConfirmPanel(const String& message, uint64_t frameID, bool& shouldClose);
     void didChangeViewportData(const WebCore::ViewportArguments&);
     void pageDidScroll();
+    void runOpenPanel(uint64_t frameID, const WebOpenPanelParameters::Data&);
+
 #if ENABLE(TILED_BACKING_STORE)
     void pageDidRequestScroll(const WebCore::IntSize&);
 #endif
@@ -438,6 +446,7 @@ private:
 
     RefPtr<WebPopupMenuProxy> m_activePopupMenu;
     RefPtr<WebContextMenuProxy> m_activeContextMenu;
+    RefPtr<WebOpenPanelResultListenerProxy> m_openPanelResultListener;
 
     double m_estimatedProgress;
 
diff --git a/WebKit2/UIProcess/WebPageProxy.messages.in b/WebKit2/UIProcess/WebPageProxy.messages.in
index 446b907..d450c14 100644
--- a/WebKit2/UIProcess/WebPageProxy.messages.in
+++ b/WebKit2/UIProcess/WebPageProxy.messages.in
@@ -50,6 +50,8 @@ messages -> WebPageProxy {
     CanRunBeforeUnloadConfirmPanel() -> (bool canRun)
     RunBeforeUnloadConfirmPanel(WTF::String message, uint64_t frameID) -> (bool shouldClose)
     PageDidScroll()
+    RunOpenPanel(uint64_t frameID, WebKit::WebOpenPanelParameters::Data parameters)
+
 #if ENABLE(TILED_BACKING_STORE)
     PageDidRequestScroll(WebCore::IntSize delta)
 #endif
diff --git a/WebKit2/UIProcess/WebUIClient.cpp b/WebKit2/UIProcess/WebUIClient.cpp
index 4782311..36fafae 100644
--- a/WebKit2/UIProcess/WebUIClient.cpp
+++ b/WebKit2/UIProcess/WebUIClient.cpp
@@ -29,6 +29,7 @@
 #include "NativeWebKeyboardEvent.h"
 #include "WKAPICast.h"
 #include "WebNumber.h"
+#include "WebOpenPanelResultListenerProxy.h"
 #include "WebPageProxy.h"
 #include <WebCore/FloatRect.h>
 #include <WebCore/IntSize.h>
@@ -245,4 +246,14 @@ unsigned long long WebUIClient::exceededDatabaseQuota(WebPageProxy* page, WebFra
     return m_client.exceededDatabaseQuota(toAPI(page), toAPI(frame), toAPI(origin), toAPI(databaseName.impl()), toAPI(databaseDisplayName.impl()), currentQuota, currentUsage, expectedUsage, m_client.clientInfo);
 }
 
+bool WebUIClient::runOpenPanel(WebPageProxy* page, WebFrameProxy* frame, const WebOpenPanelParameters::Data& parameterData, WebOpenPanelResultListenerProxy* listener)
+{
+    if (!m_client.runOpenPanel)
+        return false;
+
+    RefPtr<WebOpenPanelParameters> parameters = WebOpenPanelParameters::create(parameterData);
+    m_client.runOpenPanel(toAPI(page), toAPI(frame), toAPI(parameters.get()), toAPI(listener), m_client.clientInfo);
+    return true;
+}
+
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebUIClient.h b/WebKit2/UIProcess/WebUIClient.h
index fe701d2..477a81c 100644
--- a/WebKit2/UIProcess/WebUIClient.h
+++ b/WebKit2/UIProcess/WebUIClient.h
@@ -29,6 +29,7 @@
 #include "APIClient.h"
 #include "WKPage.h"
 #include "WebEvent.h"
+#include "WebOpenPanelParameters.h"
 #include <wtf/Forward.h>
 #include <wtf/PassRefPtr.h>
 
@@ -45,6 +46,7 @@ class NativeWebKeyboardEvent;
 class WebFrameProxy;
 class WebPageProxy;
 class WebSecurityOrigin;
+class WebOpenPanelResultListenerProxy;
 
 class WebUIClient : public APIClient<WKPageUIClient> {
 public:
@@ -80,6 +82,8 @@ public:
     void pageDidScroll(WebPageProxy*);
 
     unsigned long long exceededDatabaseQuota(WebPageProxy*, WebFrameProxy*, WebSecurityOrigin*, const String& databaseName, const String& databaseDisplayName, unsigned long long currentQuota, unsigned long long currentUsage, unsigned long long expectedUsage);
+
+    bool runOpenPanel(WebPageProxy*, WebFrameProxy*, const WebOpenPanelParameters::Data&, WebOpenPanelResultListenerProxy*);
 };
 
 } // namespace WebKit
diff --git a/WebKit2/WebKit2.pro b/WebKit2/WebKit2.pro
index c61c0b7..60d6ea5 100644
--- a/WebKit2/WebKit2.pro
+++ b/WebKit2/WebKit2.pro
@@ -261,6 +261,7 @@ HEADERS += \
     Shared/WebFindOptions.h \
     Shared/WebNavigationDataStore.h \
     Shared/WebNumber.h \
+    Shared/WebOpenPanelParameters.h \
     Shared/WebPageCreationParameters.h \
     Shared/WebPageGroupData.h \
     Shared/WebPopupItem.h \
@@ -288,6 +289,8 @@ HEADERS += \
     UIProcess/API/C/WKFrame.h \
     UIProcess/API/C/WKFramePolicyListener.h \
     UIProcess/API/C/WKInspector.h \
+    UIProcess/API/C/WKOpenPanelParameters.h \
+    UIProcess/API/C/WKOpenPanelResultListener.h \
     UIProcess/API/C/WKNavigationData.h \
     UIProcess/API/C/WKPage.h \
     UIProcess/API/C/WKPageGroup.h \
@@ -345,6 +348,7 @@ HEADERS += \
     UIProcess/WebLoaderClient.h \
     UIProcess/WebNavigationData.h \
     UIProcess/WebPageContextMenuClient.h \
+    UIProcess/WebOpenPanelResultListenerProxy.h \
     UIProcess/WebPageGroup.h \
     UIProcess/WebPageProxy.h \
     UIProcess/WebPolicyClient.h \
@@ -407,6 +411,7 @@ HEADERS += \
     WebProcess/WebPage/WebEditCommand.h \
     WebProcess/WebPage/WebFrame.h \
     WebProcess/WebPage/WebInspector.h \
+    WebProcess/WebPage/WebOpenPanelResultListener.h \
     WebProcess/WebPage/WebPage.h \
     WebProcess/WebPage/WebPageGroupProxy.h \
     WebProcess/WebProcess.h \
@@ -458,6 +463,7 @@ SOURCES += \
     Shared/WebEventConversion.cpp \
     Shared/WebKeyboardEvent.cpp \
     Shared/WebMouseEvent.cpp \
+    Shared/WebOpenPanelParameters.cpp \
     Shared/WebPageCreationParameters.cpp \
     Shared/WebPageGroupData.cpp \
     Shared/WebPlatformTouchPoint.cpp \
@@ -487,6 +493,8 @@ SOURCES += \
     UIProcess/API/C/WKFrame.cpp \
     UIProcess/API/C/WKFramePolicyListener.cpp \
     UIProcess/API/C/WKInspector.cpp \
+    UIProcess/API/C/WKOpenPanelParameters.cpp \
+    UIProcess/API/C/WKOpenPanelResultListener.cpp \
     UIProcess/API/C/WKNavigationData.cpp \
     UIProcess/API/C/WKPage.cpp \
     UIProcess/API/C/WKPageGroup.cpp \
@@ -536,6 +544,7 @@ SOURCES += \
     UIProcess/WebLoaderClient.cpp \
     UIProcess/WebNavigationData.cpp \
     UIProcess/WebPageContextMenuClient.cpp \
+    UIProcess/WebOpenPanelResultListenerProxy.cpp \
     UIProcess/WebPageGroup.cpp \
     UIProcess/WebPageProxy.cpp \
     UIProcess/WebPolicyClient.cpp \
@@ -617,9 +626,10 @@ SOURCES += \
     WebProcess/WebPage/WebEditCommand.cpp \
     WebProcess/WebPage/WebFrame.cpp \
     WebProcess/WebPage/WebInspector.cpp \
-    WebProcess/WebPage/qt/WebInspectorQt.cpp \
+    WebProcess/WebPage/WebOpenPanelResultListener.cpp \
     WebProcess/WebPage/WebPage.cpp \
     WebProcess/WebPage/WebPageGroupProxy.cpp \
+    WebProcess/WebPage/qt/WebInspectorQt.cpp \
     WebProcess/WebPage/qt/ChunkedUpdateDrawingAreaQt.cpp \
     WebProcess/WebPage/qt/TiledDrawingAreaQt.cpp \
     WebProcess/WebPage/qt/WebPageQt.cpp \
diff --git a/WebKit2/WebKit2.xcodeproj/project.pbxproj b/WebKit2/WebKit2.xcodeproj/project.pbxproj
index dffa5c9..cec3215 100644
--- a/WebKit2/WebKit2.xcodeproj/project.pbxproj
+++ b/WebKit2/WebKit2.xcodeproj/project.pbxproj
@@ -324,6 +324,8 @@
 		BC1A7C581136E19C00FB7167 /* ProcessLauncher.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1A7C571136E19C00FB7167 /* ProcessLauncher.h */; };
 		BC1B419811D41D570011E8DD /* WKBundlePagePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1B419711D41D570011E8DD /* WKBundlePagePrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		BC1DD7B2114DC396005ADAF3 /* WebCoreArgumentCoders.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1DD7B1114DC396005ADAF3 /* WebCoreArgumentCoders.h */; };
+		BC1DFE8F12B31CA8005DF730 /* WKOpenPanelResultListener.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1DFE8D12B31CA8005DF730 /* WKOpenPanelResultListener.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BC1DFEA412B31F87005DF730 /* WebOpenPanelResultListenerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = BC1DFEA212B31F87005DF730 /* WebOpenPanelResultListenerProxy.h */; };
 		BC204EE211C83E98008F3375 /* InjectedBundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC204EE011C83E98008F3375 /* InjectedBundle.cpp */; };
 		BC204EE311C83E98008F3375 /* InjectedBundle.h in Headers */ = {isa = PBXBuildFile; fileRef = BC204EE111C83E98008F3375 /* InjectedBundle.h */; };
 		BC204EE611C83EA9008F3375 /* InjectedBundleMac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC204EE511C83EA9008F3375 /* InjectedBundleMac.cpp */; };
@@ -444,6 +446,14 @@
 		BC8452A81162C80900CAB9B5 /* DrawingArea.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8452A61162C80900CAB9B5 /* DrawingArea.h */; };
 		BC84EB1812A7100C0083F2DA /* WebPreferencesMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC84EB1712A7100C0083F2DA /* WebPreferencesMac.mm */; };
 		BC857E8712B71EBB00EDEB2E /* WebPageProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC857E8512B71EBB00EDEB2E /* WebPageProxyMac.mm */; };
+		BC857F7E12B82CEE00EDEB2E /* WebOpenPanelResultListenerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC1DFEA312B31F87005DF730 /* WebOpenPanelResultListenerProxy.cpp */; };
+		BC857F8512B82D0B00EDEB2E /* WebOpenPanelResultListener.h in Headers */ = {isa = PBXBuildFile; fileRef = BC857F8312B82D0B00EDEB2E /* WebOpenPanelResultListener.h */; };
+		BC857F8612B82D0B00EDEB2E /* WebOpenPanelResultListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC857F8412B82D0B00EDEB2E /* WebOpenPanelResultListener.cpp */; };
+		BC857FB512B830E600EDEB2E /* WebOpenPanelParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = BC857FB312B830E600EDEB2E /* WebOpenPanelParameters.h */; };
+		BC857FB612B830E600EDEB2E /* WebOpenPanelParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC857FB412B830E600EDEB2E /* WebOpenPanelParameters.cpp */; };
+		BC857FE612B843D800EDEB2E /* WKOpenPanelParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = BC857FE412B843D800EDEB2E /* WKOpenPanelParameters.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		BC85806212B8505700EDEB2E /* WKOpenPanelResultListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC1DFE8E12B31CA8005DF730 /* WKOpenPanelResultListener.cpp */; };
+		BC85806312B8505700EDEB2E /* WKOpenPanelParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC857FE512B843D800EDEB2E /* WKOpenPanelParameters.cpp */; };
 		BC8699B5116AADAA002A925B /* WKView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8699B2116AADAA002A925B /* WKView.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		BC8699B6116AADAA002A925B /* WKView.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC8699B3116AADAA002A925B /* WKView.mm */; };
 		BC8699B7116AADAA002A925B /* WKViewInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = BC8699B4116AADAA002A925B /* WKViewInternal.h */; };
@@ -975,6 +985,10 @@
 		BC1A7C571136E19C00FB7167 /* ProcessLauncher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProcessLauncher.h; sourceTree = "<group>"; };
 		BC1B419711D41D570011E8DD /* WKBundlePagePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBundlePagePrivate.h; sourceTree = "<group>"; };
 		BC1DD7B1114DC396005ADAF3 /* WebCoreArgumentCoders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebCoreArgumentCoders.h; sourceTree = "<group>"; };
+		BC1DFE8D12B31CA8005DF730 /* WKOpenPanelResultListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKOpenPanelResultListener.h; sourceTree = "<group>"; };
+		BC1DFE8E12B31CA8005DF730 /* WKOpenPanelResultListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKOpenPanelResultListener.cpp; sourceTree = "<group>"; };
+		BC1DFEA212B31F87005DF730 /* WebOpenPanelResultListenerProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebOpenPanelResultListenerProxy.h; sourceTree = "<group>"; };
+		BC1DFEA312B31F87005DF730 /* WebOpenPanelResultListenerProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebOpenPanelResultListenerProxy.cpp; sourceTree = "<group>"; };
 		BC204EE011C83E98008F3375 /* InjectedBundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundle.cpp; sourceTree = "<group>"; };
 		BC204EE111C83E98008F3375 /* InjectedBundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundle.h; sourceTree = "<group>"; };
 		BC204EE511C83EA9008F3375 /* InjectedBundleMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleMac.cpp; sourceTree = "<group>"; };
@@ -1095,6 +1109,12 @@
 		BC8452A61162C80900CAB9B5 /* DrawingArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawingArea.h; sourceTree = "<group>"; };
 		BC84EB1712A7100C0083F2DA /* WebPreferencesMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebPreferencesMac.mm; sourceTree = "<group>"; };
 		BC857E8512B71EBB00EDEB2E /* WebPageProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebPageProxyMac.mm; sourceTree = "<group>"; };
+		BC857F8312B82D0B00EDEB2E /* WebOpenPanelResultListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebOpenPanelResultListener.h; sourceTree = "<group>"; };
+		BC857F8412B82D0B00EDEB2E /* WebOpenPanelResultListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebOpenPanelResultListener.cpp; sourceTree = "<group>"; };
+		BC857FB312B830E600EDEB2E /* WebOpenPanelParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebOpenPanelParameters.h; sourceTree = "<group>"; };
+		BC857FB412B830E600EDEB2E /* WebOpenPanelParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebOpenPanelParameters.cpp; sourceTree = "<group>"; };
+		BC857FE412B843D800EDEB2E /* WKOpenPanelParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKOpenPanelParameters.h; sourceTree = "<group>"; };
+		BC857FE512B843D800EDEB2E /* WKOpenPanelParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKOpenPanelParameters.cpp; sourceTree = "<group>"; };
 		BC8699B2116AADAA002A925B /* WKView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKView.h; sourceTree = "<group>"; };
 		BC8699B3116AADAA002A925B /* WKView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKView.mm; sourceTree = "<group>"; };
 		BC8699B4116AADAA002A925B /* WKViewInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKViewInternal.h; sourceTree = "<group>"; };
@@ -1599,6 +1619,8 @@
 				BC33DD671238464600360F3F /* WebNumber.h */,
 				BC5744ED12638FB3006F0F12 /* WebPopupItem.cpp */,
 				BC5744EE12638FB3006F0F12 /* WebPopupItem.h */,
+				BC857FB412B830E600EDEB2E /* WebOpenPanelParameters.cpp */,
+				BC857FB312B830E600EDEB2E /* WebOpenPanelParameters.h */,
 				C06C6093124C14430001682F /* WebPageCreationParameters.cpp */,
 				C06C6094124C14430001682F /* WebPageCreationParameters.h */,
 				BC7B625112A43C9600D174A4 /* WebPageGroupData.cpp */,
@@ -1841,6 +1863,8 @@
 				1C8E281F1275D15400BC7BD0 /* WebInspector.cpp */,
 				1C8E281E1275D15400BC7BD0 /* WebInspector.h */,
 				1C8E2A1C1277833F00BC7BD0 /* WebInspector.messages.in */,
+				BC857F8412B82D0B00EDEB2E /* WebOpenPanelResultListener.cpp */,
+				BC857F8312B82D0B00EDEB2E /* WebOpenPanelResultListener.h */,
 				BC963D6A113DD19200574BE2 /* WebPage.cpp */,
 				BC032D8B10F437A00058C15A /* WebPage.h */,
 				C0CE72581247E4DA00BC0EC4 /* WebPage.messages.in */,
@@ -1915,6 +1939,8 @@
 				BC59534010FC04520098F82D /* WebLoaderClient.h */,
 				BCF69FA11176D01400471A52 /* WebNavigationData.cpp */,
 				BCF69FA01176D01400471A52 /* WebNavigationData.h */,
+				BC1DFEA312B31F87005DF730 /* WebOpenPanelResultListenerProxy.cpp */,
+				BC1DFEA212B31F87005DF730 /* WebOpenPanelResultListenerProxy.h */,
 				5153569A1291B1D2000749DC /* WebPageContextMenuClient.cpp */,
 				5153569B1291B1D2000749DC /* WebPageContextMenuClient.h */,
 				BC7B6205129A0A6700D174A4 /* WebPageGroup.cpp */,
@@ -1975,6 +2001,10 @@
 				1AB7D78B1288CD9A00CFD08C /* WKDownload.h */,
 				BCE469571214EDF4000B98EB /* WKFormSubmissionListener.cpp */,
 				BCE469581214EDF4000B98EB /* WKFormSubmissionListener.h */,
+				BC1DFE8E12B31CA8005DF730 /* WKOpenPanelResultListener.cpp */,
+				BC1DFE8D12B31CA8005DF730 /* WKOpenPanelResultListener.h */,
+				BC857FE512B843D800EDEB2E /* WKOpenPanelParameters.cpp */,
+				BC857FE412B843D800EDEB2E /* WKOpenPanelParameters.h */,
 				BCD01398110FA420003B8A67 /* WKFrame.cpp */,
 				BCD01397110FA420003B8A67 /* WKFrame.h */,
 				BCB9F6A41123DD0D00A137E0 /* WKFramePolicyListener.cpp */,
@@ -2718,6 +2748,11 @@
 				F62A766212B1ABED0005F1B6 /* WKDatabaseManager.h in Headers */,
 				F62A76B712B1B25F0005F1B6 /* WebDatabaseManagerMessages.h in Headers */,
 				F62A76B912B1B25F0005F1B6 /* WebDatabaseManagerProxyMessages.h in Headers */,
+				BC1DFE8F12B31CA8005DF730 /* WKOpenPanelResultListener.h in Headers */,
+				BC1DFEA412B31F87005DF730 /* WebOpenPanelResultListenerProxy.h in Headers */,
+				BC857F8512B82D0B00EDEB2E /* WebOpenPanelResultListener.h in Headers */,
+				BC857FB512B830E600EDEB2E /* WebOpenPanelParameters.h in Headers */,
+				BC857FE612B843D800EDEB2E /* WKOpenPanelParameters.h in Headers */,
 				1A4A9AA812B7E796008FE984 /* WKTextInputWindowController.h in Headers */,
 				1A4A9C5612B816CF008FE984 /* NetscapePluginModule.h in Headers */,
 				1A4A9F3312B844E2008FE984 /* PluginQuirks.h in Headers */,
@@ -3135,6 +3170,11 @@
 				F62A76B612B1B25F0005F1B6 /* WebDatabaseManagerMessageReceiver.cpp in Sources */,
 				F62A76B812B1B25F0005F1B6 /* WebDatabaseManagerProxyMessageReceiver.cpp in Sources */,
 				BC857E8712B71EBB00EDEB2E /* WebPageProxyMac.mm in Sources */,
+				BC857F7E12B82CEE00EDEB2E /* WebOpenPanelResultListenerProxy.cpp in Sources */,
+				BC857F8612B82D0B00EDEB2E /* WebOpenPanelResultListener.cpp in Sources */,
+				BC857FB612B830E600EDEB2E /* WebOpenPanelParameters.cpp in Sources */,
+				BC85806212B8505700EDEB2E /* WKOpenPanelResultListener.cpp in Sources */,
+				BC85806312B8505700EDEB2E /* WKOpenPanelParameters.cpp in Sources */,
 				1A4A9AA912B7E796008FE984 /* WKTextInputWindowController.mm in Sources */,
 				1A4A9C5512B816CF008FE984 /* NetscapePluginModule.cpp in Sources */,
 				1A4A9C9A12B821CD008FE984 /* NetscapePluginModuleMac.mm in Sources */,
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
index c1925ba..a112c55 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
@@ -35,6 +35,8 @@
 #include "WebCoreArgumentCoders.h"
 #include "WebFrame.h"
 #include "WebFrameLoaderClient.h"
+#include "WebOpenPanelParameters.h"
+#include "WebOpenPanelResultListener.h"
 #include "WebPage.h"
 #include "WebPageCreationParameters.h"
 #include "WebPageProxyMessages.h"
@@ -508,9 +510,26 @@ void WebChromeClient::cancelGeolocationPermissionRequestForFrame(Frame*, Geoloca
     notImplemented();
 }
 
-void WebChromeClient::runOpenPanel(Frame*, PassRefPtr<FileChooser>)
+void WebChromeClient::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> prpFileChooser)
 {
-    notImplemented();
+    if (m_page->activeOpenPanelResultListener())
+        return;
+
+    RefPtr<FileChooser> fileChooser = prpFileChooser;
+
+    m_page->setActiveOpenPanelResultListener(WebOpenPanelResultListener::create(m_page, fileChooser.get()));
+    
+    WebOpenPanelParameters::Data parameters;
+    parameters.allowMultipleFiles = fileChooser->allowsMultipleFiles();
+#if ENABLE(DIRECTORY_UPLOAD)
+    parameters.allowsDirectoryUpload = fileChooser->allowsDirectoryUpload();
+#else
+    parameters.allowsDirectoryUpload = false;
+#endif
+    parameters.acceptTypes = fileChooser->acceptTypes();
+    parameters.filenames = fileChooser->filenames();
+
+    m_page->send(Messages::WebPageProxy::RunOpenPanel(static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame()->frameID(), parameters));
 }
 
 void WebChromeClient::chooseIconForFiles(const Vector<String>&, FileChooser*)
diff --git a/WebKit2/WebProcess/WebPage/WebOpenPanelResultListener.cpp b/WebKit2/WebProcess/WebPage/WebOpenPanelResultListener.cpp
new file mode 100644
index 0000000..d42e313
--- /dev/null
+++ b/WebKit2/WebProcess/WebPage/WebOpenPanelResultListener.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#include "WebOpenPanelResultListener.h"
+
+namespace WebKit {
+
+PassRefPtr<WebOpenPanelResultListener> WebOpenPanelResultListener::create(WebPage* page, PassRefPtr<WebCore::FileChooser> fileChooser)
+{
+    return adoptRef(new WebOpenPanelResultListener(page, fileChooser));
+}
+
+WebOpenPanelResultListener::WebOpenPanelResultListener(WebPage* page, PassRefPtr<WebCore::FileChooser> fileChooser)
+    : m_page(page)
+    , m_fileChooser(fileChooser)
+{
+}
+
+WebOpenPanelResultListener::~WebOpenPanelResultListener()
+{
+}
+
+void WebOpenPanelResultListener::didChooseFiles(const Vector<String>& files)
+{
+    m_fileChooser->chooseFiles(files);
+}
+
+} // namespace WebKit
diff --git a/WebKit2/WebProcess/WebPage/WebOpenPanelResultListener.h b/WebKit2/WebProcess/WebPage/WebOpenPanelResultListener.h
new file mode 100644
index 0000000..073d66a
--- /dev/null
+++ b/WebKit2/WebProcess/WebPage/WebOpenPanelResultListener.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#ifndef WebOpenPanelResultListener_h
+#define WebOpenPanelResultListener_h
+
+#include <wtf/RefCounted.h>
+#include <WebCore/FileChooser.h>
+
+namespace WebKit {
+
+class WebPage;
+
+class WebOpenPanelResultListener : public RefCounted<WebOpenPanelResultListener> {
+public:
+    static PassRefPtr<WebOpenPanelResultListener> create(WebPage*, PassRefPtr<WebCore::FileChooser>);
+    ~WebOpenPanelResultListener();
+
+    void disconnectFromPage() { m_page = 0; }
+    void didChooseFiles(const Vector<String>&);
+
+private:
+    WebOpenPanelResultListener(WebPage*, PassRefPtr<WebCore::FileChooser>);
+
+    WebPage* m_page;
+    RefPtr<WebCore::FileChooser> m_fileChooser;
+};
+
+} // namespace WebKit
+
+
+#endif // WebOpenPanelResultListener_h
diff --git a/WebKit2/WebProcess/WebPage/WebPage.cpp b/WebKit2/WebProcess/WebPage/WebPage.cpp
index e8c77ed..de4f099 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.cpp
+++ b/WebKit2/WebProcess/WebPage/WebPage.cpp
@@ -42,6 +42,7 @@
 #include "WebContextMenuClient.h"
 #include "WebContextMessages.h"
 #include "WebCoreArgumentCoders.h"
+#include "WebOpenPanelResultListener.h"
 #include "WebDragClient.h"
 #include "WebEditorClient.h"
 #include "WebEvent.h"
@@ -328,6 +329,11 @@ void WebPage::close()
         m_activePopupMenu = 0;
     }
 
+    if (m_activeOpenPanelResultListener) {
+        m_activeOpenPanelResultListener->disconnectFromPage();
+        m_activeOpenPanelResultListener = 0;
+    }
+
     m_sandboxExtensionTracker.invalidate();
 
     m_mainFrame->coreFrame()->loader()->detachFromParent();
@@ -1065,6 +1071,11 @@ void WebPage::setActivePopupMenu(WebPopupMenu* menu)
     m_activePopupMenu = menu;
 }
 
+void WebPage::setActiveOpenPanelResultListener(PassRefPtr<WebOpenPanelResultListener> openPanelResultListener)
+{
+    m_activeOpenPanelResultListener = openPanelResultListener;
+}
+
 bool WebPage::findStringFromInjectedBundle(const String& target, FindOptions options)
 {
     return m_page->findString(target, options);
@@ -1094,6 +1105,20 @@ void WebPage::didChangeSelectedIndexForActivePopupMenu(int32_t newIndex)
     m_activePopupMenu = 0;
 }
 
+void WebPage::didChooseFilesForOpenPanel(const Vector<String>& files)
+{
+    if (!m_activeOpenPanelResultListener)
+        return;
+
+    m_activeOpenPanelResultListener->didChooseFiles(files);
+    m_activeOpenPanelResultListener = 0;
+}
+
+void WebPage::didCancelForOpenPanel()
+{
+    m_activeOpenPanelResultListener = 0;
+}
+
 void WebPage::didSelectItemFromActiveContextMenu(const WebContextMenuItemData& item)
 {
     ASSERT(m_contextMenu);
diff --git a/WebKit2/WebProcess/WebPage/WebPage.h b/WebKit2/WebProcess/WebPage/WebPage.h
index cb10bba..bc87a99 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.h
+++ b/WebKit2/WebProcess/WebPage/WebPage.h
@@ -77,6 +77,7 @@ class WebFrame;
 class WebInspector;
 class WebKeyboardEvent;
 class WebMouseEvent;
+class WebOpenPanelResultListener;
 class WebPageGroupProxy;
 class WebPopupMenu;
 class WebWheelEvent;
@@ -136,6 +137,9 @@ public:
     bool isInRedo() const { return m_isInRedo; }
 
     void setActivePopupMenu(WebPopupMenu*);
+    
+    WebOpenPanelResultListener* activeOpenPanelResultListener() const { return m_activeOpenPanelResultListener.get(); }
+    void setActiveOpenPanelResultListener(PassRefPtr<WebOpenPanelResultListener>);
 
     // -- Called from WebProcess.
     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
@@ -327,6 +331,9 @@ private:
 
     void didChangeSelectedIndexForActivePopupMenu(int32_t newIndex);
 
+    void didChooseFilesForOpenPanel(const Vector<String>&);
+    void didCancelForOpenPanel();
+
 #if ENABLE(CONTEXT_MENUS)
     void didSelectItemFromActiveContextMenu(const WebContextMenuItemData&);
 #endif
@@ -389,6 +396,7 @@ private:
 #endif
     RefPtr<WebPopupMenu> m_activePopupMenu;
     RefPtr<WebContextMenu> m_contextMenu;
+    RefPtr<WebOpenPanelResultListener> m_activeOpenPanelResultListener;
 
     SandboxExtensionTracker m_sandboxExtensionTracker;
     uint64_t m_pageID;
diff --git a/WebKit2/WebProcess/WebPage/WebPage.messages.in b/WebKit2/WebProcess/WebPage/WebPage.messages.in
index 01c279a..0380b67 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.messages.in
+++ b/WebKit2/WebProcess/WebPage/WebPage.messages.in
@@ -54,7 +54,6 @@ messages -> WebPage {
     GetSourceForFrame(uint64_t frameID, uint64_t callbackID)
     RunJavaScriptInMainFrame(WTF::String script, uint64_t callbackID)
 
-
     PreferencesDidChange(WebKit::WebPreferencesStore store)
 
     SetUserAgent(WTF::String userAgent)
@@ -91,6 +90,10 @@ messages -> WebPage {
     # Context menu.
     DidSelectItemFromActiveContextMenu(WebKit::WebContextMenuItemData menuItem);
 
+    # Open panel.
+    DidChooseFilesForOpenPanel(Vector<WTF::String> fileURLs)
+    DidCancelForOpenPanel()
+
     SetWindowResizerSize(WebCore::IntSize intersectsView)
 
 #if PLATFORM(MAC)
@@ -103,10 +106,12 @@ messages -> WebPage {
     CharacterIndexForPoint(WebCore::IntPoint point) -> (uint64_t result)
     FirstRectForCharacterRange(uint64_t location, uint64_t length) -> (WebCore::IntRect resultRect)
 #endif
-	// This is a dummy message to avoid breaking the build for platforms that don't require 
-	// synchronous messages.
-	Dummy() -> (bool dummyReturn)
+
 #if PLATFORM(QT)
     FindZoomableAreaForPoint(WebCore::IntPoint point)
 #endif
+
+    // This is a dummy message to avoid breaking the build for platforms that don't require 
+    // synchronous messages.
+    Dummy() -> (bool dummyReturn)
 }
diff --git a/WebKit2/win/WebKit2.vcproj b/WebKit2/win/WebKit2.vcproj
index 14db338..9c174d6 100755
--- a/WebKit2/win/WebKit2.vcproj
+++ b/WebKit2/win/WebKit2.vcproj
@@ -571,6 +571,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\Shared\WebOpenPanelParameters.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Shared\WebOpenPanelParameters.h"
+				>
+			</File>
+			<File
 				RelativePath="..\Shared\WebPageCreationParameters.cpp"
 				>
 			</File>
@@ -1362,6 +1370,14 @@
 					>
 				</File>
 				<File
+					RelativePath="..\WebProcess\WebPage\WebOpenPanelResultListener.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\WebProcess\WebPage\WebOpenPanelResultListener.h"
+					>
+				</File>
+				<File
 					RelativePath="..\WebProcess\WebPage\WebPage.cpp"
 					>
 				</File>
@@ -2063,6 +2079,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\UIProcess\WebOpenPanelResultListenerProxy.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\UIProcess\WebOpenPanelResultListenerProxy.h"
+				>
+			</File>
+			<File
 				RelativePath="..\UIProcess\WebPageContextMenuClient.cpp"
 				>
 			</File>
@@ -2273,6 +2297,22 @@
 						>
 					</File>
 					<File
+						RelativePath="..\UIProcess\API\C\WKOpenPanelParameters.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\UIProcess\API\C\WKOpenPanelParameters.h"
+						>
+					</File>
+					<File
+						RelativePath="..\UIProcess\API\C\WKOpenPanelResultListener.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\UIProcess\API\C\WKOpenPanelResultListener.h"
+						>
+					</File>
+					<File
 						RelativePath="..\UIProcess\API\C\WKPage.cpp"
 						>
 					</File>
diff --git a/WebKit2/win/WebKit2Generated.make b/WebKit2/win/WebKit2Generated.make
index 32977b8..94b7a1a 100644
--- a/WebKit2/win/WebKit2Generated.make
+++ b/WebKit2/win/WebKit2Generated.make
@@ -49,6 +49,8 @@ all:
     xcopy /y /d "..\UIProcess\API\c\WKInspector.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
     xcopy /y /d "..\UIProcess\API\C\WKNativeEvent.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
     xcopy /y /d "..\UIProcess\API\C\WKNavigationData.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
+    xcopy /y /d "..\UIProcess\API\C\WKOpenPanelParameters.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
+    xcopy /y /d "..\UIProcess\API\C\WKOpenPanelResultListener.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
     xcopy /y /d "..\UIProcess\API\C\WKPage.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
     xcopy /y /d "..\UIProcess\API\C\WKPageGroup.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
     xcopy /y /d "..\UIProcess\API\C\WKPreferences.h" "$(WEBKITOUTPUTDIR)\include\WebKit2"
diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
index c115679..afc65aa 100644
--- a/WebKitTools/ChangeLog
+++ b/WebKitTools/ChangeLog
@@ -1,3 +1,22 @@
+2010-12-15  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Anders Carlsson.
+
+        WebKit2: Can't add files to an <input type=file>
+        https://bugs.webkit.org/show_bug.cgi?id=51087
+
+        * MiniBrowser/mac/BrowserWindowController.m:
+        (runOpenPanel):
+        (-[BrowserWindowController awakeFromNib]):
+        Add simple implementation of runOpenPanel callback.
+
+        * MiniBrowser/win/BrowserView.cpp:
+        (BrowserView::create):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::createOtherPage):
+        (WTR::TestController::initialize):
+        Stub out runOpenPanel callback. 
+
 2010-12-14  Eric Seidel  <eric at webkit.org>
 
         Reviewed by Adam Barth.
diff --git a/WebKitTools/MiniBrowser/mac/BrowserWindowController.m b/WebKitTools/MiniBrowser/mac/BrowserWindowController.m
index c900a27..b813f29 100644
--- a/WebKitTools/MiniBrowser/mac/BrowserWindowController.m
+++ b/WebKitTools/MiniBrowser/mac/BrowserWindowController.m
@@ -535,6 +535,34 @@ static bool runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKF
     return button == NSAlertFirstButtonReturn;
 }
 
+static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
+{
+    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
+    [openPanel setAllowsMultipleSelection:WKOpenPanelParametersGetAllowsMultipleFiles(parameters)];
+
+    WKRetain(listener);
+
+    [openPanel beginSheetModalForWindow:[(BrowserWindowController *)clientInfo window] completionHandler:^(NSInteger result) {
+        if (result == NSFileHandlingPanelOKButton) {
+            WKMutableArrayRef fileURLs = WKMutableArrayCreate();
+
+            NSURL *nsURL;
+            for (nsURL in [openPanel URLs]) {
+                WKURLRef wkURL = WKURLCreateWithCFURL((CFURLRef)nsURL);
+                WKArrayAppendItem(fileURLs, wkURL);
+                WKRelease(wkURL);
+            }
+
+            WKOpenPanelResultListenerChooseFiles(listener, fileURLs);
+
+            WKRelease(fileURLs);
+        } else
+            WKOpenPanelResultListenerCancel(listener);
+        
+        WKRelease(listener);
+    }];
+}
+
 - (void)awakeFromNib
 {
     _webView = [[WKView alloc] initWithFrame:[containerView frame] contextRef:_context];
@@ -607,7 +635,8 @@ static bool runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKF
         runBeforeUnloadConfirmPanel,
         0,          /* didDraw */
         0,          /* pageDidScroll */
-        0           /* exceededDatabaseQuota */
+        0,          /* exceededDatabaseQuota */
+        runOpenPanel
     };
     WKPageSetPageUIClient(_webView.pageRef, &uiClient);
 }
diff --git a/WebKitTools/MiniBrowser/win/BrowserView.cpp b/WebKitTools/MiniBrowser/win/BrowserView.cpp
index c89e10c..a93ca96 100644
--- a/WebKitTools/MiniBrowser/win/BrowserView.cpp
+++ b/WebKitTools/MiniBrowser/win/BrowserView.cpp
@@ -117,7 +117,8 @@ void BrowserView::create(RECT webViewRect, BrowserWindow* parentWindow)
         0,          /* runBeforeUnloadConfirmPanel */
         0,          /* didDraw */
         0,          /* pageDidScroll */
-        0           /* exceededDatabaseQuota */
+        0,          /* exceededDatabaseQuota */
+        0           /* runOpenPanel */
     };
 
     WKPageSetPageUIClient(WKViewGetPage(m_webView), &uiClient);
diff --git a/WebKitTools/WebKitTestRunner/TestController.cpp b/WebKitTools/WebKitTestRunner/TestController.cpp
index 8f37387..a8ad1f2 100644
--- a/WebKitTools/WebKitTestRunner/TestController.cpp
+++ b/WebKitTools/WebKitTestRunner/TestController.cpp
@@ -136,7 +136,8 @@ static WKPageRef createOtherPage(WKPageRef oldPage, WKDictionaryRef, WKEventModi
         0, // runBeforeUnloadConfirmPanel
         0, // didDraw
         0, // pageDidScroll
-        0  // exceededDatabaseQuota
+        0, // exceededDatabaseQuota
+        0  // runOpenPanel
     };
     WKPageSetPageUIClient(newPage, &otherPageUIClient);
 
@@ -238,7 +239,8 @@ void TestController::initialize(int argc, const char* argv[])
         0, // runBeforeUnloadConfirmPanel
         0, // didDraw
         0, // pageDidScroll
-        0  // exceededDatabaseQuota
+        0, // exceededDatabaseQuota
+        0  // runOpenPanel
     };
     WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient);
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list