diff options
Diffstat (limited to 'webkit/glue/chrome_client_impl.cc')
-rw-r--r-- | webkit/glue/chrome_client_impl.cc | 632 |
1 files changed, 0 insertions, 632 deletions
diff --git a/webkit/glue/chrome_client_impl.cc b/webkit/glue/chrome_client_impl.cc deleted file mode 100644 index 135cda2..0000000 --- a/webkit/glue/chrome_client_impl.cc +++ /dev/null @@ -1,632 +0,0 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "config.h" - -#include "AccessibilityObject.h" -#include "AXObjectCache.h" -#include "CharacterNames.h" -#include "Console.h" -#include "Cursor.h" -#include "Document.h" -#include "DocumentLoader.h" -#include "DatabaseTracker.h" -#include "FloatRect.h" -#include "FileChooser.h" -#include "FrameLoadRequest.h" -#include "FrameView.h" -#include "HitTestResult.h" -#include "IntRect.h" -#include "Node.h" -#include "Page.h" -#include "PopupMenuChromium.h" -#include "ScriptController.h" -#include "WindowFeatures.h" -#if USE(V8) -#include "V8Proxy.h" -#endif -#undef LOG - -#include "webkit/api/public/WebAccessibilityObject.h" -#include "webkit/api/public/WebConsoleMessage.h" -#include "webkit/api/public/WebCursorInfo.h" -#include "webkit/api/public/WebFileChooserCompletion.h" -#include "webkit/api/public/WebFrameClient.h" -#include "webkit/api/public/WebInputEvent.h" -#include "webkit/api/public/WebKit.h" -#include "webkit/api/public/WebPopupMenuInfo.h" -#include "webkit/api/public/WebRect.h" -#include "webkit/api/public/WebTextDirection.h" -#include "webkit/api/public/WebURLRequest.h" -#include "webkit/api/public/WebViewClient.h" -#include "webkit/api/src/NotificationPresenterImpl.h" -#include "webkit/api/src/WebFileChooserCompletionImpl.h" -#include "webkit/api/src/WrappedResourceRequest.h" -#include "webkit/glue/chrome_client_impl.h" -#include "webkit/glue/glue_util.h" -#include "webkit/glue/webframe_impl.h" -#include "webkit/glue/webpopupmenu_impl.h" -#include "webkit/glue/webview_impl.h" - -using WebCore::PopupContainer; -using WebCore::PopupItem; - -using WebKit::WebAccessibilityObject; -using WebKit::WebConsoleMessage; -using WebKit::WebCursorInfo; -using WebKit::WebFileChooserCompletionImpl; -using WebKit::WebInputEvent; -using WebKit::WebMouseEvent; -using WebKit::WebNavigationPolicy; -using WebKit::WebPopupMenuInfo; -using WebKit::WebRect; -using WebKit::WebString; -using WebKit::WebTextDirection; -using WebKit::WebURL; -using WebKit::WebURLRequest; -using WebKit::WebVector; -using WebKit::WebViewClient; -using WebKit::WebWidget; -using WebKit::WrappedResourceRequest; - -using webkit_glue::AccessibilityObjectToWebAccessibilityObject; - -ChromeClientImpl::ChromeClientImpl(WebViewImpl* webview) - : webview_(webview), - toolbars_visible_(true), - statusbar_visible_(true), - scrollbars_visible_(true), - menubar_visible_(true), - resizable_(true), - ignore_next_set_cursor_(false) { -} - -ChromeClientImpl::~ChromeClientImpl() { -} - -void ChromeClientImpl::chromeDestroyed() { - // Our lifetime is bound to the WebViewImpl. -} - -void ChromeClientImpl::setWindowRect(const WebCore::FloatRect& r) { - if (webview_->client()) { - webview_->client()->setWindowRect( - webkit_glue::IntRectToWebRect(WebCore::IntRect(r))); - } -} - -WebCore::FloatRect ChromeClientImpl::windowRect() { - WebRect rect; - if (webview_->client()) { - rect = webview_->client()->rootWindowRect(); - } else { - // These numbers will be fairly wrong. The window's x/y coordinates will - // be the top left corner of the screen and the size will be the content - // size instead of the window size. - rect.width = webview_->size().width; - rect.height = webview_->size().height; - } - return WebCore::FloatRect(webkit_glue::WebRectToIntRect(rect)); -} - -WebCore::FloatRect ChromeClientImpl::pageRect() { - // We hide the details of the window's border thickness from the web page by - // simple re-using the window position here. So, from the point-of-view of - // the web page, the window has no border. - return windowRect(); -} - -float ChromeClientImpl::scaleFactor() { - // This is supposed to return the scale factor of the web page. It looks like - // the implementor of the graphics layer is responsible for doing most of the - // operations associated with scaling. However, this value is used ins some - // cases by WebCore. For example, this is used as a scaling factor in canvas - // so that things drawn in it are scaled just like the web page is. - // - // We don't currently implement scaling, so just return 1.0 (no scaling). - return 1.0; -} - -void ChromeClientImpl::focus() { - if (!webview_->client()) - return; - - webview_->client()->didFocus(); - - // If accessibility is enabled, we should notify assistive technology that - // the active AccessibilityObject changed. - const WebCore::Frame* frame = webview_->GetFocusedWebCoreFrame(); - if (!frame) - return; - - WebCore::Document* doc = frame->document(); - - if (doc && doc->axObjectCache()->accessibilityEnabled()) { - WebCore::Node* focused_node = webview_->GetFocusedNode(); - - if (!focused_node) { - // Could not retrieve focused Node. - return; - } - - // Retrieve the focused AccessibilityObject. - WebCore::AccessibilityObject* focused_acc_obj = - doc->axObjectCache()->getOrCreate(focused_node->renderer()); - - // Alert assistive technology that focus changed. - if (focused_acc_obj) { - webview_->client()->focusAccessibilityObject( - AccessibilityObjectToWebAccessibilityObject(focused_acc_obj)); - } - } -} - -void ChromeClientImpl::unfocus() { - if (webview_->client()) - webview_->client()->didBlur(); -} - -bool ChromeClientImpl::canTakeFocus(WebCore::FocusDirection) { - // For now the browser can always take focus if we're not running layout - // tests. - return !WebKit::layoutTestMode(); -} - -void ChromeClientImpl::takeFocus(WebCore::FocusDirection direction) { - if (!webview_->client()) - return; - if (direction == WebCore::FocusDirectionBackward) { - webview_->client()->focusPrevious(); - } else { - webview_->client()->focusNext(); - } -} - -WebCore::Page* ChromeClientImpl::createWindow( - WebCore::Frame* frame, const WebCore::FrameLoadRequest& r, - const WebCore::WindowFeatures& features) { - if (!webview_->client()) - return NULL; - - WebViewImpl* new_view = static_cast<WebViewImpl*>( - webview_->client()->createView(WebFrameImpl::FromFrame(frame))); - if (!new_view) - return NULL; - - // The request is empty when we are just being asked to open a blank window. - // This corresponds to window.open(""), for example. - if (!r.resourceRequest().isEmpty()) { - WrappedResourceRequest request(r.resourceRequest()); - new_view->main_frame()->loadRequest(request); - } - - return new_view->page(); -} - -static inline bool CurrentEventShouldCauseBackgroundTab( - const WebInputEvent* input_event) { - if (!input_event) - return false; - - if (input_event->type != WebInputEvent::MouseUp) - return false; - - const WebMouseEvent* mouse_event = - static_cast<const WebMouseEvent*>(input_event); - - WebNavigationPolicy policy; - unsigned short button_number; - switch (mouse_event->button) { - case WebMouseEvent::ButtonLeft: - button_number = 0; - break; - case WebMouseEvent::ButtonMiddle: - button_number = 1; - break; - case WebMouseEvent::ButtonRight: - button_number = 2; - break; - default: - return false; - } - bool ctrl = mouse_event->modifiers & WebMouseEvent::ControlKey; - bool shift = mouse_event->modifiers & WebMouseEvent::ShiftKey; - bool alt = mouse_event->modifiers & WebMouseEvent::AltKey; - bool meta = mouse_event->modifiers & WebMouseEvent::MetaKey; - - if (!WebViewImpl::NavigationPolicyFromMouseEvent(button_number, ctrl, - shift, alt, meta, &policy)) - return false; - - return policy == WebKit::WebNavigationPolicyNewBackgroundTab; -} - -void ChromeClientImpl::show() { - if (!webview_->client()) - return; - - // If our default configuration was modified by a script or wasn't - // created by a user gesture, then show as a popup. Else, let this - // new window be opened as a toplevel window. - bool as_popup = - !toolbars_visible_ || - !statusbar_visible_ || - !scrollbars_visible_ || - !menubar_visible_ || - !resizable_; - - WebNavigationPolicy policy = WebKit::WebNavigationPolicyNewForegroundTab; - if (as_popup) - policy = WebKit::WebNavigationPolicyNewPopup; - if (CurrentEventShouldCauseBackgroundTab( - WebViewImpl::current_input_event())) - policy = WebKit::WebNavigationPolicyNewBackgroundTab; - - webview_->client()->show(policy); -} - -bool ChromeClientImpl::canRunModal() { - return webview_->client() != NULL; -} - -void ChromeClientImpl::runModal() { - if (webview_->client()) - webview_->client()->runModal(); -} - -void ChromeClientImpl::setToolbarsVisible(bool value) { - toolbars_visible_ = value; -} - -bool ChromeClientImpl::toolbarsVisible() { - return toolbars_visible_; -} - -void ChromeClientImpl::setStatusbarVisible(bool value) { - statusbar_visible_ = value; -} - -bool ChromeClientImpl::statusbarVisible() { - return statusbar_visible_; -} - -void ChromeClientImpl::setScrollbarsVisible(bool value) { - scrollbars_visible_ = value; - WebFrameImpl* web_frame = static_cast<WebFrameImpl*>(webview_->mainFrame()); - if (web_frame) - web_frame->SetAllowsScrolling(value); -} - -bool ChromeClientImpl::scrollbarsVisible() { - return scrollbars_visible_; -} - -void ChromeClientImpl::setMenubarVisible(bool value) { - menubar_visible_ = value; -} - -bool ChromeClientImpl::menubarVisible() { - return menubar_visible_; -} - -void ChromeClientImpl::setResizable(bool value) { - resizable_ = value; -} - -void ChromeClientImpl::addMessageToConsole(WebCore::MessageSource source, - WebCore::MessageType type, - WebCore::MessageLevel level, - const WebCore::String& message, - unsigned int line_no, - const WebCore::String& source_id) { - if (webview_->client()) { - webview_->client()->didAddMessageToConsole( - WebConsoleMessage(static_cast<WebConsoleMessage::Level>(level), - webkit_glue::StringToWebString(message)), - webkit_glue::StringToWebString(source_id), - line_no); - } -} - -bool ChromeClientImpl::canRunBeforeUnloadConfirmPanel() { - return webview_->client() != NULL; -} - -bool ChromeClientImpl::runBeforeUnloadConfirmPanel( - const WebCore::String& message, - WebCore::Frame* frame) { - if (webview_->client()) { - return webview_->client()->runModalBeforeUnloadDialog( - WebFrameImpl::FromFrame(frame), - webkit_glue::StringToWebString(message)); - } - return false; -} - -void ChromeClientImpl::closeWindowSoon() { - // Make sure this Page can no longer be found by JS. - webview_->page()->setGroupName(WebCore::String()); - - // Make sure that all loading is stopped. Ensures that JS stops executing! - webview_->mainFrame()->stopLoading(); - - if (webview_->client()) - webview_->client()->closeWidgetSoon(); -} - -// Although a WebCore::Frame is passed in, we don't actually use it, since we -// already know our own webview_. -void ChromeClientImpl::runJavaScriptAlert(WebCore::Frame* frame, - const WebCore::String& message) { - if (webview_->client()) { -#if USE(V8) - // Before showing the JavaScript dialog, we give the proxy implementation - // a chance to process any pending console messages. - WebCore::V8Proxy::processConsoleMessages(); -#endif - webview_->client()->runModalAlertDialog( - WebFrameImpl::FromFrame(frame), - webkit_glue::StringToWebString(message)); - } -} - -// See comments for runJavaScriptAlert(). -bool ChromeClientImpl::runJavaScriptConfirm(WebCore::Frame* frame, - const WebCore::String& message) { - if (webview_->client()) { - return webview_->client()->runModalConfirmDialog( - WebFrameImpl::FromFrame(frame), - webkit_glue::StringToWebString(message)); - } - return false; -} - -// See comments for runJavaScriptAlert(). -bool ChromeClientImpl::runJavaScriptPrompt(WebCore::Frame* frame, - const WebCore::String& message, - const WebCore::String& default_value, - WebCore::String& result) { - if (webview_->client()) { - WebString actual_value; - bool ok = webview_->client()->runModalPromptDialog( - WebFrameImpl::FromFrame(frame), - webkit_glue::StringToWebString(message), - webkit_glue::StringToWebString(default_value), - &actual_value); - if (ok) - result = webkit_glue::WebStringToString(actual_value); - return ok; - } - return false; -} - -void ChromeClientImpl::setStatusbarText(const WebCore::String& message) { - if (webview_->client()) { - webview_->client()->setStatusText( - webkit_glue::StringToWebString(message)); - } -} - -bool ChromeClientImpl::shouldInterruptJavaScript() { - // TODO(mbelshe): implement me - return false; -} - -bool ChromeClientImpl::tabsToLinks() const { - return webview_->tabsToLinks(); -} - -WebCore::IntRect ChromeClientImpl::windowResizerRect() const { - WebCore::IntRect result; - if (webview_->client()) { - result = webkit_glue::WebRectToIntRect( - webview_->client()->windowResizerRect()); - } - return result; -} - -void ChromeClientImpl::repaint( - const WebCore::IntRect& paint_rect, bool content_changed, bool immediate, - bool repaint_content_only) { - // Ignore spurious calls. - if (!content_changed || paint_rect.isEmpty()) - return; - if (webview_->client()) { - webview_->client()->didInvalidateRect( - webkit_glue::IntRectToWebRect(paint_rect)); - } -} - -void ChromeClientImpl::scroll( - const WebCore::IntSize& scroll_delta, const WebCore::IntRect& scroll_rect, - const WebCore::IntRect& clip_rect) { - if (webview_->client()) { - int dx = scroll_delta.width(); - int dy = scroll_delta.height(); - webview_->client()->didScrollRect( - dx, dy, webkit_glue::IntRectToWebRect(clip_rect)); - } -} - -WebCore::IntPoint ChromeClientImpl::screenToWindow( - const WebCore::IntPoint&) const { - notImplemented(); - return WebCore::IntPoint(); -} - -WebCore::IntRect ChromeClientImpl::windowToScreen( - const WebCore::IntRect& rect) const { - WebCore::IntRect screen_rect(rect); - - if (webview_->client()) { - WebRect window_rect = webview_->client()->windowRect(); - screen_rect.move(window_rect.x, window_rect.y); - } - - return screen_rect; -} - -void ChromeClientImpl::contentsSizeChanged(WebCore::Frame* frame, const - WebCore::IntSize& size) const { - WebFrameImpl* webframe = WebFrameImpl::FromFrame(frame); - if (webframe->client()) { - webframe->client()->didChangeContentsSize( - webframe, webkit_glue::IntSizeToWebSize(size)); - } -} - -void ChromeClientImpl::scrollbarsModeDidChange() const { -} - -void ChromeClientImpl::mouseDidMoveOverElement( - const WebCore::HitTestResult& result, unsigned modifier_flags) { - if (!webview_->client()) - return; - // Find out if the mouse is over a link, and if so, let our UI know... - if (result.isLiveLink() && !result.absoluteLinkURL().string().isEmpty()) { - webview_->client()->setMouseOverURL( - webkit_glue::KURLToWebURL(result.absoluteLinkURL())); - } else { - webview_->client()->setMouseOverURL(WebURL()); - } -} - -void ChromeClientImpl::setToolTip(const WebCore::String& tooltip_text, - WebCore::TextDirection dir) { - if (!webview_->client()) - return; - WebTextDirection text_direction = (dir == WebCore::RTL) ? - WebKit::WebTextDirectionRightToLeft : - WebKit::WebTextDirectionLeftToRight; - webview_->client()->setToolTipText( - webkit_glue::StringToWebString(tooltip_text), text_direction); -} - -void ChromeClientImpl::print(WebCore::Frame* frame) { - if (webview_->client()) - webview_->client()->printPage(WebFrameImpl::FromFrame(frame)); -} - -void ChromeClientImpl::exceededDatabaseQuota(WebCore::Frame* frame, - const WebCore::String& databaseName) { - // set a reasonable quota for now -- 5Mb should be enough for anybody - // TODO(dglazkov): this should be configurable - WebCore::SecurityOrigin* origin = frame->document()->securityOrigin(); - WebCore::DatabaseTracker::tracker().setQuota(origin, 1024 * 1024 * 5); -} - -#if ENABLE(OFFLINE_WEB_APPLICATIONS) -void ChromeClientImpl::reachedMaxAppCacheSize(int64_t space_needed) { - ASSERT_NOT_REACHED(); -} -#endif - -void ChromeClientImpl::runOpenPanel(WebCore::Frame* frame, - PassRefPtr<WebCore::FileChooser> file_chooser) { - WebViewClient* client = webview_->client(); - if (!client) - return; - - bool multiple_files = file_chooser->allowsMultipleFiles(); - - WebString suggestion; - if (file_chooser->filenames().size() > 0) - suggestion = webkit_glue::StringToWebString(file_chooser->filenames()[0]); - - WebFileChooserCompletionImpl* chooser_completion = - new WebFileChooserCompletionImpl(file_chooser); - bool ok = client->runFileChooser(multiple_files, - WebString(), - suggestion, - chooser_completion); - if (!ok) { - // Choosing failed, so do callback with an empty list. - chooser_completion->didChooseFile(WebVector<WebString>()); - } -} - -void ChromeClientImpl::popupOpened(PopupContainer* popup_container, - const WebCore::IntRect& bounds, - bool activatable, - bool handle_externally) { - if (!webview_->client()) - return; - - WebWidget* webwidget; - if (handle_externally) { - WebPopupMenuInfo popup_info; - GetPopupMenuInfo(popup_container, &popup_info); - webwidget = webview_->client()->createPopupMenu(popup_info); - } else { - webwidget = webview_->client()->createPopupMenu(activatable); - } - - static_cast<WebPopupMenuImpl*>(webwidget)->Init( - popup_container, webkit_glue::IntRectToWebRect(bounds)); -} - -void ChromeClientImpl::SetCursor(const WebCursorInfo& cursor) { - if (ignore_next_set_cursor_) { - ignore_next_set_cursor_ = false; - return; - } - - if (webview_->client()) - webview_->client()->didChangeCursor(cursor); -} - -void ChromeClientImpl::SetCursorForPlugin(const WebCursorInfo& cursor) { - SetCursor(cursor); - // Currently, Widget::setCursor is always called after this function in - // EventHandler.cpp and since we don't want that we set a flag indicating - // that the next SetCursor call is to be ignored. - ignore_next_set_cursor_ = true; -} - -void ChromeClientImpl::formStateDidChange(const WebCore::Node* node) { - // The current history item is not updated yet. That happens lazily when - // WebFrame::currentHistoryItem is requested. - WebFrameImpl* webframe = WebFrameImpl::FromFrame(node->document()->frame()); - if (webframe->client()) - webframe->client()->didUpdateCurrentHistoryItem(webframe); -} - -void ChromeClientImpl::GetPopupMenuInfo(PopupContainer* popup_container, - WebPopupMenuInfo* info) { - const Vector<PopupItem*>& input_items = popup_container->popupData(); - - WebVector<WebPopupMenuInfo::Item> output_items(input_items.size()); - - for (size_t i = 0; i < input_items.size(); ++i) { - const PopupItem& input_item = *input_items[i]; - WebPopupMenuInfo::Item& output_item = output_items[i]; - - output_item.label = webkit_glue::StringToWebString(input_item.label); - output_item.enabled = input_item.enabled; - - switch (input_item.type) { - case PopupItem::TypeOption: - output_item.type = WebPopupMenuInfo::Item::Option; - break; - case PopupItem::TypeGroup: - output_item.type = WebPopupMenuInfo::Item::Group; - break; - case PopupItem::TypeSeparator: - output_item.type = WebPopupMenuInfo::Item::Separator; - break; - default: - ASSERT_NOT_REACHED(); - } - } - - info->itemHeight = popup_container->menuItemHeight(); - info->selectedIndex = popup_container->selectedIndex(); - info->items.swap(output_items); -} - -#if ENABLE(NOTIFICATIONS) -WebCore::NotificationPresenter* ChromeClientImpl::notificationPresenter() const { - return webview_->GetNotificationPresenter(); -} -#endif |