blob: 436054fd9ddb47ca3296b117981434ec1897dad1 [file] [log] [blame]
/*
* Copyright (C) 2006-2007, 2011, 2013-2015 Apple Inc. 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 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 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.
*/
#ifndef WebFrame_H
#define WebFrame_H
#include "WebKit.h"
#include "WebDataSource.h"
#include "AccessibleDocument.h"
#include <WebCore/AdjustViewSizeOrNot.h>
#include <WebCore/FrameWin.h>
#include <WebCore/GraphicsContext.h>
#include <WebCore/ResourceHandleClient.h>
#include <sal.h>
#include <wtf/RefPtr.h>
#include <wtf/URL.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
class AuthenticationChallenge;
class DocumentLoader;
class Element;
class FloatSize;
class Frame;
class GraphicsContext;
class HTMLFrameOwnerElement;
class IntRect;
class Page;
class ResourceError;
class SharedBuffer;
}
typedef const struct OpaqueJSContext* JSContextRef;
typedef struct OpaqueJSValue* JSObjectRef;
#if USE(CG)
typedef struct CGContext PlatformGraphicsContext;
#elif USE(CAIRO)
namespace WebCore {
class GraphicsContextCairo;
}
typedef class WebCore::GraphicsContextCairo PlatformGraphicsContext;
#endif
class WebFrame;
class WebFramePolicyListener;
class WebHistory;
class WebView;
interface IWebHistoryItemPrivate;
WebFrame* kit(WebCore::Frame*);
WEBKIT_API WebCore::Frame* core(WebFrame*);
class DECLSPEC_UUID("{A3676398-4485-4a9d-87DC-CB5A40E6351D}") WebFrame final : public IWebFrame2, IWebFramePrivate, IWebDocumentText
{
public:
static WebFrame* createInstance();
// IUnknown
virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
//IWebFrame
virtual HRESULT STDMETHODCALLTYPE name(_Deref_opt_out_ BSTR* frameName);
virtual HRESULT STDMETHODCALLTYPE webView(_COM_Outptr_opt_ IWebView**);
virtual HRESULT STDMETHODCALLTYPE frameView(_COM_Outptr_opt_ IWebFrameView**);
virtual HRESULT STDMETHODCALLTYPE DOMDocument(_COM_Outptr_opt_ IDOMDocument**);
virtual HRESULT STDMETHODCALLTYPE DOMWindow(_COM_Outptr_opt_ IDOMWindow**);
virtual HRESULT STDMETHODCALLTYPE frameElement(_COM_Outptr_opt_ IDOMHTMLElement** frameElement);
virtual HRESULT STDMETHODCALLTYPE loadRequest(_In_opt_ IWebURLRequest*);
virtual HRESULT STDMETHODCALLTYPE loadData(_In_opt_ IStream* data, _In_ BSTR mimeType, _In_ BSTR textEncodingName, _In_ BSTR url);
virtual HRESULT STDMETHODCALLTYPE loadHTMLString(_In_ BSTR, _In_ BSTR baseURL);
virtual HRESULT STDMETHODCALLTYPE loadAlternateHTMLString(_In_ BSTR, _In_ BSTR baseURL, _In_ BSTR unreachableURL);
virtual HRESULT STDMETHODCALLTYPE loadArchive(_In_opt_ IWebArchive*);
virtual HRESULT STDMETHODCALLTYPE dataSource(_COM_Outptr_opt_ IWebDataSource**);
virtual HRESULT STDMETHODCALLTYPE provisionalDataSource(_COM_Outptr_opt_ IWebDataSource**);
virtual HRESULT STDMETHODCALLTYPE stopLoading();
virtual HRESULT STDMETHODCALLTYPE reload();
virtual HRESULT STDMETHODCALLTYPE findFrameNamed(_In_ BSTR name, _COM_Outptr_opt_ IWebFrame**);
virtual HRESULT STDMETHODCALLTYPE parentFrame(_COM_Outptr_opt_ IWebFrame**);
virtual HRESULT STDMETHODCALLTYPE childFrames(_COM_Outptr_opt_ IEnumVARIANT** enumFrames);
virtual HRESULT STDMETHODCALLTYPE currentForm(_COM_Outptr_opt_ IDOMElement**);
virtual /* [local] */ JSGlobalContextRef STDMETHODCALLTYPE globalContext();
// IWebFramePrivate
virtual HRESULT STDMETHODCALLTYPE unused1() { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE unused5() { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE pageNumberForElementById(_In_ BSTR id, float pageWidthInPixels, float pageHeightInPixels, _Out_ int* pageNumber);
virtual HRESULT STDMETHODCALLTYPE numberOfPages(float pageWidthInPixels, float pageHeightInPixels, _Out_ int* pageCount);
virtual HRESULT STDMETHODCALLTYPE scrollOffset(_Out_ SIZE*);
virtual HRESULT STDMETHODCALLTYPE layout();
virtual HRESULT STDMETHODCALLTYPE firstLayoutDone(_Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE unused2() { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE pendingFrameUnloadEventCount(_Out_ UINT*);
virtual HRESULT STDMETHODCALLTYPE unused3() { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE setInPrintingMode(BOOL value, _In_ HDC printDC);
virtual HRESULT STDMETHODCALLTYPE getPrintedPageCount(_In_ HDC printDC, _Out_ UINT* pageCount);
virtual HRESULT STDMETHODCALLTYPE spoolPages(HDC printDC, UINT startPage, UINT endPage, void* ctx);
virtual HRESULT STDMETHODCALLTYPE isFrameSet(_Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE string(_Deref_opt_out_ BSTR*);
virtual HRESULT STDMETHODCALLTYPE size(_Out_ SIZE*);
virtual HRESULT STDMETHODCALLTYPE hasScrollBars(_Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE contentBounds(_Out_ RECT*);
virtual HRESULT STDMETHODCALLTYPE frameBounds(_Out_ RECT*);
virtual HRESULT STDMETHODCALLTYPE isDescendantOfFrame(_In_opt_ IWebFrame* ancestor, _Out_ BOOL* result);
virtual HRESULT STDMETHODCALLTYPE setAllowsScrolling(BOOL);
virtual HRESULT STDMETHODCALLTYPE allowsScrolling(_Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE setIsDisconnected(BOOL);
virtual HRESULT STDMETHODCALLTYPE setExcludeFromTextSearch(BOOL);
virtual HRESULT STDMETHODCALLTYPE reloadFromOrigin();
virtual HRESULT STDMETHODCALLTYPE paintDocumentRectToContext(RECT, _In_ HDC);
virtual HRESULT STDMETHODCALLTYPE paintScrollViewRectToContextAtPoint(RECT, POINT, _In_ HDC);
virtual HRESULT STDMETHODCALLTYPE elementDoesAutoComplete(_In_opt_ IDOMElement*, _Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE loadPlainTextString(_In_ BSTR, _In_ BSTR url);
virtual HRESULT STDMETHODCALLTYPE isDisplayingStandaloneImage(_Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE allowsFollowingLink(_In_ BSTR, _Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE stringByEvaluatingJavaScriptInScriptWorld(IWebScriptWorld*, JSObjectRef, BSTR script, BSTR* evaluationResult);
virtual JSGlobalContextRef STDMETHODCALLTYPE globalContextForScriptWorld(IWebScriptWorld*);
virtual HRESULT STDMETHODCALLTYPE visibleContentRect(_Out_ RECT*);
virtual HRESULT STDMETHODCALLTYPE layerTreeAsText(_Deref_out_opt_ BSTR*);
virtual HRESULT STDMETHODCALLTYPE hasSpellingMarker(UINT from, UINT length, BOOL* result);
virtual HRESULT STDMETHODCALLTYPE clearOpener();
virtual HRESULT STDMETHODCALLTYPE setTextDirection(_In_ BSTR);
virtual HRESULT STDMETHODCALLTYPE unused4() { return E_NOTIMPL; }
virtual HRESULT STDMETHODCALLTYPE renderTreeAsExternalRepresentation(unsigned options, _Deref_opt_out_ BSTR* result);
virtual HRESULT STDMETHODCALLTYPE renderTreeAsExternalRepresentationForPrinting(_Deref_opt_out_ BSTR* result);
// IWebDocumentText
virtual HRESULT STDMETHODCALLTYPE supportsTextEncoding(_Out_ BOOL*);
virtual HRESULT STDMETHODCALLTYPE selectedString(_Deref_opt_out_ BSTR*);
virtual HRESULT STDMETHODCALLTYPE selectAll();
virtual HRESULT STDMETHODCALLTYPE deselectAll();
// IWebFrame2:
virtual HRESULT STDMETHODCALLTYPE isMainFrame(_Out_ BOOL*);
// FrameLoaderClient
virtual void frameLoaderDestroyed();
// WebFrame
Ref<WebCore::Frame> createSubframeWithOwnerElement(IWebView*, WebCore::Page*, WebCore::HTMLFrameOwnerElement*);
void initWithWebView(IWebView*, WebCore::Page*);
WebCore::Frame* impl();
void invalidate();
void unmarkAllMisspellings();
void unmarkAllBadGrammar();
void updateBackground();
// WebFrame (matching WebCoreFrameBridge)
HRESULT inViewSourceMode(BOOL *flag);
HRESULT setInViewSourceMode(BOOL flag);
HRESULT elementWithName(BSTR name, IDOMElement* form, IDOMElement** element);
HRESULT formForElement(IDOMElement* element, IDOMElement** form);
HRESULT controlsInForm(IDOMElement* form, IDOMElement** controls, int* cControls);
HRESULT elementIsPassword(IDOMElement* element, bool* result);
HRESULT searchForLabelsBeforeElement(const BSTR* labels, unsigned cLabels, IDOMElement* beforeElement, unsigned* resultDistance, BOOL* resultIsInCellAbove, BSTR* result);
HRESULT matchLabelsAgainstElement(const BSTR* labels, int cLabels, IDOMElement* againstElement, BSTR* result);
HRESULT canProvideDocumentSource(bool* result);
URL url() const;
WebView* webView() const;
void setWebView(WebView*);
COMPtr<IAccessible> accessible() const;
private:
WebFrame();
~WebFrame();
void loadHTMLString(_In_ BSTR string, _In_ BSTR baseURL, _In_ BSTR unreachableURL);
void loadData(Ref<WebCore::SharedBuffer>&&, BSTR mimeType, BSTR textEncodingName, BSTR baseURL, BSTR failingURL);
const Vector<WebCore::IntRect>& computePageRects(HDC printDC);
void setPrinting(bool printing, const WebCore::FloatSize& pageSize, const WebCore::FloatSize& originalPageSize, float maximumShrinkRatio, WebCore::AdjustViewSizeOrNot);
void headerAndFooterHeights(float*, float*);
WebCore::IntRect printerMarginRect(HDC);
void spoolPage (PlatformGraphicsContext* pctx, WebCore::GraphicsContext& spoolCtx, HDC printDC, IWebUIDelegate*, float headerHeight, float footerHeight, UINT page, UINT pageCount);
void drawHeader(PlatformGraphicsContext* pctx, IWebUIDelegate*, const WebCore::IntRect& pageRect, float headerHeight);
void drawFooter(PlatformGraphicsContext* pctx, IWebUIDelegate*, const WebCore::IntRect& pageRect, UINT page, UINT pageCount, float headerHeight, float footerHeight);
ULONG m_refCount { 0 };
class WebFramePrivate;
WebFramePrivate* d;
bool m_quickRedirectComing { false };
URL m_originalRequestURL;
bool m_inPrintingMode { false };
Vector<WebCore::IntRect> m_pageRects;
int m_pageHeight { 0 }; // height of the page adjusted by margins
mutable COMPtr<AccessibleDocument> m_accessible;
};
#endif