2 * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5 * Redistribution and use in source and binary forms, with or without
6 * 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.
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 * THE POSSIBILITY OF SUCH DAMAGE.
28 #include "WebChromeClient.h"
30 #include "DrawingArea.h"
31 #include "InjectedBundleNavigationAction.h"
32 #include "InjectedBundleUserMessageCoders.h"
33 #include "LayerTreeHost.h"
34 #include "WebColorChooser.h"
35 #include "WebCoreArgumentCoders.h"
37 #include "WebFrameLoaderClient.h"
38 #include "WebFullScreenManager.h"
39 #include "WebOpenPanelParameters.h"
40 #include "WebOpenPanelResultListener.h"
42 #include "WebPageCreationParameters.h"
43 #include "WebPageProxyMessages.h"
44 #include "WebPopupMenu.h"
45 #include "WebPreferencesStore.h"
46 #include "WebProcess.h"
47 #include "WebSearchPopupMenu.h"
48 #include <WebCore/AXObjectCache.h>
49 #include <WebCore/ColorChooser.h>
50 #include <WebCore/DatabaseTracker.h>
51 #include <WebCore/FileChooser.h>
52 #include <WebCore/FileIconLoader.h>
53 #include <WebCore/Frame.h>
54 #include <WebCore/FrameLoadRequest.h>
55 #include <WebCore/FrameLoader.h>
56 #include <WebCore/FrameView.h>
57 #include <WebCore/HTMLNames.h>
58 #include <WebCore/HTMLPlugInImageElement.h>
59 #include <WebCore/Icon.h>
60 #include <WebCore/NotImplemented.h>
61 #include <WebCore/Page.h>
62 #include <WebCore/SecurityOrigin.h>
63 #include <WebCore/Settings.h>
65 using namespace WebCore;
66 using namespace HTMLNames;
70 static double area(WebFrame* frame)
72 IntSize size = frame->visibleContentBoundsExcludingScrollbars().size();
73 return static_cast<double>(size.height()) * size.width();
77 static WebFrame* findLargestFrameInFrameSet(WebPage* page)
79 // Approximate what a user could consider a default target frame for application menu operations.
81 WebFrame* mainFrame = page->mainWebFrame();
82 if (!mainFrame->isFrameSet())
85 WebFrame* largestSoFar = 0;
87 RefPtr<ImmutableArray> frameChildren = mainFrame->childFrames();
88 size_t count = frameChildren->size();
89 for (size_t i = 0; i < count; ++i) {
90 WebFrame* childFrame = frameChildren->at<WebFrame>(i);
91 if (!largestSoFar || area(childFrame) > area(largestSoFar))
92 largestSoFar = childFrame;
98 void WebChromeClient::chromeDestroyed()
103 void WebChromeClient::setWindowRect(const FloatRect& windowFrame)
105 m_page->send(Messages::WebPageProxy::SetWindowFrame(windowFrame));
108 FloatRect WebChromeClient::windowRect()
110 FloatRect newWindowFrame;
112 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetWindowFrame(), Messages::WebPageProxy::GetWindowFrame::Reply(newWindowFrame), m_page->pageID()))
115 return newWindowFrame;
118 FloatRect WebChromeClient::pageRect()
120 return FloatRect(FloatPoint(), m_page->size());
123 void WebChromeClient::focus()
125 m_page->send(Messages::WebPageProxy::SetFocus(true));
128 void WebChromeClient::unfocus()
130 m_page->send(Messages::WebPageProxy::SetFocus(false));
134 void WebChromeClient::makeFirstResponder()
136 m_page->send(Messages::WebPageProxy::MakeFirstResponder());
140 bool WebChromeClient::canTakeFocus(FocusDirection)
146 void WebChromeClient::takeFocus(FocusDirection direction)
148 m_page->send(Messages::WebPageProxy::TakeFocus(direction));
151 void WebChromeClient::focusedNodeChanged(Node* node)
154 IntRect nodeRect = IntRect(0, 0, 0, 0);
156 nodeRect = WebCore::pixelSnappedIntRect(node->getRect());
157 Frame* mainFrame = m_page->corePage()->mainFrame();
158 Frame* frame = node->document()->frame();
160 while (frame && frame != mainFrame) {
161 owner = frame->ownerElement();
163 nodeRect.setX(nodeRect.x() + owner->getRect().x());
164 nodeRect.setY(nodeRect.y() + owner->getRect().y());
165 frame = owner->document()->frame();
170 // we have to divide (x, y) with pageZoomFactor because pageZoomFactor was applied to them.
171 nodeRect.setX(nodeRect.x() / m_page->pageScaleFactor());
172 nodeRect.setY(nodeRect.y() / m_page->pageScaleFactor());
174 m_page->send(Messages::WebPageProxy::FocusedNodeChanged(nodeRect));
180 void WebChromeClient::focusedFrameChanged(Frame* frame)
182 WebFrame* webFrame = frame ? static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame() : 0;
184 WebProcess::shared().connection()->send(Messages::WebPageProxy::FocusedFrameChanged(webFrame ? webFrame->frameID() : 0), m_page->pageID());
187 Page* WebChromeClient::createWindow(Frame* frame, const FrameLoadRequest& request, const WindowFeatures& windowFeatures, const NavigationAction& navigationAction)
189 uint32_t modifiers = static_cast<uint32_t>(InjectedBundleNavigationAction::modifiersForNavigationAction(navigationAction));
190 int32_t mouseButton = static_cast<int32_t>(InjectedBundleNavigationAction::mouseButtonForNavigationAction(navigationAction));
192 uint64_t newPageID = 0;
193 WebPageCreationParameters parameters;
194 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::CreateNewPage(request.resourceRequest(), windowFeatures, modifiers, mouseButton), Messages::WebPageProxy::CreateNewPage::Reply(newPageID, parameters), m_page->pageID()))
200 WebProcess::shared().createWebPage(newPageID, parameters);
201 #if ENABLE(TIZEN_WEBKIT2_SAME_PAGE_GROUP_FOR_CREATE_WINDOW_OPERATION)
202 WebCore::Page* page = WebProcess::shared().webPage(newPageID)->corePage();
203 page->setGroupName(frame->page()->groupName());
206 return WebProcess::shared().webPage(newPageID)->corePage();
209 void WebChromeClient::show()
214 bool WebChromeClient::canRunModal()
216 return m_page->canRunModal();
219 void WebChromeClient::runModal()
224 void WebChromeClient::setToolbarsVisible(bool toolbarsAreVisible)
226 m_page->send(Messages::WebPageProxy::SetToolbarsAreVisible(toolbarsAreVisible));
229 bool WebChromeClient::toolbarsVisible()
231 WKBundlePageUIElementVisibility toolbarsVisibility = m_page->injectedBundleUIClient().toolbarsAreVisible(m_page);
232 if (toolbarsVisibility != WKBundlePageUIElementVisibilityUnknown)
233 return toolbarsVisibility == WKBundlePageUIElementVisible;
235 bool toolbarsAreVisible = true;
236 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetToolbarsAreVisible(), Messages::WebPageProxy::GetToolbarsAreVisible::Reply(toolbarsAreVisible), m_page->pageID()))
239 return toolbarsAreVisible;
242 void WebChromeClient::setStatusbarVisible(bool statusBarIsVisible)
244 m_page->send(Messages::WebPageProxy::SetStatusBarIsVisible(statusBarIsVisible));
247 bool WebChromeClient::statusbarVisible()
249 WKBundlePageUIElementVisibility statusbarVisibility = m_page->injectedBundleUIClient().statusBarIsVisible(m_page);
250 if (statusbarVisibility != WKBundlePageUIElementVisibilityUnknown)
251 return statusbarVisibility == WKBundlePageUIElementVisible;
253 bool statusBarIsVisible = true;
254 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetStatusBarIsVisible(), Messages::WebPageProxy::GetStatusBarIsVisible::Reply(statusBarIsVisible), m_page->pageID()))
257 return statusBarIsVisible;
260 void WebChromeClient::setScrollbarsVisible(bool)
265 bool WebChromeClient::scrollbarsVisible()
271 void WebChromeClient::setMenubarVisible(bool menuBarVisible)
273 m_page->send(Messages::WebPageProxy::SetMenuBarIsVisible(menuBarVisible));
276 bool WebChromeClient::menubarVisible()
278 WKBundlePageUIElementVisibility menubarVisibility = m_page->injectedBundleUIClient().menuBarIsVisible(m_page);
279 if (menubarVisibility != WKBundlePageUIElementVisibilityUnknown)
280 return menubarVisibility == WKBundlePageUIElementVisible;
282 bool menuBarIsVisible = true;
283 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetMenuBarIsVisible(), Messages::WebPageProxy::GetMenuBarIsVisible::Reply(menuBarIsVisible), m_page->pageID()))
286 return menuBarIsVisible;
289 void WebChromeClient::setResizable(bool resizable)
291 m_page->send(Messages::WebPageProxy::SetIsResizable(resizable));
294 #if ENABLE(TIZEN_DISPLAY_MESSAGE_TO_CONSOLE)
295 void WebChromeClient::addMessageToConsole(MessageSource, MessageType, MessageLevel level, const String& message, unsigned int lineNumber, const String& sourceID)
297 void WebChromeClient::addMessageToConsole(MessageSource, MessageType, MessageLevel, const String& message, unsigned int lineNumber, const String& sourceID)
300 #if ENABLE(TIZEN_DISPLAY_MESSAGE_TO_CONSOLE) // Request for WAC SDK
303 newMessage = String::format("%s:%d:%s", sourceID.utf8().data(), lineNumber, message.utf8().data());
305 newMessage = message;
308 case WarningMessageLevel:
309 TIZEN_CONSOLEW("%s", newMessage.utf8().data());
311 case ErrorMessageLevel:
312 TIZEN_CONSOLEE("%s", newMessage.utf8().data());
314 case LogMessageLevel:
315 TIZEN_CONSOLED("%s", newMessage.utf8().data());
318 TIZEN_CONSOLEI("%s", newMessage.utf8().data());
322 // Notify the bundle client.
323 m_page->injectedBundleUIClient().willAddMessageToConsole(m_page, message, lineNumber);
328 bool WebChromeClient::canRunBeforeUnloadConfirmPanel()
330 return m_page->canRunBeforeUnloadConfirmPanel();
333 bool WebChromeClient::runBeforeUnloadConfirmPanel(const String& message, Frame* frame)
335 #if ENABLE(TIZEN_SUPPORT_BEFORE_UNLOAD_CONFIRM_PANEL)
336 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
338 unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
339 bool shouldClose = false;
340 #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
341 WebProcess::WaitForJavaScriptPopupFinished waiting;
343 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunBeforeUnloadConfirmPanel(message, webFrame->frameID()), Messages::WebPageProxy::RunBeforeUnloadConfirmPanel::Reply(shouldClose), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
348 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
350 bool shouldClose = false;
351 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunBeforeUnloadConfirmPanel(message, webFrame->frameID()), Messages::WebPageProxy::RunBeforeUnloadConfirmPanel::Reply(shouldClose), m_page->pageID()))
358 void WebChromeClient::closeWindowSoon()
360 // FIXME: This code assumes that the client will respond to a close page
361 // message by actually closing the page. Safari does this, but there is
362 // no guarantee that other applications will, which will leave this page
363 // half detached. This approach is an inherent limitation making parts of
364 // a close execute synchronously as part of window.close, but other parts
367 m_page->corePage()->setGroupName(String());
369 if (WebFrame* frame = m_page->mainWebFrame()) {
370 if (Frame* coreFrame = frame->coreFrame())
371 coreFrame->loader()->stopForUserCancel();
377 void WebChromeClient::runJavaScriptAlert(Frame* frame, const String& alertText)
379 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
381 // Notify the bundle client.
382 m_page->injectedBundleUIClient().willRunJavaScriptAlert(m_page, alertText, webFrame);
384 unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
385 #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
386 WebProcess::WaitForJavaScriptPopupFinished waiting;
388 WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptAlert(webFrame->frameID(), alertText), Messages::WebPageProxy::RunJavaScriptAlert::Reply(), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags);
391 bool WebChromeClient::runJavaScriptConfirm(Frame* frame, const String& message)
393 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
395 // Notify the bundle client.
396 m_page->injectedBundleUIClient().willRunJavaScriptConfirm(m_page, message, webFrame);
398 unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
400 #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
401 WebProcess::WaitForJavaScriptPopupFinished waiting;
403 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptConfirm(webFrame->frameID(), message), Messages::WebPageProxy::RunJavaScriptConfirm::Reply(result), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
409 bool WebChromeClient::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
411 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
413 // Notify the bundle client.
414 m_page->injectedBundleUIClient().willRunJavaScriptPrompt(m_page, message, defaultValue, webFrame);
416 unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
417 #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
418 WebProcess::WaitForJavaScriptPopupFinished waiting;
420 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptPrompt(webFrame->frameID(), message, defaultValue), Messages::WebPageProxy::RunJavaScriptPrompt::Reply(result), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
423 return !result.isNull();
426 void WebChromeClient::setStatusbarText(const String& statusbarText)
428 // Notify the bundle client.
429 m_page->injectedBundleUIClient().willSetStatusbarText(m_page, statusbarText);
431 m_page->send(Messages::WebPageProxy::SetStatusText(statusbarText));
434 bool WebChromeClient::shouldInterruptJavaScript()
436 bool shouldInterrupt = false;
437 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::ShouldInterruptJavaScript(), Messages::WebPageProxy::ShouldInterruptJavaScript::Reply(shouldInterrupt), m_page->pageID()))
440 return shouldInterrupt;
443 KeyboardUIMode WebChromeClient::keyboardUIMode()
445 return m_page->keyboardUIMode();
448 IntRect WebChromeClient::windowResizerRect() const
450 return m_page->windowResizerRect();
453 void WebChromeClient::invalidateRootView(const IntRect&, bool)
455 // Do nothing here, there's no concept of invalidating the window in the web process.
458 void WebChromeClient::invalidateContentsAndRootView(const IntRect& rect, bool)
460 if (Document* document = m_page->corePage()->mainFrame()->document()) {
461 if (document->printing())
465 m_page->drawingArea()->setNeedsDisplay(rect);
468 void WebChromeClient::invalidateContentsForSlowScroll(const IntRect& rect, bool)
470 if (Document* document = m_page->corePage()->mainFrame()->document()) {
471 if (document->printing())
475 m_page->pageDidScroll();
476 m_page->drawingArea()->setNeedsDisplay(rect);
479 void WebChromeClient::scroll(const IntSize& scrollOffset, const IntRect& scrollRect, const IntRect& clipRect)
481 m_page->pageDidScroll();
482 m_page->drawingArea()->scroll(intersection(scrollRect, clipRect), scrollOffset);
485 #if USE(TILED_BACKING_STORE)
486 void WebChromeClient::delegatedScrollRequested(const IntPoint& scrollOffset)
488 m_page->pageDidRequestScroll(scrollOffset);
492 IntPoint WebChromeClient::screenToRootView(const IntPoint& point) const
494 return m_page->screenToWindow(point);
497 IntRect WebChromeClient::rootViewToScreen(const IntRect& rect) const
499 return m_page->windowToScreen(rect);
502 PlatformPageClient WebChromeClient::platformPageClient() const
508 #if ENABLE(TIZEN_VIEWPORT_META_TAG)
509 static const int landscapeWidth = 640;
510 bool WebChromeClient::canContentsSizeChange(Frame* frame, const IntSize& size) const
512 // FIXME1: This patch should be removed AS SOON AS unexpected layout change problem is fixed.
513 // ex) m.news.naver.com
514 // FIXME2: By this patch, contents size is not changed properly on big size contents
515 // ex) www.expedia.com - fixedLayoutSize.width: 980, changedContentsSize: 1272
516 // ex) www.adobe.com - fixedLayoutSize.width: 360, changedContentsSize: 950
517 // ex) www.mt.co.kr (desktop site) - fixedLayoutSize.width: 980, changedContentsSize: 1090
518 FrameView* view = m_page->mainFrame()->view();
519 if (view->fixedLayoutSize().width() < size.width() && size.width() < landscapeWidth)
526 #if ENABLE(TIZEN_SUPPORT_WEBAPP_META_TAG)
527 bool WebChromeClient::getStandaloneStatus()
529 bool standalone = false;
530 m_page->sendSync(Messages::WebPageProxy::GetStandaloneStatus(), Messages::WebPageProxy::GetStandaloneStatus::Reply(standalone), m_page->pageID());
535 #if ENABLE(TIZEN_SEARCH_PROVIDER)
536 void WebChromeClient::addSearchProvider(const String& baseURL, const String& engineURL)
538 m_page->send(Messages::WebPageProxy::AddSearchProvider(baseURL, engineURL));
541 unsigned long WebChromeClient::isSearchProviderInstalled(const String& baseURL, const String& engineURL)
544 m_page->sendSync(Messages::WebPageProxy::IsSearchProviderInstalled(baseURL, engineURL), Messages::WebPageProxy::IsSearchProviderInstalled::Reply(result));
549 void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& size) const
551 if (!m_page->corePage()->settings()->frameFlatteningEnabled()) {
552 WebFrame* largestFrame = findLargestFrameInFrameSet(m_page);
553 if (largestFrame != m_cachedFrameSetLargestFrame.get()) {
554 m_cachedFrameSetLargestFrame = largestFrame;
555 m_page->send(Messages::WebPageProxy::FrameSetLargestFrameChanged(largestFrame ? largestFrame->frameID() : 0));
559 if (frame->page()->mainFrame() != frame)
562 #if PLATFORM(QT) || (PLATFORM(EFL) && USE(TILED_BACKING_STORE))
563 if (m_page->useFixedLayout()) {
564 // The below method updates the size().
565 m_page->resizeToContentsIfNeeded();
566 m_page->drawingArea()->layerTreeHost()->sizeDidChange(m_page->size());
569 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
570 // FIXME: Logic to calculate the node's position is inefficient.
571 Frame* focusedFrame = m_page->corePage()->focusController()->focusedFrame();
572 if(focusedFrame && focusedFrame->document() && focusedFrame->document()->focusedNode()) {
573 Node* node = focusedFrame->document()->focusedNode();
574 IntRect nodeRect = IntRect(0, 0, 0, 0);
576 nodeRect = WebCore::pixelSnappedIntRect(node->getRect());
577 Frame* mainFrame = m_page->corePage()->mainFrame();
578 Frame* frame = node->document()->frame();
580 while (frame && frame != mainFrame) {
581 owner = frame->ownerElement();
585 nodeRect.setX(nodeRect.x() + owner->getRect().x());
586 nodeRect.setY(nodeRect.y() + owner->getRect().y());
587 frame = owner->document()->frame();
589 // we have to divide (x, y) with pageZoomFactor because pageZoomFactor was applied to them.
590 nodeRect.setX(nodeRect.x() / m_page->pageScaleFactor());
591 nodeRect.setY(nodeRect.y() / m_page->pageScaleFactor());
593 m_page->send(Messages::WebPageProxy::FocusedNodeChanged(nodeRect));
597 m_page->send(Messages::WebPageProxy::DidChangeContentsSize(m_page->size()));
600 FrameView* frameView = frame->view();
601 if (frameView && !frameView->delegatesScrolling()) {
602 bool hasHorizontalScrollbar = frameView->horizontalScrollbar();
603 bool hasVerticalScrollbar = frameView->verticalScrollbar();
605 if (hasHorizontalScrollbar != m_cachedMainFrameHasHorizontalScrollbar || hasVerticalScrollbar != m_cachedMainFrameHasVerticalScrollbar) {
606 m_page->send(Messages::WebPageProxy::DidChangeScrollbarsForMainFrame(hasHorizontalScrollbar, hasVerticalScrollbar));
608 m_cachedMainFrameHasHorizontalScrollbar = hasHorizontalScrollbar;
609 m_cachedMainFrameHasVerticalScrollbar = hasVerticalScrollbar;
614 void WebChromeClient::scrollRectIntoView(const IntRect&) const
619 bool WebChromeClient::shouldUnavailablePluginMessageBeButton(RenderEmbeddedObject::PluginUnavailabilityReason pluginUnavailabilityReason) const
621 if (pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing || pluginUnavailabilityReason == RenderEmbeddedObject::InsecurePluginVersion) {
622 // FIXME: <rdar://problem/8794397> We should only return true when there is a
623 // missingPluginButtonClicked callback defined on the Page UI client.
630 void WebChromeClient::unavailablePluginButtonClicked(Element* element, RenderEmbeddedObject::PluginUnavailabilityReason pluginUnavailabilityReason) const
632 ASSERT(element->hasTagName(objectTag) || element->hasTagName(embedTag) || element->hasTagName(appletTag));
633 ASSERT(pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing || pluginUnavailabilityReason == RenderEmbeddedObject::InsecurePluginVersion);
635 HTMLPlugInImageElement* pluginElement = static_cast<HTMLPlugInImageElement*>(element);
637 m_page->send(Messages::WebPageProxy::UnavailablePluginButtonClicked(pluginUnavailabilityReason, pluginElement->serviceType(), pluginElement->url(), pluginElement->getAttribute(pluginspageAttr)));
640 void WebChromeClient::scrollbarsModeDidChange() const
645 void WebChromeClient::mouseDidMoveOverElement(const HitTestResult& hitTestResult, unsigned modifierFlags)
647 RefPtr<APIObject> userData;
649 // Notify the bundle client.
650 m_page->injectedBundleUIClient().mouseDidMoveOverElement(m_page, hitTestResult, static_cast<WebEvent::Modifiers>(modifierFlags), userData);
652 // Notify the UIProcess.
653 WebHitTestResult::Data webHitTestResultData(hitTestResult);
654 m_page->send(Messages::WebPageProxy::MouseDidMoveOverElement(webHitTestResultData, modifierFlags, InjectedBundleUserMessageEncoder(userData.get())));
657 void WebChromeClient::setToolTip(const String& toolTip, TextDirection)
659 // Only send a tool tip to the WebProcess if it has changed since the last time this function was called.
661 if (toolTip == m_cachedToolTip)
663 m_cachedToolTip = toolTip;
665 m_page->send(Messages::WebPageProxy::SetToolTip(m_cachedToolTip));
668 void WebChromeClient::print(Frame* frame)
670 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
671 m_page->sendSync(Messages::WebPageProxy::PrintFrame(webFrame->frameID()), Messages::WebPageProxy::PrintFrame::Reply());
674 #if ENABLE(SQL_DATABASE)
675 void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseName)
677 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
678 SecurityOrigin* origin = frame->document()->securityOrigin();
680 DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(databaseName, origin);
681 uint64_t currentQuota = DatabaseTracker::tracker().quotaForOrigin(origin);
683 #if ENABLE(TIZEN_SQL_DATABASE)
684 uint64_t newQuota = 0;
685 const uint64_t defaultQuota = 5 * 1024 * 1024;
686 uint64_t requirement = currentQuota + details.expectedUsage();
687 if (requirement <= defaultQuota)
688 newQuota = requirement;
690 unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
691 bool allowExceed = false;
692 WebProcess::shared().connection()->sendSync(
693 Messages::WebPageProxy::ExceededDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), details.displayName(), details.expectedUsage()),
694 Messages::WebPageProxy::ExceededDatabaseQuota::Reply(allowExceed), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags);
696 newQuota = currentQuota + details.expectedUsage();
698 newQuota = currentQuota;
701 uint64_t currentOriginUsage = DatabaseTracker::tracker().usageForOrigin(origin);
702 uint64_t newQuota = 0;
703 WebProcess::shared().connection()->sendSync(
704 Messages::WebPageProxy::ExceededDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()),
705 Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page->pageID());
708 DatabaseTracker::tracker().setQuota(origin, newQuota);
713 void WebChromeClient::reachedMaxAppCacheSize(int64_t)
718 void WebChromeClient::reachedApplicationCacheOriginQuota(SecurityOrigin*, int64_t)
723 #if ENABLE(TIZEN_APPLICATION_CACHE)
724 bool WebChromeClient::requestApplicationCachePermission(Frame* frame)
726 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
727 SecurityOrigin* origin = frame->document()->securityOrigin();
729 unsigned syncSendFlags = WebCore::AXObjectCache::accessibilityEnabled() ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
731 #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
732 WebProcess::WaitForJavaScriptPopupFinished waiting;
735 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RequestApplicationCachePermission(webFrame->frameID(), origin->databaseIdentifier()), Messages::WebPageProxy::RequestApplicationCachePermission::Reply(allow), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
742 #if ENABLE(DASHBOARD_SUPPORT)
743 void WebChromeClient::dashboardRegionsChanged()
749 void WebChromeClient::populateVisitedLinks()
753 FloatRect WebChromeClient::customHighlightRect(Node*, const AtomicString& type, const FloatRect& lineRect)
759 void WebChromeClient::paintCustomHighlight(Node*, const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect,
760 bool behindText, bool entireLine)
765 bool WebChromeClient::shouldReplaceWithGeneratedFileForUpload(const String& path, String& generatedFilename)
767 generatedFilename = m_page->injectedBundleUIClient().shouldGenerateFileForUpload(m_page, path);
768 return !generatedFilename.isNull();
771 String WebChromeClient::generateReplacementFile(const String& path)
773 return m_page->injectedBundleUIClient().generateFileForUpload(m_page, path);
776 bool WebChromeClient::paintCustomOverhangArea(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
778 if (!m_page->injectedBundleUIClient().shouldPaintCustomOverhangArea())
781 m_page->injectedBundleUIClient().paintCustomOverhangArea(m_page, context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
785 #if ENABLE(INPUT_TYPE_COLOR)
786 PassOwnPtr<ColorChooser> WebChromeClient::createColorChooser(ColorChooserClient* client, const Color& initialColor)
788 if (m_page->activeColorChooser())
791 return adoptPtr(new WebColorChooser(m_page, client, initialColor));
795 void WebChromeClient::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> prpFileChooser)
798 if (m_page->activeOpenPanelResultListener())
799 m_page->cancelForOpenPanel();
801 if (m_page->activeOpenPanelResultListener())
805 RefPtr<FileChooser> fileChooser = prpFileChooser;
807 m_page->setActiveOpenPanelResultListener(WebOpenPanelResultListener::create(m_page, fileChooser.get()));
808 m_page->send(Messages::WebPageProxy::RunOpenPanel(static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame()->frameID(), fileChooser->settings()));
811 void WebChromeClient::loadIconForFiles(const Vector<String>& filenames, FileIconLoader* loader)
813 loader->notifyFinished(Icon::createIconForFiles(filenames));
816 void WebChromeClient::setCursor(const WebCore::Cursor& cursor)
818 #if USE(LAZY_NATIVE_CURSOR)
819 m_page->send(Messages::WebPageProxy::SetCursor(cursor));
823 void WebChromeClient::setCursorHiddenUntilMouseMoves(bool hiddenUntilMouseMoves)
825 m_page->send(Messages::WebPageProxy::SetCursorHiddenUntilMouseMoves(hiddenUntilMouseMoves));
828 #if ENABLE(REQUEST_ANIMATION_FRAME) && !USE(REQUEST_ANIMATION_FRAME_TIMER)
829 void WebChromeClient::scheduleAnimation()
831 #if USE(UI_SIDE_COMPOSITING)
832 m_page->drawingArea()->layerTreeHost()->scheduleAnimation();
837 void WebChromeClient::formStateDidChange(const Node*)
842 bool WebChromeClient::selectItemWritingDirectionIsNatural()
851 bool WebChromeClient::selectItemAlignmentFollowsMenuWritingDirection()
860 bool WebChromeClient::hasOpenedPopup() const
866 PassRefPtr<WebCore::PopupMenu> WebChromeClient::createPopupMenu(WebCore::PopupMenuClient* client) const
868 return WebPopupMenu::create(m_page, client);
871 PassRefPtr<WebCore::SearchPopupMenu> WebChromeClient::createSearchPopupMenu(WebCore::PopupMenuClient* client) const
873 return WebSearchPopupMenu::create(m_page, client);
876 #if USE(ACCELERATED_COMPOSITING)
877 void WebChromeClient::attachRootGraphicsLayer(Frame*, GraphicsLayer* layer)
880 m_page->enterAcceleratedCompositingMode(layer);
882 m_page->exitAcceleratedCompositingMode();
885 void WebChromeClient::setNeedsOneShotDrawingSynchronization()
887 #if ENABLE(TIZEN_ONESHOT_DRAWING_SYNCHRONIZATION)
888 if (m_page->drawingArea())
889 m_page->drawingArea()->setNeedsOneShotDrawingSynchronization();
895 void WebChromeClient::scheduleCompositingLayerSync()
897 if (m_page->drawingArea())
898 m_page->drawingArea()->scheduleCompositingLayerSync();
901 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
902 void WebChromeClient::addOrUpdateScrollingLayer(WebCore::Node*, WebCore::GraphicsLayer* scrollingLayer, WebCore::GraphicsLayer* contentsLayer, const WebCore::IntSize& scrollSize)
904 if (!m_page->drawingArea())
906 m_page->drawingArea()->addOrUpdateScrollingLayer(scrollingLayer, contentsLayer, scrollSize);
909 void WebChromeClient::removeScrollingLayer(WebCore::Node*, WebCore::GraphicsLayer* scrollingLayer, WebCore::GraphicsLayer* contentsLayer)
911 if (!m_page->drawingArea())
913 m_page->drawingArea()->removeScrollingLayer(scrollingLayer, contentsLayer);
915 #endif // ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
916 #endif // USE(ACCELERATED_COMPOSITING)
918 #if PLATFORM(WIN) && USE(AVFOUNDATION)
919 WebCore::GraphicsDeviceAdapter* WebChromeClient::graphicsDeviceAdapter() const
921 if (!m_page->drawingArea())
923 return m_page->drawingArea()->layerTreeHost()->graphicsDeviceAdapter();
927 #if ENABLE(TOUCH_EVENTS)
928 void WebChromeClient::needTouchEvents(bool needTouchEvents)
930 m_page->send(Messages::WebPageProxy::NeedTouchEvents(needTouchEvents));
935 void WebChromeClient::setLastSetCursorToCurrentCursor()
940 #if ENABLE(FULLSCREEN_API)
941 bool WebChromeClient::supportsFullScreenForElement(const WebCore::Element* element, bool withKeyboard)
943 return m_page->fullScreenManager()->supportsFullScreen(withKeyboard);
946 void WebChromeClient::enterFullScreenForElement(WebCore::Element* element)
948 m_page->fullScreenManager()->enterFullScreenForElement(element);
951 void WebChromeClient::exitFullScreenForElement(WebCore::Element* element)
953 m_page->fullScreenManager()->exitFullScreenForElement(element);
957 void WebChromeClient::dispatchViewportPropertiesDidChange(const ViewportArguments&) const
959 #if USE(TILED_BACKING_STORE)
960 if (!m_page->useFixedLayout())
963 m_page->sendViewportAttributesChanged();
967 void WebChromeClient::notifyScrollerThumbIsVisibleInRect(const IntRect& scrollerThumb)
969 m_page->send(Messages::WebPageProxy::NotifyScrollerThumbIsVisibleInRect(scrollerThumb));
972 void WebChromeClient::recommendedScrollbarStyleDidChange(int32_t newStyle)
974 m_page->send(Messages::WebPageProxy::RecommendedScrollbarStyleDidChange(newStyle));
977 bool WebChromeClient::shouldRubberBandInDirection(WebCore::ScrollDirection direction) const
979 ASSERT(direction != WebCore::ScrollUp && direction != WebCore::ScrollDown);
981 if (direction == WebCore::ScrollLeft)
982 return m_page->injectedBundleUIClient().shouldRubberBandInDirection(m_page, WKScrollDirectionLeft);
983 if (direction == WebCore::ScrollRight)
984 return m_page->injectedBundleUIClient().shouldRubberBandInDirection(m_page, WKScrollDirectionRight);
986 ASSERT_NOT_REACHED();
990 void WebChromeClient::numWheelEventHandlersChanged(unsigned count)
992 m_page->numWheelEventHandlersChanged(count);
995 #if ENABLE(SCREEN_ORIENTATION_SUPPORT) && ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT)
996 bool WebChromeClient::lockOrientation(int willLockOrientation)
999 m_page->sendSync(Messages::WebPageProxy::LockOrientation(willLockOrientation), Messages::WebPageProxy::LockOrientation::Reply(result));
1002 void WebChromeClient::unlockOrientation()
1004 m_page->send(Messages::WebPageProxy::UnlockOrientation());
1008 void WebChromeClient::logDiagnosticMessage(const String& message, const String& description, const String& success)
1010 if (!m_page->corePage()->settings()->diagnosticLoggingEnabled())
1013 m_page->injectedBundleDiagnosticLoggingClient().logDiagnosticMessage(m_page, message, description, success);
1016 #if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
1017 void WebChromeClient::requestVisibleContentRectRestore(const IntPoint& scrollOffset, float scale)
1019 m_page->pageDidRequestRestoreVisibleContentRect(scrollOffset, scale);
1022 float WebChromeClient::contentsScaleFactor() const
1024 if (!m_page->drawingArea())
1026 return m_page->drawingArea()->layerTreeHost()->contentsScaleFactor();
1031 void WebChromeClient::rendererWillBeDestroyed(RenderObject* object)
1033 #if ENABLE(TIZEN_SCREEN_READER)
1034 m_page->updateScreenReaderFocus(object);
1037 #if ENABLE(TIZEN_ISF_PORT)
1038 if (object->node() && object->node()->isRootEditableElement())
1039 m_page->send(Messages::WebPageProxy::RemoveInputMethodContext(reinterpret_cast<uintptr_t>(object->node())));
1044 #if ENABLE(TIZEN_INDEXED_DATABASE)
1045 bool WebChromeClient::exceededIndexedDatabaseQuota(Frame* frame, int64_t currentQuota)
1047 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
1048 SecurityOrigin* origin = frame->document()->securityOrigin();
1050 unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
1052 #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
1053 WebProcess::WaitForJavaScriptPopupFinished waiting;
1055 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::ExceededIndexedDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), currentQuota), Messages::WebPageProxy::ExceededIndexedDatabaseQuota::Reply(allow), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
1062 #if ENABLE(TIZEN_FILE_SYSTEM)
1063 bool WebChromeClient::exceededLocalFileSystemQuota(Frame* frame, int64_t currentQuota)
1065 WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
1066 SecurityOrigin* origin = frame->document()->securityOrigin();
1068 unsigned syncSendFlags = (WebCore::AXObjectCache::accessibilityEnabled()) ? CoreIPC::SpinRunLoopWhileWaitingForReply : 0;
1069 bool result = false;
1070 #if ENABLE(TIZEN_WEBKIT2_ROTATION_WHILE_JAVASCRIPT_POPUP)
1071 WebProcess::WaitForJavaScriptPopupFinished waiting;
1073 if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::ExceededLocalFileSystemQuota(webFrame->frameID(), origin->databaseIdentifier(), currentQuota), Messages::WebPageProxy::ExceededLocalFileSystemQuota::Reply(result), m_page->pageID(), CoreIPC::Connection::DefaultTimeout, syncSendFlags))
1080 #if ENABLE(TIZEN_WEBKIT2_NOTIFY_SUSPEND_BY_REMOTE_WEB_INSPECTOR)
1081 void WebChromeClient::setContentSuspendedByInspector(bool isSuspended)
1083 m_page->send(Messages::WebPageProxy::setContentSuspendedByInspector(isSuspended));
1086 } // namespace WebKit