fa18c1e28ec993d51d1824b34fb7c6d4703a0947
[WebKit-https.git] / WebCore / bridge / win / FrameWin.cpp
1 /*
2  * Copyright (C) 2006 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "FrameWin.h"
28
29 #include "BrowserExtensionWin.h"
30 #include "Decoder.h"
31 #include "Document.h"
32 #include "FrameLoadRequest.h"
33 #include "FramePrivate.h"
34 #include "Settings.h"
35 #include "PlatformKeyboardEvent.h"
36 #include "Plugin.h"
37 #include "RenderFrame.h"
38 #include "ResourceLoader.h"
39 #include <windows.h>
40
41 namespace WebCore {
42
43 FrameWin::FrameWin(Page* page, Element* ownerElement, FrameWinClient* client)
44     : Frame(page, ownerElement)
45 {
46     d->m_extension = new BrowserExtensionWin(this);
47     Settings* settings = new Settings();
48     settings->setAutoLoadImages(true);
49     settings->setMediumFixedFontSize(13);
50     settings->setMediumFontSize(16);
51     settings->setSerifFontName("Times New Roman");
52     settings->setFixedFontName("Courier New");
53     settings->setSansSerifFontName("Arial");
54     settings->setStdFontName("Times New Roman");
55     settings->setIsJavaScriptEnabled(true);
56
57     setSettings(settings);
58     m_client = client;
59 }
60
61 FrameWin::~FrameWin()
62 {
63     setView(0);
64     clearRecordedFormValues();    
65 }
66
67 void FrameWin::urlSelected(const FrameLoadRequest& request)
68 {
69     if (m_client)
70         m_client->openURL(request.m_request.url().url(), request.lockHistory());
71 }
72
73 void FrameWin::submitForm(const FrameLoadRequest& request)
74 {
75     // FIXME: this is a hack inherited from FrameMac, and should be pushed into Frame
76     const ResourceRequest& resourceRequest = request.m_request;
77     if (d->m_submittedFormURL == resourceRequest.url())
78         return;
79     d->m_submittedFormURL = resourceRequest.url();
80
81     if (m_client)
82         m_client->submitForm(resourceRequest.doPost() ? "POST" : "GET", resourceRequest.url(), &resourceRequest.postData);
83
84     clearRecordedFormValues();
85 }
86
87 String FrameWin::userAgent() const
88 {
89     return "Mozilla/5.0 (PC; U; Intel; Windows; en) AppleWebKit/420+ (KHTML, like Gecko)";
90 }
91
92 void FrameWin::runJavaScriptAlert(String const& message)
93 {
94     String text = message;
95     text.replace('\\', backslashAsCurrencySymbol());
96     UChar nullChar = 0;
97     text += String(&nullChar, 1);
98     MessageBox(view()->containingWindow(), text.characters(), L"JavaScript Alert", MB_OK);
99 }
100
101 bool FrameWin::runJavaScriptConfirm(String const& message)
102 {
103     String text = message;
104     text.replace('\\', backslashAsCurrencySymbol());
105     UChar nullChar = 0;
106     text += String(&nullChar, 1);
107     return MessageBox(view()->containingWindow(), text.characters(), L"JavaScript Alert", MB_OKCANCEL) == IDOK;
108 }
109
110 // FIXME: This needs to be unified with the keyPress method on FrameMac
111 bool FrameWin::keyPress(const PlatformKeyboardEvent& keyEvent)
112 {
113     bool result;
114     // Check for cases where we are too early for events -- possible unmatched key up
115     // from pressing return in the location bar.
116     Document *doc = document();
117     if (!doc)
118         return false;
119     Node *node = doc->focusNode();
120     if (!node) {
121         if (doc->isHTMLDocument())
122             node = doc->body();
123         else
124             node = doc->documentElement();
125         if (!node)
126             return false;
127     }
128     
129     if (!keyEvent.isKeyUp())
130         prepareForUserAction();
131
132     result = !EventTargetNodeCast(node)->dispatchKeyEvent(keyEvent);
133
134     // FIXME: FrameMac has a keyDown/keyPress hack here which we are not copying.
135
136     return result;
137 }
138
139 void FrameWin::setTitle(const String &title)
140 {
141     String text = title;
142     text.replace('\\', backslashAsCurrencySymbol());
143
144     m_client->setTitle(text);
145 }
146
147 void FrameWin::setStatusBarText(const String& status)
148 {
149     String text = status;
150     text.replace('\\', backslashAsCurrencySymbol());
151
152     m_client->setStatusText(text);
153 }
154
155 void FrameWin::createNewWindow(const FrameLoadRequest& request)
156 {
157     m_client->createNewWindow(request.m_request);
158 }
159
160 void FrameWin::createNewWindow(const FrameLoadRequest& request,
161                                const WindowArgs& args,
162                                Frame*& part)
163 {
164     m_client->createNewWindow(request.m_request, args, part);
165 }
166
167 }