b374113c0772a1c7f26f244083002bb3aae8c8a9
[WebKit-https.git] / Source / WebKit / wx / WebFrame.cpp
1 /*
2  * Copyright (C) 2007 Kevin Ollivier  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
28 #include "Document.h"
29 #include "Editor.h"
30 #include "Element.h"
31 #include "EventHandler.h"
32 #include "FloatRect.h"
33 #include "FormState.h"
34 #include "Frame.h"
35 #include "FrameLoader.h"
36 #include "FrameLoaderClientWx.h"
37 #include "FrameView.h"
38 #include "GraphicsContext.h"
39 #include "HitTestResult.h"
40 #include "HostWindow.h"
41 #include "HTMLFormElement.h"
42 #include "HTMLFrameOwnerElement.h"
43 #include "markup.h"
44 #include "Page.h"
45 #include "PrintContext.h"
46 #include "RenderTreeAsText.h"
47 #include "RenderObject.h"
48 #include "RenderView.h"
49 #include "ScriptController.h"
50 #include "ScriptValue.h"
51 #include "SubstituteData.h"
52 #include "TextEncoding.h"
53
54 #include "JSDOMBinding.h"
55 #include <runtime/JSValue.h>
56 #include <wtf/text/CString.h>
57 #include <wtf/text/WTFString.h>
58
59 #include "EditorClientWx.h"
60 #include "FrameLoaderClientWx.h"
61
62 #include "wx/wxprec.h"
63 #ifndef WX_PRECOMP
64     #include "wx/wx.h"
65 #endif
66
67 #include "WebDOMNode.h"
68
69 #include "WebDOMSelection.h"
70 #include "WebFrame.h"
71 #include "WebView.h"
72 #include "WebFramePrivate.h"
73 #include "WebViewPrivate.h"
74
75 #include <algorithm>
76
77 #include <wx/defs.h>
78 #include <wx/dc.h>
79 #include <wx/dcbuffer.h>
80 #include <wx/dcgraph.h>
81 #include <wx/graphics.h>
82 #include <wx/print.h>
83 #include <wx/printdlg.h>
84
85 // Match Safari's min/max zoom sizes by default
86 #define MinimumTextSizeMultiplier       0.5f
87 #define MaximumTextSizeMultiplier       3.0f
88 #define TextSizeMultiplierRatio         1.2f
89
90 namespace WebKit {
91
92 using namespace std;
93
94 // we need wxGraphicsContext and wxPrinterDC to work together, 
95 // which requires wx 2.9.x.
96 #if wxCHECK_VERSION(2, 9, 1)
97 class wxWebFramePrintout : public wxPrintout {
98 public:
99     wxWebFramePrintout(WebCore::Frame* frame) :
100         m_frame(frame),
101         m_printContext(frame),
102         m_pageWidth(0.0),
103         m_fromPage(1),
104         m_toPage(1),
105         m_isPrinting(false)
106     {
107     }
108
109     ~wxWebFramePrintout() 
110     {
111         if (m_isPrinting)
112             m_printContext.end();
113     }
114   
115     int GetPageCount() { return m_printContext.pageCount(); }
116     void SetFirstPage(int page) { m_fromPage = page; }
117     void SetLastPage(int page) { m_toPage = page; }
118
119     void InitializeWithPageSize(wxRect pageRect, bool isMM = true)
120     {
121         if (isMM) {
122             double mmToPoints = 2.8346;
123             // convert mm to points
124             pageRect.x = pageRect.x * mmToPoints;
125             pageRect.y = pageRect.y * mmToPoints;
126             pageRect.width = pageRect.width * mmToPoints;
127             pageRect.height = pageRect.height * mmToPoints;
128         }
129         m_pageWidth = pageRect.width;
130         m_printContext.begin(m_pageWidth, pageRect.height);
131         // isPrinting is from the perspective of the PrintContext, so we need this when we call begin.
132         m_isPrinting = true;
133
134         float pageHeight = pageRect.height;
135         m_printContext.computePageRects(WebCore::FloatRect(pageRect), /* headerHeight */ 0, /* footerHeight */ 0, /* userScaleFactor */ 1.0, pageHeight);
136     }
137     
138     void OnPreparePrinting()
139     {
140         wxPrinterDC* pdc = dynamic_cast<wxPrinterDC*>(GetDC());
141         pdc->SetMapMode(wxMM_POINTS);
142         int pixelsW = 0;
143         int pixelsH = 0;
144         pdc->GetSize(&pixelsW, &pixelsH);
145         pixelsW = pdc->DeviceToLogicalXRel(pixelsW);
146         pixelsH = pdc->DeviceToLogicalYRel(pixelsH);
147 #if __WXMSW__
148         // on Windows, the context has no margins, so add them ourselves.
149         pixelsW -= 30;
150         pixelsH -= 30;
151 #endif
152         InitializeWithPageSize(wxRect(0, 0, pixelsW, pixelsH), false);
153     }
154     
155     void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo)
156     {
157         if (minPage)
158             *minPage = 1;
159         if (maxPage)
160             *maxPage = m_printContext.pageCount();
161         if (pageFrom)
162             *pageFrom = m_fromPage;
163         if (pageTo)
164             *pageTo = m_toPage;
165     }
166     
167     bool HasPage(int pageNum)
168     {
169         return pageNum <= m_printContext.pageCount() && pageNum >= m_fromPage && pageNum <= m_toPage;
170     }
171     
172     bool OnPrintPage(int pageNum)
173     {
174         wxPrinterDC* pdc = dynamic_cast<wxPrinterDC*>(GetDC());
175         wxGraphicsRenderer* renderer = 0;
176 #if wxCHECK_VERSION(2, 9, 2) && defined(wxUSE_CAIRO) && wxUSE_CAIRO
177         renderer = wxGraphicsRenderer::GetCairoRenderer();
178 #endif
179         if (!renderer)
180             renderer = wxGraphicsRenderer::GetDefaultRenderer();
181         ASSERT(renderer);
182         wxGraphicsContext* context = renderer->CreateContext(*pdc);
183         wxGCDC gcdc(context);
184 #if __WXMSW__
185         // see comment above about Windows contexts not having margins set.
186         gcdc.SetDeviceOrigin(15, 15);
187 #endif
188         if (!gcdc.IsOk())
189             return false;
190
191         WebCore::GraphicsContext ctx(&gcdc);
192         m_printContext.spoolPage(ctx, pageNum - 1, m_pageWidth);
193         
194         return true;
195     }
196     
197     void OnEndPrinting()
198     {
199         m_printContext.end();
200         m_isPrinting = false;
201     }
202     
203 private:
204     float m_pageWidth;
205     int m_fromPage;
206     int m_toPage;
207     bool m_isPrinting;
208     WebCore::Frame *m_frame;
209     WebCore::PrintContext m_printContext;
210 };
211 #endif
212
213 WebFrame* kit(WebCore::Frame* frame)
214 {
215     if (!frame)
216         return 0;
217     if (!frame->loader())
218         return 0;
219     
220     WebCore::FrameLoaderClientWx* loaderClient = dynamic_cast<WebCore::FrameLoaderClientWx*>(frame->loader()->client());
221     if (loaderClient)
222         return loaderClient->webFrame();
223     
224     return 0;
225 }
226
227 WebFrame::WebFrame(WebView* container, WebFrame* parent, WebViewFrameData* data) :
228     m_textMagnifier(1.0),
229     m_isInitialized(false),
230     m_beingDestroyed(false)
231 {
232
233     m_impl = new WebFramePrivate();
234  
235     WebCore::HTMLFrameOwnerElement* parentFrame = 0;
236     
237     if (data) {
238         parentFrame = data->ownerElement;
239     }
240     
241     WebCore::FrameLoaderClientWx* loaderClient = new WebCore::FrameLoaderClientWx();
242     RefPtr<WebCore::Frame> newFrame = WebCore::Frame::create(container->m_impl->page, parentFrame, loaderClient);
243
244     m_impl->frame = newFrame.get();
245
246     if (data)
247         newFrame->tree()->setName(data->name);
248
249     // Subframes expect to be added to the FrameTree before init is called.
250     if (parentFrame)
251         parentFrame->document()->frame()->tree()->appendChild(newFrame.get());
252     
253     loaderClient->setFrame(this);
254     loaderClient->setWebView(container);
255     
256     if (data && data->ownerElement)
257         m_impl->frame->ref();
258
259     m_impl->frame->init();
260         
261     m_isInitialized = true;
262 }
263
264 WebFrame::~WebFrame()
265 {
266     if (m_impl)
267         delete m_impl;
268 }
269
270 wxString WebFrame::GetName()
271 {
272     if (m_impl && m_impl->frame && m_impl->frame->tree())
273         return m_impl->frame->tree()->name().string();
274     return wxEmptyString;
275 }
276
277 WebCore::Frame* WebFrame::GetFrame()
278 {
279     if (m_impl)
280         return m_impl->frame;
281         
282     return 0;
283 }
284
285 void WebFrame::Stop()
286 {
287     if (m_impl->frame && m_impl->frame->loader())
288         m_impl->frame->loader()->stop();
289 }
290
291 void WebFrame::Reload()
292 {
293     if (m_impl->frame && m_impl->frame->loader())
294         m_impl->frame->loader()->reload();
295 }
296
297 wxString WebFrame::GetPageSource()
298 {
299     if (m_impl->frame) {
300         if (m_impl->frame->view() && m_impl->frame->view()->layoutPending())
301             m_impl->frame->view()->layout();
302     
303         WebCore::Document* doc = m_impl->frame->document();
304         
305         if (doc) {
306             wxString source = createMarkup(doc);
307             return source;
308         }
309     }
310     return wxEmptyString;
311 }
312
313 void WebFrame::SetPageSource(const wxString& source, const wxString& baseUrl, const wxString& mimetype)
314 {
315     if (m_impl->frame && m_impl->frame->loader()) {
316         WebCore::KURL url(WebCore::KURL(), baseUrl);
317
318         const wxCharBuffer charBuffer(source.utf8_str());
319         const char* contents = charBuffer;
320
321         WTF::PassRefPtr<WebCore::SharedBuffer> sharedBuffer = WebCore::SharedBuffer::create(contents, strlen(contents));
322         WebCore::SubstituteData substituteData(sharedBuffer, mimetype, WTF::String("UTF-8"), WebCore::blankURL(), url);
323
324         m_impl->frame->loader()->stop();
325         m_impl->frame->loader()->load(WebCore::ResourceRequest(url), substituteData, false);
326     }
327 }
328
329 wxString WebFrame::GetInnerText()
330 {
331     if (m_impl->frame->view() && m_impl->frame->view()->layoutPending())
332         m_impl->frame->view()->layout();
333         
334     WebCore::Element *documentElement = m_impl->frame->document()->documentElement();
335     return documentElement->innerText();
336 }
337
338 wxString WebFrame::GetAsMarkup()
339 {
340     if (!m_impl->frame || !m_impl->frame->document())
341         return wxEmptyString;
342
343     return createMarkup(m_impl->frame->document());
344 }
345
346 wxString WebFrame::GetExternalRepresentation()
347 {
348     if (m_impl->frame->view() && m_impl->frame->view()->layoutPending())
349         m_impl->frame->view()->layout();
350
351     return externalRepresentation(m_impl->frame);
352 }
353
354 wxString WebFrame::GetSelectionAsHTML()
355 {
356     if (m_impl->frame)
357         return m_impl->frame->selection()->toNormalizedRange()->toHTML();
358         
359     return wxEmptyString;
360 }
361
362 wxString WebFrame::GetSelectionAsText()
363 {
364     if (m_impl->frame)
365         return m_impl->frame->selection()->toNormalizedRange()->text();
366         
367     return wxEmptyString;
368 }
369
370 WebKitSelection WebFrame::GetSelection()
371 {
372     if (m_impl->frame)
373         return WebKitSelection(m_impl->frame->selection());
374         
375     return 0;
376 }
377
378 wxString WebFrame::RunScript(const wxString& javascript)
379 {
380     wxString returnValue = wxEmptyString;
381     if (m_impl->frame && m_impl->frame->loader()) {
382         bool hasLoaded = m_impl->frame->loader()->frameHasLoaded();
383         wxASSERT_MSG(hasLoaded, wxT("Document must be loaded before calling RunScript."));
384         if (hasLoaded) {
385             WebCore::ScriptController* controller = m_impl->frame->script();
386             bool jsEnabled = controller->canExecuteScripts(WebCore::AboutToExecuteScript); 
387             wxASSERT_MSG(jsEnabled, wxT("RunScript requires JavaScript to be enabled."));
388             if (jsEnabled) {
389                 JSC::JSValue result = controller->executeScript(javascript, true).jsValue();
390                 if (result) {
391                     JSC::ExecState* exec = m_impl->frame->script()->globalObject(WebCore::mainThreadNormalWorld())->globalExec();
392                     returnValue = wxString(result.toString(exec)->value(exec).utf8().data(), wxConvUTF8);
393                 }
394             }
395         }
396     }
397     return returnValue;
398 }
399
400 bool WebFrame::ExecuteEditCommand(const wxString& command, const wxString& parameter)
401 {
402     if (m_impl->frame && IsEditable())
403         return m_impl->frame->editor()->command(command).execute(parameter);
404 }
405
406 EditState WebFrame::GetEditCommandState(const wxString& command) const
407 {
408     if (m_impl->frame && IsEditable()) { 
409         WebCore::TriState state = m_impl->frame->editor()->command(command).state();
410         if (state == WebCore::TrueTriState)
411             return EditStateTrue;
412         if (state == WebCore::FalseTriState)
413             return EditStateFalse;
414
415         return EditStateMixed;
416     }
417         
418     return EditStateFalse;
419 }
420
421 wxString WebFrame::GetEditCommandValue(const wxString& command) const
422 {
423     if (m_impl->frame && IsEditable())
424         return m_impl->frame->editor()->command(command).value();
425         
426     return wxEmptyString;
427 }
428
429
430 bool WebFrame::FindString(const wxString& string, bool forward, bool caseSensitive, bool wrapSelection, bool startInSelection)
431 {
432     if (m_impl->frame)
433         return m_impl->frame->editor()->findString(string, forward, caseSensitive, wrapSelection, startInSelection);
434
435     return false;
436 }
437
438 void WebFrame::LoadURL(const wxString& url)
439 {
440     if (m_impl->frame && m_impl->frame->loader()) {
441         WebCore::KURL kurl = WebCore::KURL(WebCore::KURL(), url, WebCore::UTF8Encoding());
442         // NB: This is an ugly fix, but CURL won't load sub-resources if the
443         // protocol is omitted; sadly, it will not emit an error, either, so
444         // there's no way for us to catch this problem the correct way yet.
445         if (kurl.protocol().isEmpty()) {
446             // is it a file on disk?
447             if (wxFileExists(url)) {
448                 kurl.setProtocol("file");
449                 kurl.setPath("//" + kurl.path());
450             }
451             else {
452                 kurl.setProtocol("http");
453                 kurl.setPath("//" + kurl.path());
454             }
455         }
456         m_impl->frame->loader()->load(kurl, false);
457     }
458 }
459
460 wxString WebFrame::GetURL() const
461 {
462     if (m_impl->frame && m_impl->frame->document())
463         return m_impl->frame->document()->url().string();
464     
465     return wxEmptyString;
466 }
467
468
469 bool WebFrame::GoBack()
470 {
471     if (m_impl->frame && m_impl->frame->page())
472         return m_impl->frame->page()->goBack();
473
474     return false;
475 }
476
477 bool WebFrame::GoForward()
478 {
479     if (m_impl->frame && m_impl->frame->page())
480         return m_impl->frame->page()->goForward();
481
482     return false;
483 }
484
485 bool WebFrame::CanGoBack()
486 {
487     if (m_impl->frame && m_impl->frame->page())
488         return m_impl->frame->page()->canGoBackOrForward(-1);
489
490     return false;
491 }
492
493 bool WebFrame::CanGoForward()
494 {
495     if (m_impl->frame && m_impl->frame->page())
496         return m_impl->frame->page()->canGoBackOrForward(1);
497
498     return false;
499 }
500
501 void WebFrame::Undo()
502 {
503     if (m_impl->frame && m_impl->frame->editor() && CanUndo())
504         return m_impl->frame->editor()->undo();
505 }
506
507 void WebFrame::Redo()
508 {
509     if (m_impl->frame && m_impl->frame->editor() && CanRedo())
510         return m_impl->frame->editor()->redo();
511 }
512
513 bool WebFrame::CanUndo()
514 {
515     if (m_impl->frame && m_impl->frame->editor())
516         return m_impl->frame->editor()->canUndo();
517
518     return false;
519 }
520
521 bool WebFrame::CanRedo()
522 {
523     if (m_impl->frame && m_impl->frame->editor())
524         return m_impl->frame->editor()->canRedo();
525
526     return false;
527 }
528
529 bool WebFrame::CanIncreaseTextSize() const
530 {
531     if (m_impl->frame && m_impl->frame->view()) {
532         if (m_textMagnifier*TextSizeMultiplierRatio <= MaximumTextSizeMultiplier)
533             return true;
534     }
535     return false;
536 }
537
538 void WebFrame::IncreaseTextSize()
539 {
540     if (CanIncreaseTextSize()) {
541         m_textMagnifier = m_textMagnifier*TextSizeMultiplierRatio;
542         m_impl->frame->setTextZoomFactor(m_textMagnifier);
543     }
544 }
545
546 bool WebFrame::CanDecreaseTextSize() const
547 {
548     if (m_impl->frame && m_impl->frame->view()) {
549         if (m_textMagnifier/TextSizeMultiplierRatio >= MinimumTextSizeMultiplier)
550             return true;
551     }
552     return false;
553 }
554
555 void WebFrame::DecreaseTextSize()
556 {        
557     if (CanDecreaseTextSize()) {
558         m_textMagnifier = m_textMagnifier/TextSizeMultiplierRatio;
559         m_impl->frame->setTextZoomFactor(m_textMagnifier);
560     }
561 }
562
563 void WebFrame::ResetTextSize()
564 {
565     m_textMagnifier = 1.0;
566     if (m_impl->frame)
567         m_impl->frame->setTextZoomFactor(m_textMagnifier);
568 }
569
570 void WebFrame::MakeEditable(bool enable)
571 {
572     if (enable != IsEditable() && m_impl->frame && m_impl->frame->page())
573         m_impl->frame->page()->setEditable(enable);
574 }
575
576 bool WebFrame::IsEditable() const
577 {
578     if (m_impl->frame && m_impl->frame->page())
579         return m_impl->frame->page()->isEditable();
580     return false;
581 }
582
583 bool WebFrame::CanCopy()
584 {
585     if (m_impl->frame && m_impl->frame->view())
586         return (m_impl->frame->editor()->canCopy() || m_impl->frame->editor()->canDHTMLCopy());
587
588     return false;
589 }
590
591 void WebFrame::Copy()
592 {
593     if (CanCopy())
594         m_impl->frame->editor()->copy();
595 }
596
597 bool WebFrame::CanCut()
598 {
599     if (m_impl->frame && m_impl->frame->view())
600         return (m_impl->frame->editor()->canCut() || m_impl->frame->editor()->canDHTMLCut());
601
602     return false;
603 }
604
605 void WebFrame::Cut()
606 {
607     if (CanCut())
608         m_impl->frame->editor()->cut();
609 }
610
611 bool WebFrame::CanPaste()
612 {
613     if (m_impl->frame && m_impl->frame->view())
614         return (m_impl->frame->editor()->canPaste() || m_impl->frame->editor()->canDHTMLPaste());
615
616     return false;
617 }
618
619 void WebFrame::Paste()
620 {
621     if (CanPaste())
622         m_impl->frame->editor()->paste();
623
624 }
625
626 void WebFrame::Print(bool showDialog)
627 {
628 #if wxCHECK_VERSION(2, 9, 1)
629     if (!m_impl->frame)
630         return;
631     
632     wxPrintDialogData printdata;
633     printdata.GetPrintData().SetPrintMode(wxPRINT_MODE_PRINTER);
634     printdata.GetPrintData().SetNoCopies(1);
635 #if wxCHECK_VERSION(2, 9, 2)
636     printdata.GetPrintData().ConvertFromNative();
637 #endif
638
639     // make sure we have a valid paper type, if we don't, the to / from pages will both be 0
640     // and the dialog won't show.
641     if (printdata.GetPrintData().GetPaperId() == wxPAPER_NONE)
642         printdata.GetPrintData().SetPaperId(wxPAPER_LETTER);
643
644     wxPageSetupDialogData pageSetup(printdata.GetPrintData());
645
646     wxRect paperSize = pageSetup.GetPaperSize();
647     // The paper size includes the non-printable areas of the page.
648     // Guesstimate the printable page margins until we find a way to precisely
649     // calculate the margins used by the device context on Mac.
650     paperSize.Deflate(15, 15);
651
652     wxWebFramePrintout* printout = new wxWebFramePrintout(m_impl->frame);
653     printout->InitializeWithPageSize(paperSize);
654     
655     int pages = printout->GetPageCount();
656     ASSERT(pages > 0);
657
658     printdata.SetMinPage(1);
659     printdata.SetMaxPage(pages);
660     printdata.SetFromPage(1);
661     printdata.SetToPage(pages);
662
663     bool shouldPrint = true;
664     if (showDialog) {
665         wxPrintDialog dialog(0, &printdata);
666         shouldPrint = (dialog.ShowModal() == wxID_OK);
667         if (shouldPrint) {
668             printdata = dialog.GetPrintDialogData();            
669             printout->SetFirstPage(printdata.GetFromPage());
670             printout->SetLastPage(printdata.GetToPage());
671         }
672     }
673     
674     if (shouldPrint) {
675         wxPrinter printer(&printdata);
676         printer.Print(0, printout, false);
677     }
678     
679     if (printout)
680         delete printout;
681         
682 #else
683     wxFAIL_MSG(wxT("Printing is only supported in wxWidgets 2.9.1 and above."));
684 #endif
685 }
686
687 WebViewDOMElementInfo WebFrame::HitTest(const wxPoint& pos) const
688 {
689     WebViewDOMElementInfo domInfo;
690
691     if (m_impl->frame->view()) {
692         WebCore::HitTestResult result = m_impl->frame->eventHandler()->hitTestResultAtPoint(m_impl->frame->view()->windowToContents(pos), false);
693         if (result.innerNode()) {
694             domInfo.SetLink(result.absoluteLinkURL().string());
695             domInfo.SetText(result.textContent());
696             domInfo.SetImageSrc(result.absoluteImageURL().string());
697             domInfo.SetSelected(result.isSelected());
698         }
699     }
700
701     return domInfo;
702 }
703
704 bool WebFrame::ShouldClose() const
705 {
706     if (m_impl->frame)
707         return m_impl->frame->loader()->shouldClose();
708
709     return true;
710 }
711
712 WebKitCompatibilityMode WebFrame::GetCompatibilityMode() const
713 {
714     if (m_impl->frame && m_impl->frame->document())
715         return (WebKitCompatibilityMode)m_impl->frame->document()->compatibilityMode();
716
717     return QuirksMode;
718 }
719
720 void WebFrame::GrantUniversalAccess()
721 {
722     if (m_impl->frame && m_impl->frame->document())
723         m_impl->frame->document()->securityOrigin()->grantUniversalAccess();
724 }
725
726 }