Add WTF::move()
[WebKit-https.git] / Source / WebKit2 / UIProcess / WebPageContextMenuClient.cpp
1 /*
2  * Copyright (C) 2010 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 #include "config.h"
27
28 #if ENABLE(CONTEXT_MENUS)
29
30 #include "WebPageContextMenuClient.h"
31
32 #include "APIArray.h"
33 #include "Logging.h"
34 #include "WebContextMenuItem.h"
35 #include "WKAPICast.h"
36 #include "WKSharedAPICast.h"
37
38 namespace WebKit {
39
40 bool WebPageContextMenuClient::getContextMenuFromProposedMenu(WebPageProxy* page, const Vector<WebContextMenuItemData>& proposedMenuVector, Vector<WebContextMenuItemData>& customMenu, const WebHitTestResult::Data& hitTestResultData, API::Object* userData)
41 {
42     if (!m_client.getContextMenuFromProposedMenu && !m_client.getContextMenuFromProposedMenu_deprecatedForUseWithV0)
43         return false;
44
45     if (m_client.base.version >= 2 && !m_client.getContextMenuFromProposedMenu)
46         return false;
47
48     Vector<RefPtr<API::Object>> proposedMenuItems;
49     proposedMenuItems.reserveInitialCapacity(proposedMenuVector.size());
50
51     for (const auto& menuItem : proposedMenuVector)
52         proposedMenuItems.uncheckedAppend(WebContextMenuItem::create(menuItem));
53
54     WKArrayRef newMenu = nullptr;
55     if (m_client.base.version >= 2) {
56         RefPtr<WebHitTestResult> webHitTestResult = WebHitTestResult::create(hitTestResultData);
57         m_client.getContextMenuFromProposedMenu(toAPI(page), toAPI(API::Array::create(WTF::move(proposedMenuItems)).get()), &newMenu, toAPI(webHitTestResult.get()), toAPI(userData), m_client.base.clientInfo);
58     } else
59         m_client.getContextMenuFromProposedMenu_deprecatedForUseWithV0(toAPI(page), toAPI(API::Array::create(WTF::move(proposedMenuItems)).get()), &newMenu, toAPI(userData), m_client.base.clientInfo);
60
61     RefPtr<API::Array> array = adoptRef(toImpl(newMenu));
62     
63     customMenu.clear();
64     
65     size_t newSize = array ? array->size() : 0;
66     for (size_t i = 0; i < newSize; ++i) {
67         WebContextMenuItem* item = array->at<WebContextMenuItem>(i);
68         if (!item) {
69             LOG(ContextMenu, "New menu entry at index %i is not a WebContextMenuItem", (int)i);
70             continue;
71         }
72         
73         customMenu.append(*item->data());
74     }
75     
76     return true;
77 }
78
79 void WebPageContextMenuClient::customContextMenuItemSelected(WebPageProxy* page, const WebContextMenuItemData& itemData)
80 {
81     if (!m_client.customContextMenuItemSelected)
82         return;
83
84     RefPtr<WebContextMenuItem> item = WebContextMenuItem::create(itemData);
85     m_client.customContextMenuItemSelected(toAPI(page), toAPI(item.get()), m_client.base.clientInfo);
86 }
87
88 void WebPageContextMenuClient::contextMenuDismissed(WebPageProxy* page)
89 {
90     if (!m_client.contextMenuDismissed)
91         return;
92     
93     m_client.contextMenuDismissed(toAPI(page), m_client.base.clientInfo);
94 }
95
96 bool WebPageContextMenuClient::showContextMenu(WebPageProxy* page, const WebCore::IntPoint& menuLocation, const Vector<WebContextMenuItemData>& menuItemsVector)
97 {
98     if (!m_client.showContextMenu)
99         return false;
100
101     Vector<RefPtr<API::Object>> menuItems;
102     menuItems.reserveInitialCapacity(menuItemsVector.size());
103
104     for (const auto& menuItem : menuItemsVector)
105         menuItems.uncheckedAppend(WebContextMenuItem::create(menuItem));
106
107     m_client.showContextMenu(toAPI(page), toAPI(menuLocation), toAPI(API::Array::create(WTF::move(menuItems)).get()), m_client.base.clientInfo);
108
109     return true;
110 }
111
112 bool WebPageContextMenuClient::hideContextMenu(WebPageProxy* page)
113 {
114     if (!m_client.hideContextMenu)
115         return false;
116
117     m_client.hideContextMenu(toAPI(page), m_client.base.clientInfo);
118
119     return true;
120 }
121
122 } // namespace WebKit
123 #endif // ENABLE(CONTEXT_MENUS)