Commit 11947c47 authored by andersca@apple.com's avatar andersca@apple.com

2011-03-12 Anders Carlsson <andersca@apple.com>

        Reviewed by Sam Weinig.

        Should be able to download a PDF to the Downloads folder
        https://bugs.webkit.org/show_bug.cgi?id=56256

        * UIProcess/API/C/WKPage.h:
        Add WKPageSaveDataToFileInDownloadsFolderCallback to the UI client.

        * UIProcess/API/mac/PDFViewController.h:
        * UIProcess/API/mac/PDFViewController.mm:
        (-[WKPDFView _applyPDFPreferences]):
        (-[WKPDFView _updatePreferences:]):
        Use new PDFViewController::page getter.

        (-[WKPDFView PDFViewSavePDFToDownloadFolder:]):
        Call PDFViewController::savePDFToDownloadsFolder.

        (WebKit::releaseCFData):
        (WebKit::PDFViewController::savePDFToDownloadsFolder):
        Create a WebData that wraps the CFData, then pass it along to
        WebPageProxy::saveDataToFileInDownloadsFolder.

        * UIProcess/WebPageProxy.cpp:
        (WebKit::WebPageProxy::saveDataToFileInDownloadsFolder):
        Call WebUIClient::saveDataToFileInDownloadsFolder.

        (WebKit::WebUIClient::saveDataToFileInDownloadsFolder):
        * UIProcess/WebUIClient.h:
        Call the UI client callback function.
2011-03-12  Anders Carlsson  <andersca@apple.com>

        Reviewed by Sam Weinig.

        Should be able to download a PDF to the Downloads folder
        https://bugs.webkit.org/show_bug.cgi?id=56256

        * MiniBrowser/mac/BrowserWindowController.m:
        (-[BrowserWindowController awakeFromNib]):
        * WebKitTestRunner/TestController.cpp:
        (WTR::TestController::createOtherPage):
        (WTR::TestController::initialize):
        Update for API changes.


