Reviewed by Maciej.
[WebKit-https.git] / WebKit / Plugins / WebNetscapePluginDocumentView.m
1 /*
2  * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import <WebKit/WebDataSource.h>
30 #import <WebKit/WebDocument.h>
31 #import <WebKit/WebFrame.h>
32 #import <WebKit/WebFrameView.h>
33 #import <WebKit/WebKitErrorsPrivate.h>
34 #import <WebKit/WebNetscapePluginDocumentView.h>
35 #import <WebKit/WebNetscapePluginRepresentation.h>
36 #import <WebKit/WebNSViewExtras.h>
37 #import <WebKit/WebNetscapePluginPackage.h>
38 #import <WebKit/WebPluginDatabase.h>
39 #import <WebKit/WebResourceLoadDelegate.h>
40 #import <WebKit/WebViewPrivate.h>
41
42 #import <WebKit/WebAssertions.h>
43 #import <Foundation/NSURLResponse.h>
44
45 @implementation WebNetscapePluginDocumentView
46
47 - initWithFrame:(NSRect)frame
48 {
49     [super initWithFrame:frame];
50     [self setFrame:NSZeroRect];
51     [self setMode:NP_FULL];
52     [self setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
53     needsLayout = YES;
54     return self;
55 }
56
57 - (void)dealloc
58 {
59     [dataSource release];
60     [super dealloc];
61 }
62
63 - (void)drawRect:(NSRect)rect
64 {
65     if(needsLayout){
66         [self layout];
67     }
68
69     [super drawRect:rect];
70 }
71
72 - (BOOL)canStart
73 {
74     return (dataSource != nil);
75 }
76
77 - (void)didStart
78 {
79     // Deliver what has not been passed to the plug-in up to this point.
80     // Do this in case the plug-in was started after the load started.
81     WebNetscapePluginRepresentation *representation = (WebNetscapePluginRepresentation *)[dataSource representation];
82     ASSERT([representation isKindOfClass:[WebNetscapePluginRepresentation class]]);
83     [representation redeliverStream];
84 }
85
86 - (WebDataSource *)dataSource
87 {
88     return dataSource;
89 }
90
91 - (void)setDataSource:(WebDataSource *)theDataSource
92 {    
93     [dataSource release];
94     dataSource = [theDataSource retain];
95
96     NSString *MIME = [[dataSource response] MIMEType];
97     
98     [self setMIMEType:MIME];
99     [self setBaseURL:[[dataSource request] URL]];
100
101     WebNetscapePluginPackage *thePlugin;
102     thePlugin = (WebNetscapePluginPackage *)[[WebPluginDatabase installedPlugins] pluginForMIMEType:MIME];
103     ASSERT([thePlugin isKindOfClass:[WebNetscapePluginPackage class]]);
104
105     if (![thePlugin load]) {
106         NSError *error = [[NSError alloc] _initWithPluginErrorCode:WebKitErrorCannotLoadPlugIn
107                                                         contentURL:[[theDataSource request] URL]
108                                                      pluginPageURL:nil
109                                                         pluginName:[thePlugin name]
110                                                           MIMEType:MIME];
111         WebView *webView = [[theDataSource webFrame] webView];
112         [[webView _resourceLoadDelegateForwarder] webView:webView
113                                     plugInFailedWithError:error
114                                                dataSource:theDataSource];
115         [error release];
116         return;
117     }
118
119     [self setPlugin:thePlugin];
120
121     if ([self currentWindow]) {
122         [self start];
123     }
124 }
125
126 - (void)dataSourceUpdated:(WebDataSource *)dataSource
127 {
128 }
129
130 - (void)setNeedsLayout:(BOOL)flag
131 {
132     needsLayout = flag;
133 }
134
135 - (void)layout
136 {
137     NSRect superFrame = [[self _web_superviewOfClass:[WebFrameView class]] frame];
138     [self setFrame:NSMakeRect(0, 0, NSWidth(superFrame), NSHeight(superFrame))];
139     needsLayout = NO;
140 }
141
142 - (void)viewWillMoveToHostWindow:(NSWindow *)hostWindow
143 {
144     [super viewWillMoveToHostWindow:hostWindow];
145 }
146
147 - (void)viewDidMoveToHostWindow
148 {
149     [super viewDidMoveToHostWindow];
150 }
151
152 - (BOOL)documentViewShouldHandlePrint
153 {
154     // Allow the plugin to take over printing if it defines an NPP_Print function
155     return (NPP_Print != NULL);
156 }
157
158 - (void)printDocumentView
159 {
160     // The plugin cannot print if it does not have an NPP_Print function
161     if (!NPP_Print)
162         return;
163     
164     // Let the plugin take control of printing when in NP_FULL mode
165     NPPrint platformPrint;
166     platformPrint.mode = NP_FULL;
167     platformPrint.print.fullPrint.pluginPrinted = 0;
168     platformPrint.print.fullPrint.printOne = 0;
169     platformPrint.print.fullPrint.platformPrint = NULL;
170     NPP_Print(instance, &platformPrint);
171 }
172
173 @end