2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #include "PolicyDelegate.h"
32 #include "DumpRenderTree.h"
33 #include "LayoutTestController.h"
38 static wstring dumpPath(IDOMNode* node)
45 if (FAILED(node->nodeName(&name)))
47 result.assign(name, SysStringLen(name));
50 COMPtr<IDOMNode> parent;
51 if (SUCCEEDED(node->parentNode(&parent)))
52 result += TEXT(" > ") + dumpPath(parent.get());
57 PolicyDelegate::PolicyDelegate()
59 , m_permissiveDelegate(false)
60 , m_controllerToNotifyDone(0)
65 HRESULT STDMETHODCALLTYPE PolicyDelegate::QueryInterface(REFIID riid, void** ppvObject)
68 if (IsEqualGUID(riid, IID_IUnknown))
69 *ppvObject = static_cast<IWebPolicyDelegate*>(this);
70 else if (IsEqualGUID(riid, IID_IWebPolicyDelegate))
71 *ppvObject = static_cast<IWebPolicyDelegate*>(this);
79 ULONG STDMETHODCALLTYPE PolicyDelegate::AddRef(void)
84 ULONG STDMETHODCALLTYPE PolicyDelegate::Release(void)
86 ULONG newRef = --m_refCount;
93 HRESULT STDMETHODCALLTYPE PolicyDelegate::decidePolicyForNavigationAction(
94 /*[in]*/ IWebView* /*webView*/,
95 /*[in]*/ IPropertyBag* actionInformation,
96 /*[in]*/ IWebURLRequest* request,
97 /*[in]*/ IWebFrame* frame,
98 /*[in]*/ IWebPolicyDecisionListener* listener)
102 wstring wurl = urlSuitableForTestResult(wstring(url, SysStringLen(url)));
106 if (SUCCEEDED(actionInformation->Read(WebActionNavigationTypeKey, &var, 0))) {
108 navType = V_I4(&var);
111 LPCTSTR typeDescription;
113 case WebNavigationTypeLinkClicked:
114 typeDescription = TEXT("link clicked");
116 case WebNavigationTypeFormSubmitted:
117 typeDescription = TEXT("form submitted");
119 case WebNavigationTypeBackForward:
120 typeDescription = TEXT("back/forward");
122 case WebNavigationTypeReload:
123 typeDescription = TEXT("reload");
125 case WebNavigationTypeFormResubmitted:
126 typeDescription = TEXT("form resubmitted");
128 case WebNavigationTypeOther:
129 typeDescription = TEXT("other");
132 typeDescription = TEXT("illegal value");
135 wstring message = TEXT("Policy delegate: attempt to load ") + wurl + TEXT(" with navigation type '") + typeDescription + TEXT("'");
137 VARIANT actionElementVar;
138 if (SUCCEEDED(actionInformation->Read(WebActionElementKey, &actionElementVar, 0))) {
139 COMPtr<IPropertyBag> actionElement(Query, V_UNKNOWN(&actionElementVar));
140 VARIANT originatingNodeVar;
141 if (SUCCEEDED(actionElement->Read(WebElementDOMNodeKey, &originatingNodeVar, 0))) {
142 COMPtr<IDOMNode> originatingNode(Query, V_UNKNOWN(&originatingNodeVar));
143 message += TEXT(" originating from ") + dumpPath(originatingNode.get());
147 printf("%S\n", message.c_str());
151 if (m_permissiveDelegate)
156 if (m_controllerToNotifyDone) {
157 m_controllerToNotifyDone->notifyDone();
158 m_controllerToNotifyDone = 0;
165 HRESULT STDMETHODCALLTYPE PolicyDelegate::unableToImplementPolicyWithError(
166 /*[in]*/ IWebView* /*webView*/,
167 /*[in]*/ IWebError* error,
168 /*[in]*/ IWebFrame* frame)
171 error->domain(&domainStr);
172 wstring domainMessage = domainStr;
178 frame->name(&frameName);
179 wstring frameNameMessage = frameName;
181 printf("Policy delegate: unable to implement policy with error domain '%S', error code %d, in frame '%S'", domainMessage.c_str(), code, frameNameMessage.c_str());
183 SysFreeString(domainStr);
184 SysFreeString(frameName);