541caa744240824749f0ac4ba6a8e00084f9c554
[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->frame->setView(d->frameView.get());
64     if (!frameData->url.isEmpty()) {
65         ResourceRequest request(frameData->url, frameData->referrer);
66         d->frame->loader()->load(request, frameData->name);
67     }
68 }
69
70
71 QWebFrame::QWebFrame(QWebFrame *parent, QWebFrameData *frameData)
72     : QScrollArea(parent->widget())
73     , d(new QWebFramePrivate)
74 {
75     setLineWidth(0);
76     setMidLineWidth(0);
77     setFrameShape(QFrame::NoFrame);
78     d->page = parent->d->page;
79
80     d->frameLoaderClient = new FrameLoaderClientQt();
81     d->frame = new FrameQt(parent->d->page->d->page, frameData->ownerElement, d->frameLoaderClient);
82     d->frameLoaderClient->setFrame(this, d->frame.get());
83
84     d->frameView = new FrameView(d->frame.get());
85     d->frameView->deref();
86     d->frameView->setScrollArea(this);
87     d->frame->setView(d->frameView.get());
88 }
89
90 QWebFrame::~QWebFrame()
91 {
92     if (d->frameView)
93         d->frameView->setScrollArea(0);
94     delete d;
95 }
96
97 void QWebFrame::addToJSWindowObject(const QByteArray &name, QObject *object)
98 {
99     KJS::Bindings::RootObject *root = d->frame->bindingRootObject();
100     KJS::ExecState *exec = root->interpreter()->globalExec();
101     KJS::JSObject *rootObject = root->interpreter()->globalObject();
102     KJS::JSObject *window = rootObject->get(exec, KJS::Identifier("window"))->getObject();
103     if (!window) {
104         qDebug() << "Warning: couldn't get window object";
105         return;
106     }
107             
108     KJS::JSObject *testController =
109         KJS::Bindings::Instance::createRuntimeObject(KJS::Bindings::Instance::QtLanguage,
110                                                      object, root);
111
112     window->put(exec, KJS::Identifier(name.constData()), testController);
113 }
114
115
116 QString QWebFrame::markup() const
117 {
118     return createMarkup(d->frame->document());
119 }
120
121 QString QWebFrame::innerText() const
122 {
123     if (d->frameView->layoutPending())
124         d->frameView->layout();
125     
126     Element *documentElement = d->frame->document()->documentElement();
127     return documentElement->innerText();
128 }
129
130 QString QWebFrame::renderTreeDump() const
131 {
132     if (d->frameView->layoutPending())
133         d->frameView->layout();
134     
135     return externalRepresentation(d->frame->renderer());
136 }
137
138 QString QWebFrame::title() const
139 {
140     if (d->frame->document())
141         return d->frame->document()->title();
142     else return QString();
143 }
144
145 QWebPage * QWebFrame::page() const
146 {
147     return d->page;
148 }
149
150 QString QWebFrame::selectedText() const
151 {
152     return d->frame->selectedText();
153 }
154
155 void QWebFrame::resizeEvent(QResizeEvent *e)
156 {
157     QScrollArea::resizeEvent(e);
158     RenderObject *renderer = d->frame->renderer();
159     if (renderer)
160         renderer->setNeedsLayout(true);
161     d->frameView->scheduleRelayout();
162 }
163
164 #include "qwebframe.moc"