Reviewed by Kevin.
[WebKit-https.git] / WebCore / khtml / khtmlpart_p.h
1 /* This file is part of the KDE project
2  *
3  * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
4  *                     1999-2001 Lars Knoll <knoll@kde.org>
5  *                     1999-2001 Antti Koivisto <koivisto@kde.org>
6  *                     2000-2001 Simon Hausmann <hausmann@kde.org>
7  *                     2000-2001 Dirk Mueller <mueller@kde.org>
8  *                     2000 Stefan Schimanski <1Stein@gmx.de>
9  * Copyright (C) 2004 Apple Computer, Inc.
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public License
22  * along with this library; see the file COPYING.LIB.  If not, write to
23  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24  * Boston, MA 02111-1307, USA.
25  */
26
27 #ifndef khtmlpart_p_h
28 #define khtmlpart_p_h
29
30 #include <kcursor.h>
31 #include <klibloader.h>
32 #include <kxmlguifactory.h>
33 #include <kaction.h>
34 #include <kparts/partmanager.h>
35
36 #include "khtml_run.h"
37 #include "khtml_find.h"
38 #include "khtml_factory.h"
39 #include "khtml_events.h"
40 #include "khtml_ext.h"
41 #include "khtml_iface.h"
42 #include "khtml_settings.h"
43 #include "misc/decoder.h"
44 #include "misc/formdata.h"
45 #include "java/kjavaappletcontext.h"
46 #include "ecma/kjs_proxy.h"
47 #include "css/css_valueimpl.h"
48 #include "dom/dom_misc.h"
49 #include "editing/edit_command.h"
50 #include "editing/selection.h"
51
52 namespace KIO
53 {
54   class Job;
55   class TransferJob;
56 };
57
58 namespace khtml
59 {
60   struct ChildFrame
61   {
62       enum Type { Frame, IFrame, Object };
63
64       ChildFrame() { m_bCompleted = false; m_bPreloaded = false; m_type = Frame; m_bNotify = false; m_hasFallbackContent = false; }
65
66 #if !APPLE_CHANGES
67       ~ChildFrame() { if (m_run) m_run->abort(); }
68 #endif
69
70     QGuardedPtr<khtml::RenderPart> m_frame;
71     QGuardedPtr<KParts::ReadOnlyPart> m_part;
72     QGuardedPtr<KParts::BrowserExtension> m_extension;
73     QString m_serviceName;
74     QString m_serviceType;
75     QStringList m_services;
76     bool m_bCompleted;
77     QString m_name;
78     KParts::URLArgs m_args;
79 #if !APPLE_CHANGES
80     QGuardedPtr<KHTMLRun> m_run;
81 #endif
82     bool m_bPreloaded;
83     KURL m_workingURL;
84     Type m_type;
85     QStringList m_paramNames;
86     QStringList m_paramValues;
87     bool m_bNotify;
88     bool m_hasFallbackContent;
89   };
90 }
91
92 class FrameList : public QValueList<khtml::ChildFrame>
93 {
94 public:
95     Iterator find( const QString &name );
96 };
97
98 typedef FrameList::ConstIterator ConstFrameIt;
99 typedef FrameList::Iterator FrameIt;
100
101 static int khtml_part_dcop_counter = 0;
102
103 enum RedirectionScheduled {
104     noRedirectionScheduled,
105     redirectionScheduled,
106     locationChangeScheduled,
107     historyNavigationScheduled,
108     locationChangeScheduledDuringLoad
109 };
110
111 class KHTMLPartPrivate
112 {
113 public:
114   KHTMLPartPrivate(QObject* parent)
115   {
116     m_doc = 0L;
117     m_decoder = 0L;
118     m_jscript = 0L;
119     m_runningScripts = 0;
120     m_kjs_lib = 0;
121     m_job = 0L;
122     m_bComplete = true;
123     m_bLoadingMainResource = false;
124     m_bLoadEventEmitted = true;
125     m_bUnloadEventEmitted = true;
126     m_cachePolicy = KIO::CC_Verify;
127 #if !APPLE_CHANGES
128     m_manager = 0L;
129     m_settings = new KHTMLSettings(*KHTMLFactory::defaultHTMLSettings());
130 #endif
131     m_bClearing = false;
132     m_bCleared = false;
133     m_zoomFactor = 100;
134     m_bDnd = true;
135 #if !APPLE_CHANGES
136     m_linkCursor = KCursor::handCursor();
137     m_loadedObjects = 0;
138     m_totalObjectCount = 0;
139     m_jobPercent = 0;
140 #endif
141     m_haveEncoding = false;
142     m_activeFrame = 0L;
143 #if !APPLE_CHANGES
144     m_findDialog = 0;
145     m_ssl_in_use = false;
146 #endif
147 #ifndef Q_WS_QWS
148     m_javaContext = 0;
149 #endif
150     m_cacheId = 0;
151     m_frameNameId = 1;
152
153     m_restored = false;
154
155     m_focusNodeNumber = -1;
156     m_focusNodeRestored = false;
157
158     m_bJScriptForce = false;
159     m_bJScriptOverride = false;
160     m_bJavaForce = false;
161     m_bJavaOverride = false;
162     m_bPluginsForce = false;
163     m_bPluginsOverride = false;
164     m_onlyLocalReferences = false;
165
166     m_caretBlinkTimer = 0;
167     m_caretVisible = false;
168     m_caretBlinks = true;
169     m_caretPaint = true;
170     
171     m_typingStyle = 0;
172
173     m_metaRefreshEnabled = true;
174     m_bHTTPRefresh = false;
175
176     m_bFirstData = true;
177     m_submitForm = 0;
178     m_scheduledRedirection = noRedirectionScheduled;
179     m_delayRedirect = 0;
180
181     m_bPendingChildRedirection = false;
182     m_executingJavaScriptFormAction = false;
183
184     m_cancelWithLoadInProgress = false;
185     
186     // inherit settings from parent
187     if(parent && parent->inherits("KHTMLPart"))
188     {
189         KHTMLPart* part = static_cast<KHTMLPart*>(parent);
190         if(part->d)
191         {
192             m_bJScriptForce = part->d->m_bJScriptForce;
193             m_bJScriptOverride = part->d->m_bJScriptOverride;
194             m_bJavaForce = part->d->m_bJavaForce;
195             m_bJavaOverride = part->d->m_bJavaOverride;
196             m_bPluginsForce = part->d->m_bPluginsForce;
197             m_bPluginsOverride = part->d->m_bPluginsOverride;
198             // Same for SSL settings
199 #if !APPLE_CHANGES
200             m_ssl_in_use = part->d->m_ssl_in_use;
201 #endif
202             m_onlyLocalReferences = part->d->m_onlyLocalReferences;
203             m_zoomFactor = part->d->m_zoomFactor;
204         }
205     }
206
207     m_isFocused = false;
208     m_focusNodeNumber = -1;
209     m_focusNodeRestored = false;
210     m_opener = 0;
211     m_openedByJS = false;
212     m_newJSInterpreterExists = false;
213     m_dcopobject = 0;
214     m_dcop_counter = ++khtml_part_dcop_counter;
215   }
216   ~KHTMLPartPrivate()
217   {
218     delete m_dcopobject;
219     delete m_extension;
220 #if !APPLE_CHANGES
221     delete m_settings;
222 #endif
223     delete m_jscript;
224     if ( m_kjs_lib)
225        m_kjs_lib->unload();
226 #ifndef Q_WS_QWS
227     delete m_javaContext;
228 #endif
229     if (m_typingStyle)
230         m_typingStyle->deref();
231   }
232
233   FrameList m_frames;
234   QValueList<khtml::ChildFrame> m_objects;
235
236   QGuardedPtr<KHTMLView> m_view;
237   KHTMLPartBrowserExtension *m_extension;
238   KHTMLPartBrowserHostExtension *m_hostExtension;
239   DOM::DocumentImpl *m_doc;
240   khtml::Decoder *m_decoder;
241   QString m_encoding;
242   QString m_sheetUsed;
243   long m_cacheId;
244   QString scheduledScript;
245   khtml::SharedPtr<DOM::NodeImpl> scheduledScriptNode;
246
247   KJSProxy *m_jscript;
248   KLibrary *m_kjs_lib;
249   int m_runningScripts;
250   bool m_bJScriptEnabled :1;
251   bool m_bJScriptDebugEnabled :1;
252   bool m_bJavaEnabled :1;
253   bool m_bPluginsEnabled :1;
254   bool m_bJScriptForce :1;
255   bool m_bJScriptOverride :1;
256   bool m_bJavaForce :1;
257   bool m_bJavaOverride :1;
258   bool m_bPluginsForce :1;
259   bool m_metaRefreshEnabled :1;
260   bool m_bPluginsOverride :1;
261   bool m_restored :1;
262   int m_frameNameId;
263   int m_dcop_counter;
264   DCOPObject *m_dcopobject;
265
266 #ifndef Q_WS_QWS
267   KJavaAppletContext *m_javaContext;
268 #endif
269
270   KHTMLSettings *m_settings;
271
272   KIO::TransferJob * m_job;
273
274   QString m_kjsStatusBarText;
275   QString m_kjsDefaultStatusBarText;
276   QString m_lastModified;
277
278 #if !APPLE_CHANGES
279   // QStrings for SSL metadata
280   // Note: When adding new variables don't forget to update ::saveState()/::restoreState()!
281   bool m_ssl_in_use;
282   QString m_ssl_peer_certificate,
283           m_ssl_peer_chain,
284           m_ssl_peer_ip,
285           m_ssl_cipher,
286           m_ssl_cipher_desc,
287           m_ssl_cipher_version,
288           m_ssl_cipher_used_bits,
289           m_ssl_cipher_bits,
290           m_ssl_cert_state;
291 #endif
292
293   bool m_bComplete:1;
294   bool m_bLoadingMainResource:1;
295   bool m_bLoadEventEmitted:1;
296   bool m_bUnloadEventEmitted:1;
297   bool m_haveEncoding:1;
298   bool m_bHTTPRefresh:1;
299   bool m_onlyLocalReferences :1;
300   bool m_redirectLockHistory:1;
301   bool m_redirectUserGesture:1;
302   
303   KURL m_workingURL;
304
305   KIO::CacheControl m_cachePolicy;
306   QTimer m_redirectionTimer;
307   QTime m_parsetime;
308
309   RedirectionScheduled m_scheduledRedirection;
310   double m_delayRedirect;
311   QString m_redirectURL;
312   QString m_redirectReferrer;
313   int m_scheduledHistoryNavigationSteps;
314
315 #if !APPLE_CHANGES
316   KAction *m_paViewDocument;
317   KAction *m_paViewFrame;
318   KAction *m_paSaveBackground;
319   KAction *m_paSaveDocument;
320   KAction *m_paSaveFrame;
321   KAction *m_paSecurity;
322   KSelectAction *m_paSetEncoding;
323   KSelectAction *m_paUseStylesheet;
324   KHTMLZoomFactorAction *m_paIncZoomFactor;
325   KHTMLZoomFactorAction *m_paDecZoomFactor;
326   KAction *m_paLoadImages;
327   KAction *m_paFind;
328   KAction *m_paPrintFrame;
329   KAction *m_paSelectAll;
330   KAction *m_paDebugDOMTree;
331   KAction *m_paDebugRenderTree;
332
333   KParts::PartManager *m_manager;
334
335   QString m_popupMenuXML;
336   KHTMLPart::GUIProfile m_guiProfile;
337 #endif
338
339   int m_zoomFactor;
340
341 #if !APPLE_CHANGES
342   int m_findPos;
343   DOM::NodeImpl *m_findNode;
344 #endif
345
346   QString m_strSelectedURL;
347   QString m_strSelectedURLTarget;
348   QString m_referrer;
349
350   struct SubmitForm
351   {
352     const char *submitAction;
353     QString submitUrl;
354     khtml::FormData submitFormData;
355     QString target;
356     QString submitContentType;
357     QString submitBoundary;
358   };
359
360   SubmitForm *m_submitForm;
361
362   bool m_bMousePressed;
363   khtml::SharedPtr<DOM::NodeImpl> m_mousePressNode; //node under the mouse when the mouse was pressed (set in the mouse handler)
364
365   khtml::ETextGranularity m_selectionGranularity;
366   bool m_beganSelectingText;
367 #if !APPLE_CHANGES
368   QString m_overURL;
369   QString m_overURLTarget;
370 #endif
371
372   khtml::Selection m_selection;
373   khtml::Selection m_dragCaret;
374   khtml::Selection m_mark;
375   int m_caretBlinkTimer;
376
377   bool m_caretVisible:1;
378   bool m_caretBlinks:1;
379   bool m_caretPaint:1;
380   bool m_bDnd:1;
381   bool m_bFirstData:1;
382   bool m_bClearing:1;
383   bool m_bCleared:1;
384   bool m_bSecurityInQuestion:1;
385   bool m_focusNodeRestored:1;
386   bool m_isFocused:1;
387
388   khtml::EditCommandPtr m_lastEditCommand;
389   int m_xPosForVerticalArrowNavigation;
390   DOM::CSSMutableStyleDeclarationImpl *m_typingStyle;
391
392   int m_focusNodeNumber;
393
394   QPoint m_dragStartPos;
395 #ifdef KHTML_NO_SELECTION
396   QPoint m_dragLastPos;
397 #endif
398
399 #if !APPLE_CHANGES
400   QCursor m_linkCursor;
401   QTimer m_scrollTimer;
402
403   unsigned long m_loadedObjects;
404   unsigned long m_totalObjectCount;
405   unsigned int m_jobPercent;
406
407   KHTMLFind *m_findDialog;
408
409   struct findState
410   {
411     findState()
412     { caseSensitive = false; direction = false; }
413     QString text;
414     bool caseSensitive;
415     bool direction;
416   };
417
418   findState m_lastFindState;
419 #endif
420
421   //QGuardedPtr<KParts::Part> m_activeFrame;
422   KParts::Part * m_activeFrame;
423   QGuardedPtr<KHTMLPart> m_opener;
424   bool m_openedByJS;
425   bool m_newJSInterpreterExists; // set to 1 by setOpenedByJS, for window.open
426
427   bool m_bPendingChildRedirection;
428
429   bool m_executingJavaScriptFormAction;
430   
431   bool m_cancelWithLoadInProgress;
432
433   QTimer m_lifeSupportTimer;
434   
435 };
436
437 #endif