diff options
Diffstat (limited to 'WebKit/wx/WebFrame.cpp')
| -rw-r--r-- | WebKit/wx/WebFrame.cpp | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/WebKit/wx/WebFrame.cpp b/WebKit/wx/WebFrame.cpp new file mode 100644 index 0000000..b1f03e0 --- /dev/null +++ b/WebKit/wx/WebFrame.cpp @@ -0,0 +1,317 @@ +/* + * Copyright (C) 2007 Kevin Ollivier All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "CString.h" +#include "Document.h" +#include "Editor.h" +#include "Element.h" +#include "Frame.h" +#include "FrameLoader.h" +#include "FrameView.h" +#include "HTMLFrameOwnerElement.h" +#include "markup.h" +#include "Page.h" +#include "RenderTreeAsText.h" +#include "RenderObject.h" +#include "RenderView.h" + +#include "EditorClientWx.h" +#include "FrameLoaderClientWx.h" + +#include "ScriptController.h" +#include "JSDOMBinding.h" +#include <runtime/JSValue.h> +#include <kjs/ustring.h> + +#include "wx/wxprec.h" +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#include "WebFrame.h" +#include "WebView.h" +#include "WebViewPrivate.h" + +#include <wx/defs.h> +#include <wx/dcbuffer.h> + +// Match Safari's min/max zoom sizes by default +#define MinimumTextSizeMultiplier 0.5f +#define MaximumTextSizeMultiplier 3.0f +#define TextSizeMultiplierRatio 1.2f + +wxWebFrame::wxWebFrame(wxWebView* container, wxWebFrame* parent, WebViewFrameData* data) : + m_textMagnifier(1.0), + m_isEditable(false), + m_isInitialized(false), + m_beingDestroyed(false), + m_title(wxEmptyString) +{ + + m_impl = new WebViewPrivate(); + + WebCore::HTMLFrameOwnerElement* parentFrame = 0; + + if (data) { + parentFrame = data->ownerElement; + } + + WebCore::FrameLoaderClientWx* loaderClient = new WebCore::FrameLoaderClientWx(); + + m_impl->frame = WebCore::Frame::create(container->m_impl->page, parentFrame, loaderClient); + m_impl->frame->deref(); + + loaderClient->setFrame(m_impl->frame.get()); + loaderClient->setWebView(container); + + m_impl->frame->init(); + + m_isInitialized = true; +} + +wxWebFrame::~wxWebFrame() +{ + m_impl->frame->loader()->detachFromParent(); +} + +WebCore::Frame* wxWebFrame::GetFrame() +{ + if (m_impl) + return m_impl->frame.get(); + + return 0; +} + +void wxWebFrame::Stop() +{ + if (m_impl->frame && m_impl->frame->loader()) + m_impl->frame->loader()->stop(); +} + +void wxWebFrame::Reload() +{ + if (m_impl->frame && m_impl->frame->loader()) + m_impl->frame->loader()->reload(); +} + +wxString wxWebFrame::GetPageSource() +{ + if (m_impl->frame) { + if (m_impl->frame->view() && m_impl->frame->view()->layoutPending()) + m_impl->frame->view()->layout(); + + WebCore::Document* doc = m_impl->frame->document(); + + if (doc) { + wxString source = createMarkup(doc); + return source; + } + } + return wxEmptyString; +} + +void wxWebFrame::SetPageSource(const wxString& source, const wxString& baseUrl) +{ + if (m_impl->frame && m_impl->frame->loader()) { + WebCore::FrameLoader* loader = m_impl->frame->loader(); + loader->begin(WebCore::KURL(static_cast<const char*>(baseUrl.mb_str(wxConvUTF8)))); + loader->write(source); + loader->end(); + } +} + +wxString wxWebFrame::GetInnerText() +{ + if (m_impl->frame->view() && m_impl->frame->view()->layoutPending()) + m_impl->frame->view()->layout(); + + WebCore::Element *documentElement = m_impl->frame->document()->documentElement(); + return documentElement->innerText(); +} + +wxString wxWebFrame::GetAsMarkup() +{ + if (!m_impl->frame || !m_impl->frame->document()) + return wxEmptyString; + + return createMarkup(m_impl->frame->document()); +} + +wxString wxWebFrame::GetExternalRepresentation() +{ + if (m_impl->frame->view() && m_impl->frame->view()->layoutPending()) + m_impl->frame->view()->layout(); + + return externalRepresentation(m_impl->frame->contentRenderer()); +} + +wxString wxWebFrame::RunScript(const wxString& javascript) +{ + wxString returnValue = wxEmptyString; + if (m_impl->frame) { + JSC::JSValue* result = m_impl->frame->loader()->executeScript(javascript, true); + if (result) + returnValue = wxString(result->toString(m_impl->frame->script()->globalObject()->globalExec()).UTF8String().c_str(), wxConvUTF8); + } + return returnValue; +} + +void wxWebFrame::LoadURL(const wxString& url) +{ + if (m_impl->frame && m_impl->frame->loader()) { + WebCore::KURL kurl = WebCore::KURL(static_cast<const char*>(url.mb_str(wxConvUTF8))); + // NB: This is an ugly fix, but CURL won't load sub-resources if the + // protocol is omitted; sadly, it will not emit an error, either, so + // there's no way for us to catch this problem the correct way yet. + if (kurl.protocol().isEmpty()) { + // is it a file on disk? + if (wxFileExists(url)) { + kurl.setProtocol("file"); + kurl.setPath("//" + kurl.path()); + } + else { + kurl.setProtocol("http"); + kurl.setPath("//" + kurl.path()); + } + } + m_impl->frame->loader()->load(kurl); + } +} + +bool wxWebFrame::GoBack() +{ + if (m_impl->frame && m_impl->frame->page()) + return m_impl->frame->page()->goBack(); + + return false; +} + +bool wxWebFrame::GoForward() +{ + if (m_impl->frame && m_impl->frame->page()) + return m_impl->frame->page()->goForward(); + + return false; +} + +bool wxWebFrame::CanGoBack() +{ + if (m_impl->frame && m_impl->frame->page() && m_impl->frame->page()->backForwardList()) + return m_impl->frame->page()->backForwardList()->backItem() != NULL; + + return false; +} + +bool wxWebFrame::CanGoForward() +{ + if (m_impl->frame && m_impl->frame->page() && m_impl->frame->page()->backForwardList()) + return m_impl->frame->page()->backForwardList()->forwardItem() != NULL; + + return false; +} +bool wxWebFrame::CanIncreaseTextSize() const +{ + if (m_impl->frame) { + if (m_textMagnifier*TextSizeMultiplierRatio <= MaximumTextSizeMultiplier) + return true; + } + return false; +} + +void wxWebFrame::IncreaseTextSize() +{ + if (CanIncreaseTextSize()) { + m_textMagnifier = m_textMagnifier*TextSizeMultiplierRatio; + m_impl->frame->setZoomFactor(m_textMagnifier, true); + } +} + +bool wxWebFrame::CanDecreaseTextSize() const +{ + if (m_impl->frame) { + if (m_textMagnifier/TextSizeMultiplierRatio >= MinimumTextSizeMultiplier) + return true; + } + return false; +} + +void wxWebFrame::DecreaseTextSize() +{ + if (CanDecreaseTextSize()) { + m_textMagnifier = m_textMagnifier/TextSizeMultiplierRatio; + m_impl->frame->setZoomFactor(m_textMagnifier, true); + } +} + +void wxWebFrame::MakeEditable(bool enable) +{ + m_isEditable = enable; +} + + + +bool wxWebFrame::CanCopy() +{ + if (m_impl->frame && m_impl->frame->view()) + return (m_impl->frame->editor()->canCopy() || m_impl->frame->editor()->canDHTMLCopy()); + + return false; +} + +void wxWebFrame::Copy() +{ + if (CanCopy()) + m_impl->frame->editor()->copy(); +} + +bool wxWebFrame::CanCut() +{ + if (m_impl->frame && m_impl->frame->view()) + return (m_impl->frame->editor()->canCut() || m_impl->frame->editor()->canDHTMLCut()); + + return false; +} + +void wxWebFrame::Cut() +{ + if (CanCut()) + m_impl->frame->editor()->cut(); +} + +bool wxWebFrame::CanPaste() +{ + if (m_impl->frame && m_impl->frame->view()) + return (m_impl->frame->editor()->canPaste() || m_impl->frame->editor()->canDHTMLPaste()); + + return false; +} + +void wxWebFrame::Paste() +{ + if (CanPaste()) + m_impl->frame->editor()->paste(); + +} |
