Resizing Cappuccino is very laggy on WebKit since Safari 5.1
[WebKit-https.git] / Source / WebKit2 / WebProcess / WebPage / mac / WKAccessibilityWebPageObject.mm
1 /*
2  * Copyright (C) 2011 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "WKAccessibilityWebPageObject.h"
28
29 #import "WebFrame.h"
30 #import "WebPage.h"
31 #import <WebCore/AXObjectCache.h>
32 #import <WebCore/Frame.h>
33 #import <WebCore/FrameView.h>
34 #import <WebCore/Page.h>
35 #import <WebCore/ScrollView.h>
36 #import <WebCore/Scrollbar.h>
37 #import <WebKitSystemInterface.h>
38
39 using namespace WebCore;
40 using namespace WebKit;
41
42 @implementation WKAccessibilityWebPageObject
43
44 - (id)accessibilityRootObjectWrapper
45 {
46     if (!WebCore::AXObjectCache::accessibilityEnabled())
47         WebCore::AXObjectCache::enableAccessibility();
48
49     WebCore::Page* page = m_page->corePage();
50     if (!page)
51         return nil;
52     
53     WebCore::Frame* core = page->mainFrame();
54     if (!core || !core->document())
55         return nil;
56     
57     AccessibilityObject* root = core->document()->axObjectCache()->rootObject();
58     if (!root)
59         return nil;
60     
61     return root->wrapper();
62 }
63
64 - (void)setWebPage:(WebPage*)page
65 {
66     m_page = page;
67 }
68
69 - (void)setRemoteParent:(id)parent
70 {
71     if (parent != m_parent) {
72         [m_parent release];
73         m_parent = [parent retain];
74     }
75 }
76
77 - (void)dealloc
78 {
79     WKUnregisterUniqueIdForElement(self);
80     [m_accessibilityChildren release];
81     [m_attributeNames release];
82     [m_parent release];
83     [super dealloc];
84 }
85
86 - (BOOL)accessibilityIsIgnored
87 {
88     return NO;
89 }
90
91 - (NSArray *)accessibilityAttributeNames
92 {
93     if (!m_attributeNames)
94         m_attributeNames = [[NSArray alloc] initWithObjects:
95                            NSAccessibilityRoleAttribute, NSAccessibilityRoleDescriptionAttribute, NSAccessibilityFocusedAttribute,
96                            NSAccessibilityParentAttribute, NSAccessibilityWindowAttribute, NSAccessibilityTopLevelUIElementAttribute,
97                            NSAccessibilityPositionAttribute, NSAccessibilitySizeAttribute, NSAccessibilityChildrenAttribute, nil];
98
99     return m_attributeNames;
100 }
101
102 - (BOOL)accessibilityIsAttributeSettable:(NSString *)attribute
103 {
104     return NO;
105 }
106
107 - (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute 
108 {
109     return;
110 }
111
112 - (NSArray *)accessibilityActionNames
113 {
114     return [NSArray array];
115 }
116
117 - (NSArray *)accessibilityChildren
118 {
119     id wrapper = [self accessibilityRootObjectWrapper];
120     if (!wrapper)
121         return [NSArray array];
122     
123     return [NSArray arrayWithObject:wrapper];
124 }
125
126 - (id)accessibilityAttributeValue:(NSString *)attribute
127 {
128     if (!WebCore::AXObjectCache::accessibilityEnabled())
129         WebCore::AXObjectCache::enableAccessibility();
130     
131     if ([attribute isEqualToString:NSAccessibilityParentAttribute])
132         return m_parent;
133     if ([attribute isEqualToString:NSAccessibilityWindowAttribute])
134         return [m_parent accessibilityAttributeValue:NSAccessibilityWindowAttribute];
135     if ([attribute isEqualToString:NSAccessibilityTopLevelUIElementAttribute])
136         return [m_parent accessibilityAttributeValue:NSAccessibilityTopLevelUIElementAttribute];
137     if ([attribute isEqualToString:NSAccessibilityRoleAttribute])
138         return NSAccessibilityGroupRole;
139     if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute])
140         return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, nil);
141     if ([attribute isEqualToString:NSAccessibilityFocusedAttribute])
142         return [NSNumber numberWithBool:NO];
143
144     if (!m_page)
145         return nil;
146
147     if ([attribute isEqualToString:NSAccessibilityPositionAttribute]) {
148         const WebCore::FloatPoint& point = m_page->accessibilityPosition();
149         return [NSValue valueWithPoint:NSMakePoint(point.x(), point.y())];
150     }
151     if ([attribute isEqualToString:NSAccessibilitySizeAttribute]) {
152         const IntSize& s = m_page->size();
153         return [NSValue valueWithSize:NSMakeSize(s.width(), s.height())];
154     }
155     if ([attribute isEqualToString:NSAccessibilityChildrenAttribute])
156         return [self accessibilityChildren];
157
158     return nil;
159 }
160
161 - (BOOL)accessibilityShouldUseUniqueId
162 {
163     return YES;
164 }
165
166 - (id)accessibilityHitTest:(NSPoint)point 
167 {
168     // Hit-test point comes in as bottom-screen coordinates. Needs to be normalized to the frame of the web page.
169     NSPoint remotePosition = [[self accessibilityAttributeValue:NSAccessibilityPositionAttribute] pointValue];
170     NSSize remoteSize = [[self accessibilityAttributeValue:NSAccessibilitySizeAttribute] sizeValue];
171     
172     // Get the y position of the WKView (we have to screen-flip and go from bottom left to top left).
173     CGFloat screenHeight = [(NSScreen *)[[NSScreen screens] objectAtIndex:0] frame].size.height;
174     remotePosition.y = (screenHeight - remotePosition.y) - remoteSize.height;
175     
176     point.y = screenHeight - point.y;
177
178     // Re-center point into the web page's frame.
179     point.y -= remotePosition.y;
180     point.x -= remotePosition.x;
181     
182     WebCore::FrameView* frameView = m_page ? m_page->mainFrameView() : 0;
183     if (frameView) {
184         point.y += frameView->scrollPosition().y();
185         point.x += frameView->scrollPosition().x();
186     }
187     
188     return [[self accessibilityRootObjectWrapper] accessibilityHitTest:point];
189 }
190
191 - (id)accessibilityFocusedUIElement 
192 {
193     return [[self accessibilityRootObjectWrapper] accessibilityFocusedUIElement];
194 }
195
196
197 @end