1/*
2 * Copyright (C) 2007, 2013 Apple Inc.  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 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 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#include "WebKitDLL.h"
28#include "WebFramePolicyListener.h"
29
30#include "WebFrameLoaderClient.h"
31#include <WebCore/Frame.h>
32#include <WebCore/FrameLoader.h>
33#include <WebCore/FrameLoaderClient.h>
34
35using namespace WebCore;
36
37// WebFramePolicyListener ----------------------------------------------------------------
38
39WebFramePolicyListener::WebFramePolicyListener(PassRefPtr<Frame> frame)
40    : m_refCount(0)
41    , m_frame(frame)
42{
43    gClassCount++;
44    gClassNameCount.add("WebFramePolicyListener");
45}
46
47WebFramePolicyListener::~WebFramePolicyListener()
48{
49    gClassCount--;
50    gClassNameCount.remove("WebFramePolicyListener");
51}
52
53WebFramePolicyListener* WebFramePolicyListener::createInstance(PassRefPtr<Frame> frame)
54{
55    WebFramePolicyListener* instance = new WebFramePolicyListener(frame);
56    instance->AddRef();
57    return instance;
58}
59
60// IUnknown -------------------------------------------------------------------
61
62HRESULT STDMETHODCALLTYPE WebFramePolicyListener::QueryInterface(REFIID riid, void** ppvObject)
63{
64    *ppvObject = 0;
65    if (IsEqualGUID(riid, IID_IUnknown))
66        *ppvObject = static_cast<IWebPolicyDecisionListener*>(this);
67    else if (IsEqualGUID(riid, IID_IWebPolicyDecisionListener))
68        *ppvObject = static_cast<IWebPolicyDecisionListener*>(this);
69    else if (IsEqualGUID(riid, IID_IWebFormSubmissionListener))
70        *ppvObject = static_cast<IWebFormSubmissionListener*>(this);
71    else
72        return E_NOINTERFACE;
73
74    AddRef();
75    return S_OK;
76}
77
78ULONG STDMETHODCALLTYPE WebFramePolicyListener::AddRef(void)
79{
80    return ++m_refCount;
81}
82
83ULONG STDMETHODCALLTYPE WebFramePolicyListener::Release(void)
84{
85    ULONG newRef = --m_refCount;
86    if (!newRef)
87        delete(this);
88
89    return newRef;
90}
91
92// IWebPolicyDecisionListener ------------------------------------------------------------
93
94HRESULT STDMETHODCALLTYPE WebFramePolicyListener::use(void)
95{
96    receivedPolicyDecision(PolicyUse);
97    return S_OK;
98}
99
100HRESULT STDMETHODCALLTYPE WebFramePolicyListener::download(void)
101{
102    receivedPolicyDecision(PolicyDownload);
103    return S_OK;
104}
105
106HRESULT STDMETHODCALLTYPE WebFramePolicyListener::ignore(void)
107{
108    receivedPolicyDecision(PolicyIgnore);
109    return S_OK;
110}
111
112// IWebFormSubmissionListener ------------------------------------------------------------
113
114HRESULT STDMETHODCALLTYPE WebFramePolicyListener::continueSubmit(void)
115{
116    receivedPolicyDecision(PolicyUse);
117    return S_OK;
118}
119
120// WebFramePolicyListener ----------------------------------------------------------------
121void WebFramePolicyListener::receivedPolicyDecision(PolicyAction action)
122{
123    RefPtr<Frame> frame = m_frame.release();
124    if (frame)
125        static_cast<WebFrameLoaderClient&>(frame->loader().client()).receivedPolicyDecision(action);
126}
127
128void WebFramePolicyListener::invalidate()
129{
130    m_frame = 0;
131}
132
133