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