From e2e0d94510f30f4cdbbe11d03e0228759b7ea996 Mon Sep 17 00:00:00 2001 From: "darin@apple.com" Date: Tue, 6 Nov 2007 18:43:38 +0000 Subject: [PATCH] Reviewed by Adam and Steve. - added hooks needed to implement showModalDialog on Windows * Interfaces/IWebUIDelegate.idl: Added canRunModal, createModalDialog, and runModal functions to the end of IWebUIDelegate3. * WebChromeClient.h: Added uiDelegate and uiDelegate2 helper functions, so it's easier to write client functions. * WebChromeClient.cpp: (WebChromeClient::createWindow): Implemented dialog case. Calls IWebUIDelegate3. (WebChromeClient::canRunModal): Implemented. Calls IWebUIDelegate3. (WebChromeClient::runModal): Ditto. (WebChromeClient::uiDelegate): Added. (WebChromeClient::uiDelegate2): Added. (WebChromeClient::uiDelegate3): Added. git-svn-id: https://svn.webkit.org/repository/webkit/trunk@27481 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- WebKit/win/ChangeLog | 19 ++++++++ WebKit/win/Interfaces/IWebUIDelegate.idl | 17 +++++++ WebKit/win/WebChromeClient.cpp | 56 ++++++++++++++++-------- WebKit/win/WebChromeClient.h | 10 +++++ 4 files changed, 83 insertions(+), 19 deletions(-) diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog index 90c3e1fe6522..6f7d9c177b91 100644 --- a/WebKit/win/ChangeLog +++ b/WebKit/win/ChangeLog @@ -1,3 +1,22 @@ +2007-11-06 Darin Adler + + Reviewed by Adam and Steve. + + - added hooks needed to implement showModalDialog on Windows + + * Interfaces/IWebUIDelegate.idl: Added canRunModal, createModalDialog, + and runModal functions to the end of IWebUIDelegate3. + + * WebChromeClient.h: Added uiDelegate and uiDelegate2 helper functions, + so it's easier to write client functions. + * WebChromeClient.cpp: + (WebChromeClient::createWindow): Implemented dialog case. Calls IWebUIDelegate3. + (WebChromeClient::canRunModal): Implemented. Calls IWebUIDelegate3. + (WebChromeClient::runModal): Ditto. + (WebChromeClient::uiDelegate): Added. + (WebChromeClient::uiDelegate2): Added. + (WebChromeClient::uiDelegate3): Added. + 2007-11-06 Alexey Proskuryakov Rubber-stamped by Adam Roben. diff --git a/WebKit/win/Interfaces/IWebUIDelegate.idl b/WebKit/win/Interfaces/IWebUIDelegate.idl index 8774668e896a..e4fc3418c822 100644 --- a/WebKit/win/Interfaces/IWebUIDelegate.idl +++ b/WebKit/win/Interfaces/IWebUIDelegate.idl @@ -781,3 +781,20 @@ interface IWebUIDelegate2 : IWebUIDelegate HRESULT webViewPrintingMarginRect([in] IWebView* webView, [out, retval] RECT* rect); } + +/*! + @category WebUIDelegate3 + @discussion A class that supplements the IWebUIDelegate interface +*/ +[ + object, + oleautomation, + uuid(DD544D90-C233-4562-8EFD-A8D3A0DEBC19), + pointer_default(unique) +] +interface IWebUIDelegate3 : IWebUIDelegate2 +{ + HRESULT canRunModal([in] IWebView* webView, [out, retval] BOOL* canRunBoolean); + HRESULT createModalDialog([in] IWebView* sender, [in] IWebURLRequest* request, [out, retval] IWebView** newWebView); + HRESULT runModal([in] IWebView* webView); +} diff --git a/WebKit/win/WebChromeClient.cpp b/WebKit/win/WebChromeClient.cpp index b090db38354b..eab7177942e5 100644 --- a/WebKit/win/WebChromeClient.cpp +++ b/WebKit/win/WebChromeClient.cpp @@ -134,19 +134,26 @@ void WebChromeClient::takeFocus(FocusDirection direction) Page* WebChromeClient::createWindow(Frame*, const FrameLoadRequest& frameLoadRequest, const WindowFeatures& features) { + if (features.dialog) { + COMPtr delegate = uiDelegate3(); + if (!delegate) + return 0; + COMPtr request(AdoptCOM, WebMutableURLRequest::createInstance(frameLoadRequest.resourceRequest())); + COMPtr dialog; + if (FAILED(delegate->createModalDialog(m_webView, request.get(), &dialog))) + return 0; + return core(dialog.get()); + } + Page* page = 0; IWebUIDelegate* uiDelegate = 0; IWebMutableURLRequest* request = WebMutableURLRequest::createInstance(frameLoadRequest.resourceRequest()); if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { - if (features.dialog) { - notImplemented(); - } else { - IWebView* webView = 0; - if (SUCCEEDED(uiDelegate->createWebViewWithRequest(m_webView, request, &webView))) { - page = core(webView); - webView->Release(); - } + IWebView* webView = 0; + if (SUCCEEDED(uiDelegate->createWebViewWithRequest(m_webView, request, &webView))) { + page = core(webView); + webView->Release(); } uiDelegate->Release(); @@ -167,22 +174,16 @@ void WebChromeClient::show() bool WebChromeClient::canRunModal() { - bool result = false; - IWebUIDelegate* uiDelegate = 0; - if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { - notImplemented(); - uiDelegate->Release(); - } + BOOL result = FALSE; + if (COMPtr delegate = uiDelegate3()) + delegate->canRunModal(m_webView, &result); return result; } void WebChromeClient::runModal() { - IWebUIDelegate* uiDelegate = 0; - if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { - notImplemented(); - uiDelegate->Release(); - } + if (COMPtr delegate = uiDelegate3()) + delegate->runModal(m_webView); } void WebChromeClient::setToolbarsVisible(bool visible) @@ -463,3 +464,20 @@ bool WebChromeClient::runDatabaseSizeLimitPrompt(Frame*, const String&) notImplemented(); return false; } + +COMPtr WebChromeClient::uiDelegate() +{ + COMPtr delegate; + m_webView->uiDelegate(&delegate); + return delegate; +} + +COMPtr WebChromeClient::uiDelegate2() +{ + return COMPtr(Query, uiDelegate()); +} + +COMPtr WebChromeClient::uiDelegate3() +{ + return COMPtr(Query, uiDelegate()); +} diff --git a/WebKit/win/WebChromeClient.h b/WebKit/win/WebChromeClient.h index 3501bae736c0..b434bcc38ee7 100644 --- a/WebKit/win/WebChromeClient.h +++ b/WebKit/win/WebChromeClient.h @@ -24,11 +24,16 @@ */ #include +#include #include #include class WebView; +interface IWebUIDelegate; +interface IWebUIDelegate2; +interface IWebUIDelegate3; + class WebChromeClient : public WebCore::ChromeClient { public: WebChromeClient(WebView*); @@ -94,6 +99,11 @@ public: virtual void print(WebCore::Frame*); virtual bool runDatabaseSizeLimitPrompt(WebCore::Frame*, const WebCore::String& origin); + private: + COMPtr uiDelegate(); + COMPtr uiDelegate2(); + COMPtr uiDelegate3(); + WebView* m_webView; }; -- 2.36.0