16be412a4117347da3c68bf7241a757c9d007be5
[WebKit-https.git] / WebKitQt / Api / qwebframe.cpp
1 /*
2     Copyright (C) 2007 Trolltech ASA
3     Copyright (C) 2007 Staikos Computing Services Inc.
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18     Boston, MA 02111-1307, USA.
19
20     This class provides all functionality needed for loading images, style sheets and html
21     pages from the web. It has a memory cache for these objects.
22 */
23 #include "qwebframe.h"
24 #include "qwebpage.h"
25 #include "qwebpage_p.h"
26 #include "qwebframe_p.h"
27
28 #include <qdebug.h>
29
30 #include "FrameLoaderClientQt.h"
31 #include "FrameQt.h"
32 #include "FrameView.h"
33 #include "ResourceRequest.h"
34
35 #include "markup.h"
36 #include "RenderTreeAsText.h"
37 #include "Element.h"
38 #include "Document.h"
39 #include "RenderObject.h"
40
41 #include "bindings/runtime.h"
42 #include "bindings/runtime_root.h"
43 #include "ExecState.h"
44 #include "object.h"
45
46 #include "wtf/HashMap.h"
47
48 using namespace WebCore;
49
50 QWebFrame::QWebFrame(QWebPage *parent, QWebFrameData *frameData)
51     : QScrollArea(parent)
52     , d(new QWebFramePrivate)
53 {
54     d->page = parent;
55
56     d->frameLoaderClient = new FrameLoaderClientQt();
57     d->frame = new FrameQt(parent->d->page, frameData->ownerElement, d->frameLoaderClient);
58     d->frameLoaderClient->setFrame(this, d->frame.get());
59
60     d->frameView = new FrameView(d->frame.get());
61     d->frameView->deref();
62     d->frameView->setScrollArea(this);
63     d->frameView->setAllowsScrolling(frameData->allowsScrolling);
64     d->frame->setView(d->frameView.get());
65     if (!frameData->url.isEmpty()) {
66         ResourceRequest request(frameData->url, frameData->referrer);
67         d->frame->loader()->load(request, frameData->name);
68     }
69 }
70
71
72 QWebFrame::QWebFrame(QWebFrame *parent, QWebFrameData *frameData)
73     : QScrollArea(parent->widget())
74     , d(new QWebFramePrivate)
75 {
76     setLineWidth(0);
77     setMidLineWidth(0);
78     setFrameShape(QFrame::NoFrame);
79     d->page = parent->d->page;
80
81     d->frameLoaderClient = new FrameLoaderClientQt();
82     d->frame = new FrameQt(parent->d->page->d->page, frameData->ownerElement, d->frameLoaderClient);
83     d->frameLoaderClient->setFrame(this, d->frame.get());
84
85     d->frameView = new FrameView(d->frame.get());
86     d->frameView->deref();
87     d->frameView->setScrollArea(this);
88     d->frameView->setAllowsScrolling(frameData->allowsScrolling);
89     d->frame->setView(d->frameView.get());
90 }
91
92 QWebFrame::~QWebFrame()
93 {
94     Q_ASSERT(d->frame == 0);
95     Q_ASSERT(d->frameView == 0);
96     delete d;
97 }
98
99 void QWebFrame::addToJSWindowObject(const QByteArray &name, QObject *object)
100 {
101     KJS::Bindings::RootObject *root = d->frame->bindingRootObject();
102     KJS::ExecState *exec = root->interpreter()->globalExec();
103     KJS::JSObject *rootObject = root->interpreter()->globalObject();
104     KJS::JSObject *window = rootObject->get(exec, KJS::Identifier("window"))->getObject();
105     if (!window) {
106         qDebug() << "Warning: couldn't get window object";
107         return;
108     }
109             
110     KJS::JSObject *testController =
111         KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage,
112                                                      object, root);
113
114     window->put(exec, KJS::Identifier(name.constData()), testController);
115 }
116
117
118 QString QWebFrame::markup() const
119 {
120     return createMarkup(d->frame->document());
121 }
122
123 QString QWebFrame::innerText() const
124 {
125     if (d->frameView->layoutPending())
126         d->frameView->layout();
127     
128     Element *documentElement = d->frame->document()->documentElement();
129     return documentElement->innerText();
130 }
131
132 QString QWebFrame::renderTreeDump() const
133 {
134     if (d->frameView->layoutPending())
135         d->frameView->layout();
136     
137     return externalRepresentation(d->frame->renderer());
138 }
139
140 QString QWebFrame::title() const
141 {
142     if (d->frame->document())
143         return d->frame->document()->title();
144     else return QString();
145 }
146
147 QWebPage * QWebFrame::page() const
148 {
149     return d->page;
150 }
151
152 QString QWebFrame::selectedText() const
153 {
154     return d->frame->selectedText();
155 }
156
157 void QWebFrame::resizeEvent(QResizeEvent *e)
158 {
159     QScrollArea::resizeEvent(e);
160     RenderObject *renderer = d->frame->renderer();
161     if (renderer)
162         renderer->setNeedsLayout(true);
163     d->frameView->scheduleRelayout();
164 }
165
166 #include "qwebframe.moc"