git-svn-id: svn://svn.chromium.org/blink/trunk@80943 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent ac117046
2011-03-12 Anders Carlsson <andersca@apple.com>
Reviewed by Sam Weinig.
Should be able to download a PDF to the Downloads folder
https://bugs.webkit.org/show_bug.cgi?id=56256
* UIProcess/API/C/WKPage.h:
Add WKPageSaveDataToFileInDownloadsFolderCallback to the UI client.
* UIProcess/API/mac/PDFViewController.h:
* UIProcess/API/mac/PDFViewController.mm:
(-[WKPDFView _applyPDFPreferences]):
(-[WKPDFView _updatePreferences:]):
Use new PDFViewController::page getter.
(-[WKPDFView PDFViewSavePDFToDownloadFolder:]):
Call PDFViewController::savePDFToDownloadsFolder.
(WebKit::releaseCFData):
(WebKit::PDFViewController::savePDFToDownloadsFolder):
Create a WebData that wraps the CFData, then pass it along to
WebPageProxy::saveDataToFileInDownloadsFolder.
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::saveDataToFileInDownloadsFolder):
Call WebUIClient::saveDataToFileInDownloadsFolder.
(WebKit::WebUIClient::saveDataToFileInDownloadsFolder):
* UIProcess/WebUIClient.h:
Call the UI client callback function.
2011-03-12 Anders Carlsson <andersca@apple.com> 2011-03-12 Anders Carlsson <andersca@apple.com>
Reviewed by Sam Weinig. Reviewed by Sam Weinig.
......
...@@ -173,6 +173,7 @@ typedef void (*WKPageDrawHeaderCallback)(WKPageRef page, WKFrameRef frame, WKRec ...@@ -173,6 +173,7 @@ typedef void (*WKPageDrawHeaderCallback)(WKPageRef page, WKFrameRef frame, WKRec
typedef void (*WKPageDrawFooterCallback)(WKPageRef page, WKFrameRef frame, WKRect rect, const void* clientInfo); typedef void (*WKPageDrawFooterCallback)(WKPageRef page, WKFrameRef frame, WKRect rect, const void* clientInfo);
typedef void (*WKPagePrintFrameCallback)(WKPageRef page, WKFrameRef frame, const void* clientInfo); typedef void (*WKPagePrintFrameCallback)(WKPageRef page, WKFrameRef frame, const void* clientInfo);
typedef void (*WKPageDidCompleteRubberBandForMainFrameCallback)(WKPageRef page, WKSize initialOverhang, const void* clientInfo); typedef void (*WKPageDidCompleteRubberBandForMainFrameCallback)(WKPageRef page, WKSize initialOverhang, const void* clientInfo);
typedef void (*WKPageSaveDataToFileInDownloadsFolderCallback)(WKPageRef page, WKStringRef suggestedFilename, WKStringRef mimeType, WKURLRef originatingURL, WKDataRef data, const void* clientInfo);
struct WKPageUIClient { struct WKPageUIClient {
int version; int version;
...@@ -210,6 +211,7 @@ struct WKPageUIClient { ...@@ -210,6 +211,7 @@ struct WKPageUIClient {
WKPagePrintFrameCallback printFrame; WKPagePrintFrameCallback printFrame;
WKPageCallback runModal; WKPageCallback runModal;
WKPageDidCompleteRubberBandForMainFrameCallback didCompleteRubberBandForMainFrame; WKPageDidCompleteRubberBandForMainFrameCallback didCompleteRubberBandForMainFrame;
WKPageSaveDataToFileInDownloadsFolderCallback saveDataToFileInDownloadsFolder;
}; };
typedef struct WKPageUIClient WKPageUIClient; typedef struct WKPageUIClient WKPageUIClient;
......
...@@ -41,6 +41,8 @@ namespace CoreIPC { ...@@ -41,6 +41,8 @@ namespace CoreIPC {
namespace WebKit { namespace WebKit {
class WebPageProxy;
class PDFViewController { class PDFViewController {
WTF_MAKE_NONCOPYABLE(PDFViewController); WTF_MAKE_NONCOPYABLE(PDFViewController);
...@@ -49,6 +51,8 @@ public: ...@@ -49,6 +51,8 @@ public:
~PDFViewController(); ~PDFViewController();
WKView* wkView() const { return m_wkView; } WKView* wkView() const { return m_wkView; }
WebPageProxy* page() const;
void setPDFDocumentData(const String& mimeType, const String& suggestedFilename, const CoreIPC::DataReference&); void setPDFDocumentData(const String& mimeType, const String& suggestedFilename, const CoreIPC::DataReference&);
double zoomFactor() const; double zoomFactor() const;
...@@ -58,6 +62,7 @@ public: ...@@ -58,6 +62,7 @@ public:
NSPrintOperation *makePrintOperation(NSPrintInfo *); NSPrintOperation *makePrintOperation(NSPrintInfo *);
void openPDFInFinder(); void openPDFInFinder();
void savePDFToDownloadsFolder();
private: private:
explicit PDFViewController(WKView *wkView); explicit PDFViewController(WKView *wkView);
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#import "DataReference.h" #import "DataReference.h"
#import "WKAPICast.h" #import "WKAPICast.h"
#import "WKView.h" #import "WKView.h"
#import "WebData.h"
#import "WebPageGroup.h" #import "WebPageGroup.h"
#import "WebPageProxy.h" #import "WebPageProxy.h"
#import "WebPreferences.h" #import "WebPreferences.h"
...@@ -116,7 +117,7 @@ extern "C" NSString *_NSPathForSystemFramework(NSString *framework); ...@@ -116,7 +117,7 @@ extern "C" NSString *_NSPathForSystemFramework(NSString *framework);
if (!_pdfViewController) if (!_pdfViewController)
return; return;
WebPreferences *preferences = toImpl([_pdfViewController->wkView() pageRef])->pageGroup()->preferences(); WebPreferences *preferences = _pdfViewController->page()->pageGroup()->preferences();
CGFloat scaleFactor = preferences->pdfScaleFactor(); CGFloat scaleFactor = preferences->pdfScaleFactor();
if (!scaleFactor) if (!scaleFactor)
...@@ -135,7 +136,7 @@ extern "C" NSString *_NSPathForSystemFramework(NSString *framework); ...@@ -135,7 +136,7 @@ extern "C" NSString *_NSPathForSystemFramework(NSString *framework);
if (!_pdfViewController) if (!_pdfViewController)
return; return;
WebPreferences* preferences = toImpl([_pdfViewController->wkView() pageRef])->pageGroup()->preferences(); WebPreferences* preferences = _pdfViewController->page()->pageGroup()->preferences();
CGFloat scaleFactor = [_pdfView autoScales] ? 0 : [_pdfView scaleFactor]; CGFloat scaleFactor = [_pdfView autoScales] ? 0 : [_pdfView scaleFactor];
preferences->setPDFScaleFactor(scaleFactor); preferences->setPDFScaleFactor(scaleFactor);
...@@ -187,6 +188,11 @@ extern "C" NSString *_NSPathForSystemFramework(NSString *framework); ...@@ -187,6 +188,11 @@ extern "C" NSString *_NSPathForSystemFramework(NSString *framework);
_pdfViewController->openPDFInFinder(); _pdfViewController->openPDFInFinder();
} }
- (void)PDFViewSavePDFToDownloadFolder:(PDFView *)sender
{
_pdfViewController->savePDFToDownloadsFolder();
}
@end @end
namespace WebKit { namespace WebKit {
...@@ -212,6 +218,11 @@ PDFViewController::~PDFViewController() ...@@ -212,6 +218,11 @@ PDFViewController::~PDFViewController()
m_wkPDFView = nullptr; m_wkPDFView = nullptr;
} }
WebPageProxy* PDFViewController::page() const
{
return toImpl([m_wkView pageRef]);
}
static RetainPtr<CFDataRef> convertPostScriptDataSourceToPDF(const CoreIPC::DataReference& dataReference) static RetainPtr<CFDataRef> convertPostScriptDataSourceToPDF(const CoreIPC::DataReference& dataReference)
{ {
// Convert PostScript to PDF using Quartz 2D API // Convert PostScript to PDF using Quartz 2D API
...@@ -330,6 +341,32 @@ void PDFViewController::openPDFInFinder() ...@@ -330,6 +341,32 @@ void PDFViewController::openPDFInFinder()
[[NSWorkspace sharedWorkspace] openFile:path]; [[NSWorkspace sharedWorkspace] openFile:path];
} }
static void releaseCFData(unsigned char*, const void* data)
{
ASSERT(CFGetTypeID(data) == CFDataGetTypeID());
// Balanced by CFRetain in savePDFToDownloadsFolder.
CFRelease(data);
}
void PDFViewController::savePDFToDownloadsFolder()
{
// We don't want to write the file until we have a document to write. (see 5267607).
if (![m_pdfView document]) {
NSBeep();
return;
}
ASSERT(m_pdfData);
// Balanced by CFRelease in releaseCFData.
CFRetain(m_pdfData.get());
RefPtr<WebData> data = WebData::createWithoutCopying(CFDataGetBytePtr(m_pdfData.get()), CFDataGetLength(m_pdfData.get()), releaseCFData, m_pdfData.get());
page()->saveDataToFileInDownloadsFolder(m_suggestedFilename.get(), page()->mainFrame()->mimeType(), page()->mainFrame()->url(), data.get());
}
static NSString *temporaryPDFDirectoryPath() static NSString *temporaryPDFDirectoryPath()
{ {
static NSString *temporaryPDFDirectoryPath; static NSString *temporaryPDFDirectoryPath;
......
...@@ -487,7 +487,8 @@ QWKPage::QWKPage(QWKContext* context) ...@@ -487,7 +487,8 @@ QWKPage::QWKPage(QWKContext* context)
0, /* drawFooter */ 0, /* drawFooter */
0, /* printFrame */ 0, /* printFrame */
0, /* runModal */ 0, /* runModal */
0 /* didCompleteRubberBandForMainFrame */ 0, /* didCompleteRubberBandForMainFrame */
0 /* saveDataToFileInDownloadsFolder */
}; };
WKPageSetPageUIClient(pageRef(), &uiClient); WKPageSetPageUIClient(pageRef(), &uiClient);
} }
......
...@@ -2884,4 +2884,9 @@ Color WebPageProxy::backingStoreUpdatesFlashColor() ...@@ -2884,4 +2884,9 @@ Color WebPageProxy::backingStoreUpdatesFlashColor()
return Color(200, 0, 255); return Color(200, 0, 255);
} }
void WebPageProxy::saveDataToFileInDownloadsFolder(const String& suggestedFilename, const String& mimeType, const String& originatingURLString, WebData* data)
{
m_uiClient.saveDataToFileInDownloadsFolder(this, suggestedFilename, mimeType, originatingURLString, data);
}
} // namespace WebKit } // namespace WebKit
...@@ -463,9 +463,12 @@ public: ...@@ -463,9 +463,12 @@ public:
// Color to be used with kWKDebugFlashViewUpdates. // Color to be used with kWKDebugFlashViewUpdates.
static WebCore::Color viewUpdatesFlashColor(); static WebCore::Color viewUpdatesFlashColor();
// Color to be used with kWKDebugFlashBackingStoreUpdates. // Color to be used with kWKDebugFlashBackingStoreUpdates.
static WebCore::Color backingStoreUpdatesFlashColor(); static WebCore::Color backingStoreUpdatesFlashColor();
void saveDataToFileInDownloadsFolder(const String& suggestedFilename, const String& mimeType, const String& originatingURLString, WebData*);
private: private:
WebPageProxy(PageClient*, WebContext*, WebPageGroup*, uint64_t pageID); WebPageProxy(PageClient*, WebContext*, WebPageGroup*, uint64_t pageID);
......
...@@ -329,10 +329,18 @@ void WebUIClient::runModal(WebPageProxy* page) ...@@ -329,10 +329,18 @@ void WebUIClient::runModal(WebPageProxy* page)
void WebUIClient::didCompleteRubberBandForMainFrame(WebPageProxy* page, const IntSize& initialOverhang) void WebUIClient::didCompleteRubberBandForMainFrame(WebPageProxy* page, const IntSize& initialOverhang)
{ {
if (!m_client.runModal) if (!m_client.didCompleteRubberBandForMainFrame)
return; return;
m_client.didCompleteRubberBandForMainFrame(toAPI(page), toAPI(initialOverhang), m_client.clientInfo); m_client.didCompleteRubberBandForMainFrame(toAPI(page), toAPI(initialOverhang), m_client.clientInfo);
} }
void WebUIClient::saveDataToFileInDownloadsFolder(WebPageProxy* page, const String& suggestedFilename, const String& mimeType, const String& originatingURLString, WebData* data)
{
if (!m_client.saveDataToFileInDownloadsFolder)
return;
m_client.saveDataToFileInDownloadsFolder(toAPI(page), toAPI(suggestedFilename.impl()), toAPI(mimeType.impl()), toURLRef(originatingURLString.impl()), toAPI(data), m_client.clientInfo);
}
} // namespace WebKit } // namespace WebKit
...@@ -44,6 +44,7 @@ namespace WebKit { ...@@ -44,6 +44,7 @@ namespace WebKit {
class APIObject; class APIObject;
class GeolocationPermissionRequestProxy; class GeolocationPermissionRequestProxy;
class NativeWebKeyboardEvent; class NativeWebKeyboardEvent;
class WebData;
class WebFrameProxy; class WebFrameProxy;
class WebPageProxy; class WebPageProxy;
class WebSecurityOrigin; class WebSecurityOrigin;
...@@ -98,6 +99,8 @@ public: ...@@ -98,6 +99,8 @@ public:
void runModal(WebPageProxy*); void runModal(WebPageProxy*);
void didCompleteRubberBandForMainFrame(WebPageProxy*, const WebCore::IntSize&); void didCompleteRubberBandForMainFrame(WebPageProxy*, const WebCore::IntSize&);
void saveDataToFileInDownloadsFolder(WebPageProxy*, const String& suggestedFilename, const String& mimeType, const String& originatingURLString, WebData*);
}; };
} // namespace WebKit } // namespace WebKit
......
2011-03-12 Anders Carlsson <andersca@apple.com>
Reviewed by Sam Weinig.
Should be able to download a PDF to the Downloads folder
https://bugs.webkit.org/show_bug.cgi?id=56256
* MiniBrowser/mac/BrowserWindowController.m:
(-[BrowserWindowController awakeFromNib]):
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::createOtherPage):
(WTR::TestController::initialize):
Update for API changes.
2011-03-11 Anton D'Auria <adauria@apple.com> 2011-03-11 Anton D'Auria <adauria@apple.com>
Reviewed and landed by Brady Eidson. Reviewed and landed by Brady Eidson.
......
...@@ -648,6 +648,7 @@ static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParameters ...@@ -648,6 +648,7 @@ static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParameters
0, // printFrame 0, // printFrame
0, // showModal 0, // showModal
0, // didCompleteRubberBandForMainFrame 0, // didCompleteRubberBandForMainFrame
0, // saveDataToFileInDownloadsFolder
}; };
WKPageSetPageUIClient(_webView.pageRef, &uiClient); WKPageSetPageUIClient(_webView.pageRef, &uiClient);
} }
......
...@@ -168,6 +168,7 @@ WKPageRef TestController::createOtherPage(WKPageRef oldPage, WKDictionaryRef, WK ...@@ -168,6 +168,7 @@ WKPageRef TestController::createOtherPage(WKPageRef oldPage, WKDictionaryRef, WK
0, // printFrame 0, // printFrame
runModal, runModal,
0, // didCompleteRubberBandForMainFrame 0, // didCompleteRubberBandForMainFrame
0, // saveDataToFileInDownloadsFolder
}; };
WKPageSetPageUIClient(newPage, &otherPageUIClient); WKPageSetPageUIClient(newPage, &otherPageUIClient);
...@@ -301,6 +302,7 @@ void TestController::initialize(int argc, const char* argv[]) ...@@ -301,6 +302,7 @@ void TestController::initialize(int argc, const char* argv[])
0, // printFrame 0, // printFrame
0, // runModal 0, // runModal
0, // didCompleteRubberBandForMainFrame 0, // didCompleteRubberBandForMainFrame
0, // saveDataToFileInDownloadsFolder
}; };
WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient); WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment