| Index: webkit/pending/DOMWindow.cpp
|
| ===================================================================
|
| --- webkit/pending/DOMWindow.cpp (revision 2884)
|
| +++ webkit/pending/DOMWindow.cpp (working copy)
|
| @@ -1,1192 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "DOMWindow.h"
|
| -
|
| -#include "BarInfo.h"
|
| -#include "CSSComputedStyleDeclaration.h"
|
| -#include "CSSRuleList.h"
|
| -#include "CSSStyleSelector.h"
|
| -#include "CString.h"
|
| -#include "Chrome.h"
|
| -#include "Console.h"
|
| -#include "DOMSelection.h"
|
| -#include "Document.h"
|
| -#include "Element.h"
|
| -#include "ExceptionCode.h"
|
| -#include "FloatRect.h"
|
| -#include "Frame.h"
|
| -#include "FrameLoader.h"
|
| -#include "FrameTree.h"
|
| -#include "FrameView.h"
|
| -#include "HTMLFrameOwnerElement.h"
|
| -#include "History.h"
|
| -#include "Location.h"
|
| -#include "MessageEvent.h"
|
| -#include "Navigator.h"
|
| -#include "Page.h"
|
| -#include "PageGroup.h"
|
| -#include "PlatformScreen.h"
|
| -#include "PlatformString.h"
|
| -#include "Screen.h"
|
| -#include "SecurityOrigin.h"
|
| -#include "Settings.h"
|
| -#include "ScriptController.h"
|
| -#include <algorithm>
|
| -#include <wtf/MathExtras.h>
|
| -
|
| -#if ENABLE(DATABASE)
|
| -#include "Database.h"
|
| -#endif
|
| -
|
| -#if ENABLE(DOM_STORAGE)
|
| -#include "LocalStorage.h"
|
| -#include "SessionStorage.h"
|
| -#include "Storage.h"
|
| -#include "StorageArea.h"
|
| -#endif
|
| -
|
| -#if ENABLE(OFFLINE_WEB_APPLICATIONS)
|
| -#include "DOMApplicationCache.h"
|
| -#endif
|
| -
|
| -using std::min;
|
| -using std::max;
|
| -
|
| -#if USE(V8)
|
| -#include "Location.h"
|
| -#include "Navigator.h"
|
| -#include "CString.h"
|
| -#include "FloatRect.h"
|
| -#include "FrameTree.h"
|
| -#include "FrameView.h"
|
| -#include "Page.h"
|
| -#include "Chrome.h"
|
| -#include "WindowFeatures.h"
|
| -#include "FrameLoadRequest.h"
|
| -#include "ScheduledAction.h"
|
| -#include "PausedTimeouts.h"
|
| -#include "v8_proxy.h"
|
| -
|
| -#if PLATFORM(WIN)
|
| -#include <windows.h>
|
| -#endif // WIN
|
| -
|
| -#include "CSSHelper.h" // parseURL
|
| -#endif // V8
|
| -
|
| -
|
| -namespace WebCore {
|
| -
|
| -class PostMessageTimer : public TimerBase {
|
| -public:
|
| - PostMessageTimer(DOMWindow* window, PassRefPtr<MessageEvent> event, SecurityOrigin* targetOrigin)
|
| - : m_window(window)
|
| - , m_event(event)
|
| - , m_targetOrigin(targetOrigin)
|
| - {
|
| - }
|
| -
|
| - MessageEvent* event() const { return m_event.get(); }
|
| - SecurityOrigin* targetOrigin() const { return m_targetOrigin.get(); }
|
| -
|
| -private:
|
| - virtual void fired()
|
| - {
|
| - m_window->postMessageTimerFired(this);
|
| - }
|
| -
|
| - RefPtr<DOMWindow> m_window;
|
| - RefPtr<MessageEvent> m_event;
|
| - RefPtr<SecurityOrigin> m_targetOrigin;
|
| -};
|
| -
|
| -// This function:
|
| -// 1) Validates the pending changes are not changing to NaN
|
| -// 2) Constrains the window rect to no smaller than 100 in each dimension and no
|
| -// bigger than the the float rect's dimensions.
|
| -// 3) Constrain window rect to within the top and left boundaries of the screen rect
|
| -// 4) Constraint the window rect to within the bottom and right boundaries of the
|
| -// screen rect.
|
| -// 5) Translate the window rect coordinates to be within the coordinate space of
|
| -// the screen rect.
|
| -void DOMWindow::adjustWindowRect(const FloatRect& screen, FloatRect& window, const FloatRect& pendingChanges)
|
| -{
|
| - // Make sure we're in a valid state before adjusting dimensions.
|
| - ASSERT(isfinite(screen.x()));
|
| - ASSERT(isfinite(screen.y()));
|
| - ASSERT(isfinite(screen.width()));
|
| - ASSERT(isfinite(screen.height()));
|
| - ASSERT(isfinite(window.x()));
|
| - ASSERT(isfinite(window.y()));
|
| - ASSERT(isfinite(window.width()));
|
| - ASSERT(isfinite(window.height()));
|
| -
|
| - // Update window values if new requested values are not NaN.
|
| - if (!isnan(pendingChanges.x()))
|
| - window.setX(pendingChanges.x());
|
| - if (!isnan(pendingChanges.y()))
|
| - window.setY(pendingChanges.y());
|
| - if (!isnan(pendingChanges.width()))
|
| - window.setWidth(pendingChanges.width());
|
| - if (!isnan(pendingChanges.height()))
|
| - window.setHeight(pendingChanges.height());
|
| -
|
| - // Resize the window to between 100 and the screen width and height.
|
| - window.setWidth(min(max(100.0f, window.width()), screen.width()));
|
| - window.setHeight(min(max(100.0f, window.height()), screen.height()));
|
| -
|
| - // Constrain the window position to the screen.
|
| - window.setX(max(screen.x(), min(window.x(), screen.right() - window.width())));
|
| - window.setY(max(screen.y(), min(window.y(), screen.bottom() - window.height())));
|
| -}
|
| -
|
| -#if USE(V8)
|
| -
|
| -static int lastUsedTimeoutId;
|
| -static int timerNestingLevel = 0;
|
| -const int kMaxTimerNestingLevel = 5;
|
| -const double kMinimumTimerInterval = 0.001; // Change this to speed up Javascript's setTimeout!
|
| -
|
| -class DOMWindowTimer : public TimerBase {
|
| -public:
|
| - DOMWindowTimer(int timeoutId, int nestingLevel,
|
| - DOMWindow* o, ScheduledAction* a)
|
| - : m_timeoutId(timeoutId), m_nestingLevel(nestingLevel),
|
| - m_object(o), m_action(a) { }
|
| -
|
| - virtual ~DOMWindowTimer() { delete m_action; }
|
| -
|
| - int timeoutId() const { return m_timeoutId; }
|
| -
|
| - int nestingLevel() const { return m_nestingLevel; }
|
| - void setNestingLevel(int n) { m_nestingLevel = n; }
|
| -
|
| - ScheduledAction* action() const { return m_action; }
|
| - ScheduledAction* takeAction() { ScheduledAction* a = m_action; m_action = 0; return a; }
|
| -
|
| -private:
|
| - virtual void fired();
|
| -
|
| - int m_timeoutId;
|
| - int m_nestingLevel;
|
| - DOMWindow* m_object;
|
| - ScheduledAction* m_action;
|
| -};
|
| -
|
| -void DOMWindowTimer::fired() {
|
| - timerNestingLevel = m_nestingLevel;
|
| - m_object->timerFired(this);
|
| - timerNestingLevel = 0;
|
| -}
|
| -
|
| -#endif // V8
|
| -
|
| -
|
| -DOMWindow::DOMWindow(Frame* frame)
|
| - : m_frame(frame)
|
| -{
|
| -}
|
| -
|
| -DOMWindow::~DOMWindow()
|
| -{
|
| - if (m_frame)
|
| - m_frame->clearFormerDOMWindow(this);
|
| -}
|
| -
|
| -void DOMWindow::disconnectFrame()
|
| -{
|
| - m_frame = 0;
|
| - clear();
|
| -}
|
| -
|
| -void DOMWindow::clear()
|
| -{
|
| - if (m_screen)
|
| - m_screen->disconnectFrame();
|
| - m_screen = 0;
|
| -
|
| - if (m_selection)
|
| - m_selection->disconnectFrame();
|
| - m_selection = 0;
|
| -
|
| - if (m_history)
|
| - m_history->disconnectFrame();
|
| - m_history = 0;
|
| -
|
| - if (m_locationbar)
|
| - m_locationbar->disconnectFrame();
|
| - m_locationbar = 0;
|
| -
|
| - if (m_menubar)
|
| - m_menubar->disconnectFrame();
|
| - m_menubar = 0;
|
| -
|
| - if (m_personalbar)
|
| - m_personalbar->disconnectFrame();
|
| - m_personalbar = 0;
|
| -
|
| - if (m_scrollbars)
|
| - m_scrollbars->disconnectFrame();
|
| - m_scrollbars = 0;
|
| -
|
| - if (m_statusbar)
|
| - m_statusbar->disconnectFrame();
|
| - m_statusbar = 0;
|
| -
|
| - if (m_toolbar)
|
| - m_toolbar->disconnectFrame();
|
| - m_toolbar = 0;
|
| -
|
| - if (m_console)
|
| - m_console->disconnectFrame();
|
| - m_console = 0;
|
| -
|
| - if (m_navigator)
|
| - m_navigator->disconnectFrame();
|
| - m_navigator = 0;
|
| -
|
| - if (m_location)
|
| - m_location->disconnectFrame();
|
| - m_location = 0;
|
| -
|
| -#if ENABLE(DOM_STORAGE)
|
| - if (m_sessionStorage)
|
| - m_sessionStorage->disconnectFrame();
|
| - m_sessionStorage = 0;
|
| -
|
| - if (m_localStorage)
|
| - m_localStorage->disconnectFrame();
|
| - m_localStorage = 0;
|
| -#endif
|
| -
|
| -#if ENABLE(OFFLINE_WEB_APPLICATIONS)
|
| - if (m_applicationCache)
|
| - m_applicationCache->disconnectFrame();
|
| - m_applicationCache = 0;
|
| -#endif
|
| -}
|
| -
|
| -Screen* DOMWindow::screen() const
|
| -{
|
| - if (!m_screen)
|
| - m_screen = Screen::create(m_frame);
|
| - return m_screen.get();
|
| -}
|
| -
|
| -History* DOMWindow::history() const
|
| -{
|
| - if (!m_history)
|
| - m_history = History::create(m_frame);
|
| - return m_history.get();
|
| -}
|
| -
|
| -BarInfo* DOMWindow::locationbar() const
|
| -{
|
| - if (!m_locationbar)
|
| - m_locationbar = BarInfo::create(m_frame, BarInfo::Locationbar);
|
| - return m_locationbar.get();
|
| -}
|
| -
|
| -BarInfo* DOMWindow::menubar() const
|
| -{
|
| - if (!m_menubar)
|
| - m_menubar = BarInfo::create(m_frame, BarInfo::Menubar);
|
| - return m_menubar.get();
|
| -}
|
| -
|
| -BarInfo* DOMWindow::personalbar() const
|
| -{
|
| - if (!m_personalbar)
|
| - m_personalbar = BarInfo::create(m_frame, BarInfo::Personalbar);
|
| - return m_personalbar.get();
|
| -}
|
| -
|
| -BarInfo* DOMWindow::scrollbars() const
|
| -{
|
| - if (!m_scrollbars)
|
| - m_scrollbars = BarInfo::create(m_frame, BarInfo::Scrollbars);
|
| - return m_scrollbars.get();
|
| -}
|
| -
|
| -BarInfo* DOMWindow::statusbar() const
|
| -{
|
| - if (!m_statusbar)
|
| - m_statusbar = BarInfo::create(m_frame, BarInfo::Statusbar);
|
| - return m_statusbar.get();
|
| -}
|
| -
|
| -BarInfo* DOMWindow::toolbar() const
|
| -{
|
| - if (!m_toolbar)
|
| - m_toolbar = BarInfo::create(m_frame, BarInfo::Toolbar);
|
| - return m_toolbar.get();
|
| -}
|
| -
|
| -Console* DOMWindow::console() const
|
| -{
|
| - if (!m_console)
|
| - m_console = Console::create(m_frame);
|
| - return m_console.get();
|
| -}
|
| -
|
| -#if ENABLE(OFFLINE_WEB_APPLICATIONS)
|
| -DOMApplicationCache* DOMWindow::applicationCache() const
|
| -{
|
| - if (!m_applicationCache)
|
| - m_applicationCache = DOMApplicationCache::create(m_frame);
|
| - return m_applicationCache.get();
|
| -}
|
| -#endif
|
| -
|
| -Navigator* DOMWindow::navigator() const
|
| -{
|
| - if (!m_navigator)
|
| - m_navigator = Navigator::create(m_frame);
|
| - return m_navigator.get();
|
| -}
|
| -
|
| -Location* DOMWindow::location() const
|
| -{
|
| - if (!m_location)
|
| - m_location = Location::create(m_frame);
|
| - return m_location.get();
|
| -}
|
| -
|
| -#if ENABLE(DOM_STORAGE)
|
| -Storage* DOMWindow::sessionStorage() const
|
| -{
|
| - if (m_sessionStorage)
|
| - return m_sessionStorage.get();
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return 0;
|
| -
|
| - Document* document = m_frame->document();
|
| - if (!document)
|
| - return 0;
|
| -
|
| - RefPtr<StorageArea> storageArea = page->sessionStorage()->storageArea(document->securityOrigin());
|
| - m_sessionStorage = Storage::create(m_frame, storageArea.release());
|
| - return m_sessionStorage.get();
|
| -}
|
| -
|
| -Storage* DOMWindow::localStorage() const
|
| -{
|
| - Document* document = this->document();
|
| - if (!document)
|
| - return 0;
|
| -
|
| - Page* page = document->page();
|
| - if (!page)
|
| - return 0;
|
| -
|
| - LocalStorage* localStorage = page->group().localStorage();
|
| - RefPtr<StorageArea> storageArea = localStorage ? localStorage->storageArea(m_frame, document->securityOrigin()) : 0;
|
| - if (storageArea)
|
| - m_localStorage = Storage::create(m_frame, storageArea.release());
|
| -
|
| - return m_localStorage.get();
|
| -}
|
| -#endif
|
| -
|
| -void DOMWindow::postMessage(const String& message, const String& targetOrigin, DOMWindow* source, ExceptionCode& ec)
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - // Compute the target origin. We need to do this synchronously in order
|
| - // to generate the SYNTAX_ERR exception correctly.
|
| - RefPtr<SecurityOrigin> target;
|
| - if (targetOrigin != "*") {
|
| - target = SecurityOrigin::create(KURL(targetOrigin));
|
| - if (target->isEmpty()) {
|
| - ec = SYNTAX_ERR;
|
| - return;
|
| - }
|
| - }
|
| -
|
| - // Capture the source of the message. We need to do this synchronously
|
| - // in order to capture the source of the message correctly.
|
| - Document* sourceDocument = source->document();
|
| - if (!sourceDocument)
|
| - return;
|
| - String sourceOrigin = sourceDocument->securityOrigin()->toString();
|
| -
|
| - // Schedule the message.
|
| - PostMessageTimer* timer = new PostMessageTimer(this, MessageEvent::create(message, sourceOrigin, "", source), target.get());
|
| - timer->startOneShot(0);
|
| -}
|
| -
|
| -void DOMWindow::postMessageTimerFired(PostMessageTimer* t)
|
| -{
|
| - OwnPtr<PostMessageTimer> timer(t);
|
| -
|
| - if (!document())
|
| - return;
|
| -
|
| - if (timer->targetOrigin()) {
|
| - // Check target origin now since the target document may have changed since the simer was scheduled.
|
| - if (!timer->targetOrigin()->isSameSchemeHostPort(document()->securityOrigin())) {
|
| - String message = String::format("Unable to post message to %s. Recipient has origin %s.\n",
|
| - timer->targetOrigin()->toString().utf8().data(), document()->securityOrigin()->toString().utf8().data());
|
| - console()->addMessage(JSMessageSource, ErrorMessageLevel, message, 0, String());
|
| - return;
|
| - }
|
| - }
|
| -
|
| - document()->dispatchWindowEvent(timer->event());
|
| -}
|
| -
|
| -DOMSelection* DOMWindow::getSelection()
|
| -{
|
| - if (!m_selection)
|
| - m_selection = DOMSelection::create(m_frame);
|
| - return m_selection.get();
|
| -}
|
| -
|
| -Element* DOMWindow::frameElement() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - return m_frame->ownerElement();
|
| -}
|
| -
|
| -void DOMWindow::focus()
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - m_frame->focusWindow();
|
| -}
|
| -
|
| -void DOMWindow::blur()
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - m_frame->unfocusWindow();
|
| -}
|
| -
|
| -void DOMWindow::close()
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - Settings* settings = m_frame->settings();
|
| - bool allow_scripts_to_close_windows =
|
| - (settings && settings->allowScriptsToCloseWindows());
|
| -
|
| - if (m_frame->loader()->openedByDOM()
|
| - || m_frame->loader()->getHistoryLength() <= 1
|
| - || allow_scripts_to_close_windows)
|
| - m_frame->scheduleClose();
|
| -}
|
| -
|
| -void DOMWindow::print()
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return;
|
| -
|
| - page->chrome()->print(m_frame);
|
| -}
|
| -
|
| -void DOMWindow::stop()
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - // Ignores stop() in unload event handlers
|
| - if (m_frame->loader()->firingUnloadEvents())
|
| - return;
|
| -
|
| - // We must check whether the load is complete asynchronously,
|
| - // because we might still be parsing the document until the
|
| - // callstack unwinds.
|
| - m_frame->loader()->stopForUserCancel(true);
|
| -}
|
| -
|
| -void DOMWindow::alert(const String& message)
|
| -{
|
| -#if USE(V8)
|
| - // Before showing the JavaScript dialog, we give
|
| - // the proxy implementation a chance to process any
|
| - // pending console messages.
|
| - V8Proxy::ProcessConsoleMessages();
|
| -#endif
|
| -
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - Document* doc = m_frame->document();
|
| - ASSERT(doc);
|
| - if (doc)
|
| - doc->updateRendering();
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return;
|
| -
|
| - page->chrome()->runJavaScriptAlert(m_frame, message);
|
| -}
|
| -
|
| -bool DOMWindow::confirm(const String& message)
|
| -{
|
| -#if USE(V8)
|
| - // Before showing the JavaScript dialog, we give
|
| - // the proxy implementation a chance to process any
|
| - // pending console messages.
|
| - V8Proxy::ProcessConsoleMessages();
|
| -#endif
|
| -
|
| - if (!m_frame)
|
| - return false;
|
| -
|
| - Document* doc = m_frame->document();
|
| - ASSERT(doc);
|
| - if (doc)
|
| - doc->updateRendering();
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return false;
|
| -
|
| - return page->chrome()->runJavaScriptConfirm(m_frame, message);
|
| -}
|
| -
|
| -String DOMWindow::prompt(const String& message, const String& defaultValue)
|
| -{
|
| -#if USE(V8)
|
| - // Before showing the JavaScript dialog, we give
|
| - // the proxy implementation a chance to process any
|
| - // pending console messages.
|
| - V8Proxy::ProcessConsoleMessages();
|
| -#endif
|
| -
|
| - if (!m_frame)
|
| - return String();
|
| -
|
| - Document* doc = m_frame->document();
|
| - ASSERT(doc);
|
| - if (doc)
|
| - doc->updateRendering();
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return String();
|
| -
|
| - String returnValue;
|
| - if (page->chrome()->runJavaScriptPrompt(m_frame, message, defaultValue, returnValue))
|
| - return returnValue;
|
| -
|
| - return String();
|
| -}
|
| -
|
| -bool DOMWindow::find(const String& string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const
|
| -{
|
| - if (!m_frame)
|
| - return false;
|
| -
|
| - // FIXME (13016): Support wholeWord, searchInFrames and showDialog
|
| - return m_frame->findString(string, !backwards, caseSensitive, wrap, false);
|
| -}
|
| -
|
| -bool DOMWindow::offscreenBuffering() const
|
| -{
|
| - return true;
|
| -}
|
| -
|
| -int DOMWindow::outerHeight() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return 0;
|
| -
|
| - return static_cast<int>(page->chrome()->windowRect().height());
|
| -}
|
| -
|
| -int DOMWindow::outerWidth() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return 0;
|
| -
|
| - return static_cast<int>(page->chrome()->windowRect().width());
|
| -}
|
| -
|
| -int DOMWindow::innerHeight() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - FrameView* view = m_frame->view();
|
| - if (!view)
|
| - return 0;
|
| -
|
| - return static_cast<int>(view->height() / m_frame->pageZoomFactor());
|
| -}
|
| -
|
| -int DOMWindow::innerWidth() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - FrameView* view = m_frame->view();
|
| - if (!view)
|
| - return 0;
|
| -
|
| - return static_cast<int>(view->width() / m_frame->pageZoomFactor());
|
| -}
|
| -
|
| -int DOMWindow::screenX() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return 0;
|
| -
|
| - return static_cast<int>(page->chrome()->windowRect().x());
|
| -}
|
| -
|
| -int DOMWindow::screenY() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return 0;
|
| -
|
| - return static_cast<int>(page->chrome()->windowRect().y());
|
| -}
|
| -
|
| -int DOMWindow::scrollX() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - FrameView* view = m_frame->view();
|
| - if (!view)
|
| - return 0;
|
| -
|
| - Document* doc = m_frame->document();
|
| - ASSERT(doc);
|
| - if (doc)
|
| - doc->updateLayoutIgnorePendingStylesheets();
|
| -
|
| - return static_cast<int>(view->contentsX() / m_frame->pageZoomFactor());
|
| -}
|
| -
|
| -int DOMWindow::scrollY() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - FrameView* view = m_frame->view();
|
| - if (!view)
|
| - return 0;
|
| -
|
| - Document* doc = m_frame->document();
|
| - ASSERT(doc);
|
| - if (doc)
|
| - doc->updateLayoutIgnorePendingStylesheets();
|
| -
|
| - return static_cast<int>(view->contentsY() / m_frame->pageZoomFactor());
|
| -}
|
| -
|
| -bool DOMWindow::closed() const
|
| -{
|
| - return !m_frame;
|
| -}
|
| -
|
| -unsigned DOMWindow::length() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - return m_frame->tree()->childCount();
|
| -}
|
| -
|
| -String DOMWindow::name() const
|
| -{
|
| - if (!m_frame)
|
| - return String();
|
| -
|
| - return m_frame->tree()->name();
|
| -}
|
| -
|
| -void DOMWindow::setName(const String& string)
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - m_frame->tree()->setName(string);
|
| -}
|
| -
|
| -String DOMWindow::status() const
|
| -{
|
| - if (!m_frame)
|
| - return String();
|
| -
|
| - return m_frame->jsStatusBarText();
|
| -}
|
| -
|
| -void DOMWindow::setStatus(const String& string)
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - m_frame->setJSStatusBarText(string);
|
| -}
|
| -
|
| -String DOMWindow::defaultStatus() const
|
| -{
|
| - if (!m_frame)
|
| - return String();
|
| -
|
| - return m_frame->jsDefaultStatusBarText();
|
| -}
|
| -
|
| -void DOMWindow::setDefaultStatus(const String& string)
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - m_frame->setJSDefaultStatusBarText(string);
|
| -}
|
| -
|
| -DOMWindow* DOMWindow::self() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - return m_frame->domWindow();
|
| -}
|
| -
|
| -DOMWindow* DOMWindow::opener() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Frame* opener = m_frame->loader()->opener();
|
| - if (!opener)
|
| - return 0;
|
| -
|
| - return opener->domWindow();
|
| -}
|
| -
|
| -DOMWindow* DOMWindow::parent() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Frame* parent = m_frame->tree()->parent(true);
|
| - if (parent)
|
| - return parent->domWindow();
|
| -
|
| - return m_frame->domWindow();
|
| -}
|
| -
|
| -DOMWindow* DOMWindow::top() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return 0;
|
| -
|
| - return m_frame->tree()->top(true)->domWindow();
|
| -}
|
| -
|
| -Document* DOMWindow::document() const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - ASSERT(m_frame->document());
|
| - return m_frame->document();
|
| -}
|
| -
|
| -PassRefPtr<CSSStyleDeclaration> DOMWindow::getComputedStyle(Element* elt, const String&) const
|
| -{
|
| - if (!elt)
|
| - return 0;
|
| -
|
| - // FIXME: This needs take pseudo elements into account.
|
| - return computedStyle(elt);
|
| -}
|
| -
|
| -PassRefPtr<CSSRuleList> DOMWindow::getMatchedCSSRules(Element* elt, const String& pseudoElt, bool authorOnly) const
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - Document* doc = m_frame->document();
|
| - ASSERT(doc);
|
| - if (!doc)
|
| - return 0;
|
| -
|
| - if (!pseudoElt.isEmpty())
|
| - return doc->styleSelector()->pseudoStyleRulesForElement(elt, pseudoElt, authorOnly);
|
| - return doc->styleSelector()->styleRulesForElement(elt, authorOnly);
|
| -}
|
| -
|
| -double DOMWindow::devicePixelRatio() const
|
| -{
|
| - if (!m_frame)
|
| - return 0.0;
|
| -
|
| - Page* page = m_frame->page();
|
| - if (!page)
|
| - return 0.0;
|
| -
|
| - return page->chrome()->scaleFactor();
|
| -}
|
| -
|
| -#if USE(V8)
|
| -
|
| -static void setWindowFeature(const String& keyString, const String& valueString, WindowFeatures& windowFeatures) {
|
| - int value;
|
| -
|
| - if (valueString.length() == 0 || // listing a key with no value is shorthand for key=yes
|
| - valueString == "yes")
|
| - value = 1;
|
| - else
|
| - value = valueString.toInt();
|
| -
|
| - if (keyString == "left" || keyString == "screenx") {
|
| - windowFeatures.xSet = true;
|
| - windowFeatures.x = value;
|
| - } else if (keyString == "top" || keyString == "screeny") {
|
| - windowFeatures.ySet = true;
|
| - windowFeatures.y = value;
|
| - } else if (keyString == "width" || keyString == "innerwidth") {
|
| - windowFeatures.widthSet = true;
|
| - windowFeatures.width = value;
|
| - } else if (keyString == "height" || keyString == "innerheight") {
|
| - windowFeatures.heightSet = true;
|
| - windowFeatures.height = value;
|
| - } else if (keyString == "menubar")
|
| - windowFeatures.menuBarVisible = value;
|
| - else if (keyString == "toolbar")
|
| - windowFeatures.toolBarVisible = value;
|
| - else if (keyString == "location")
|
| - windowFeatures.locationBarVisible = value;
|
| - else if (keyString == "status")
|
| - windowFeatures.statusBarVisible = value;
|
| - else if (keyString == "resizable")
|
| - windowFeatures.resizable = value;
|
| - else if (keyString == "fullscreen")
|
| - windowFeatures.fullscreen = value;
|
| - else if (keyString == "scrollbars")
|
| - windowFeatures.scrollbarsVisible = value;
|
| -}
|
| -
|
| -
|
| -void DOMWindow::back()
|
| -{
|
| - if (m_history)
|
| - m_history->back();
|
| -}
|
| -
|
| -void DOMWindow::forward()
|
| -{
|
| - if (m_history)
|
| - m_history->forward();
|
| -}
|
| -
|
| -Location* DOMWindow::location()
|
| -{
|
| - if (!m_location)
|
| - m_location = Location::create(m_frame);
|
| - return m_location.get();
|
| -}
|
| -
|
| -void DOMWindow::setLocation(const String& v) {
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - Frame* active_frame = ScriptController::retrieveActiveFrame();
|
| - if (!active_frame)
|
| - return;
|
| -
|
| - if (!active_frame->loader()->shouldAllowNavigation(m_frame))
|
| - return;
|
| -
|
| - if (!parseURL(v).startsWith("javascript:", false) ||
|
| - ScriptController::isSafeScript(m_frame)) {
|
| - String completed_url = active_frame->loader()->completeURL(v).string();
|
| -
|
| - m_frame->loader()->scheduleLocationChange(completed_url,
|
| - active_frame->loader()->outgoingReferrer(), false,
|
| - active_frame->script()->processingUserGesture());
|
| - }
|
| -}
|
| -
|
| -Navigator* DOMWindow::navigator()
|
| -{
|
| - if (!m_navigator)
|
| - m_navigator = Navigator::create(m_frame);
|
| -
|
| - return m_navigator.get();
|
| -}
|
| -
|
| -void DOMWindow::dump(const String& msg)
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - m_frame->domWindow()->console()->addMessage(JSMessageSource,
|
| - ErrorMessageLevel, msg, 0, m_frame->document()->url());
|
| -}
|
| -
|
| -void DOMWindow::scheduleClose()
|
| -{
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - m_frame->scheduleClose();
|
| -}
|
| -
|
| -void DOMWindow::timerFired(DOMWindowTimer* timer) {
|
| - if (!m_frame)
|
| - return;
|
| -
|
| - // Simple case for non-one-shot timers.
|
| - if (timer->isActive()) {
|
| - int timeoutId = timer->timeoutId();
|
| -
|
| - timer->action()->execute(this);
|
| - return;
|
| - }
|
| -
|
| - // Delete timer before executing the action for one-shot timers.
|
| - ScheduledAction* action = timer->takeAction();
|
| - m_timeouts.remove(timer->timeoutId());
|
| - delete timer;
|
| - action->execute(this);
|
| - delete action;
|
| -}
|
| -
|
| -
|
| -void DOMWindow::clearAllTimeouts()
|
| -{
|
| - deleteAllValues(m_timeouts);
|
| - m_timeouts.clear();
|
| -}
|
| -
|
| -int DOMWindow::installTimeout(ScheduledAction* a, int t, bool singleShot) {
|
| - if (!m_frame)
|
| - return 0;
|
| -
|
| - int timeoutId = ++lastUsedTimeoutId;
|
| -
|
| - // avoid wraparound going negative on us
|
| - if (timeoutId <= 0)
|
| - timeoutId = 1;
|
| -
|
| - int nestLevel = timerNestingLevel + 1;
|
| -
|
| - DOMWindowTimer* timer = new DOMWindowTimer(timeoutId, nestLevel, this, a);
|
| - ASSERT(!m_timeouts.get(timeoutId));
|
| - m_timeouts.set(timeoutId, timer);
|
| - double interval = max(kMinimumTimerInterval, t * 0.001);
|
| - if (singleShot)
|
| - timer->startOneShot(interval);
|
| - else
|
| - timer->startRepeating(interval);
|
| -
|
| - return timeoutId;
|
| -}
|
| -
|
| -void DOMWindow::clearTimeout(int timeoutId)
|
| -{
|
| - // timeout IDs have to be positive, and 0 and -1 are unsafe to
|
| - // even look up since they are the empty and deleted value
|
| - // respectively
|
| - if (timeoutId <= 0)
|
| - return;
|
| -
|
| - delete m_timeouts.take(timeoutId);
|
| -}
|
| -
|
| -void DOMWindow::pauseTimeouts(OwnPtr<PausedTimeouts>& pausedTimeouts)
|
| -{
|
| - size_t count = m_timeouts.size();
|
| - if (count == 0) {
|
| - pausedTimeouts.clear();
|
| - return;
|
| - }
|
| -
|
| - PausedTimeout* t = new PausedTimeout[count];
|
| - PausedTimeouts* result = new PausedTimeouts(t, count);
|
| -
|
| - TimeoutsMap::iterator it = m_timeouts.begin();
|
| - for (size_t i = 0; i != count; ++i, ++it) {
|
| - int timeoutId = it->first;
|
| - DOMWindowTimer* timer = it->second;
|
| - t[i].timeoutId = timeoutId;
|
| - t[i].nestingLevel = timer->nestingLevel();
|
| - t[i].nextFireInterval = timer->nextFireInterval();
|
| - t[i].repeatInterval = timer->repeatInterval();
|
| - t[i].action = timer->takeAction();
|
| - }
|
| - ASSERT(it == m_timeouts.end());
|
| -
|
| - deleteAllValues(m_timeouts);
|
| - m_timeouts.clear();
|
| -
|
| - pausedTimeouts.set(result);
|
| -}
|
| -
|
| -void DOMWindow::resumeTimeouts(OwnPtr<PausedTimeouts>& timeouts) {
|
| - if (!timeouts)
|
| - return;
|
| - size_t count = timeouts->numTimeouts();
|
| - PausedTimeout* array = timeouts->takeTimeouts();
|
| - for (size_t i = 0; i != count; ++i) {
|
| - int timeoutId = array[i].timeoutId;
|
| - DOMWindowTimer* timer =
|
| - new DOMWindowTimer(timeoutId, array[i].nestingLevel,
|
| - this, array[i].action);
|
| - m_timeouts.set(timeoutId, timer);
|
| - timer->start(array[i].nextFireInterval, array[i].repeatInterval);
|
| - }
|
| - delete[] array;
|
| - timeouts.clear();
|
| -}
|
| -
|
| -#endif // V8
|
| -
|
| -void DOMWindow::updateLayout() const {
|
| - WebCore::Document* docimpl = m_frame->document();
|
| - if (docimpl)
|
| - docimpl->updateLayoutIgnorePendingStylesheets();
|
| -}
|
| -
|
| -void DOMWindow::moveTo(float x, float y) const {
|
| - if (!m_frame || !m_frame->page()) return;
|
| -
|
| - Page* page = m_frame->page();
|
| - FloatRect fr = page->chrome()->windowRect();
|
| - FloatRect sr = screenAvailableRect(page->mainFrame()->view());
|
| - fr.setLocation(sr.location());
|
| - FloatRect update = fr;
|
| - update.move(x, y);
|
| - // Security check (the spec talks about UniversalBrowserWrite to disable this check...)
|
| - adjustWindowRect(sr, fr, update);
|
| - page->chrome()->setWindowRect(fr);
|
| -}
|
| -
|
| -void DOMWindow::moveBy(float x, float y) const {
|
| - if (!m_frame || !m_frame->page()) return;
|
| -
|
| - Page* page = m_frame->page();
|
| - FloatRect fr = page->chrome()->windowRect();
|
| - FloatRect update = fr;
|
| - update.move(x, y);
|
| - // Security check (the spec talks about UniversalBrowserWrite to disable this check...)
|
| - adjustWindowRect(screenAvailableRect(page->mainFrame()->view()), fr, update);
|
| - page->chrome()->setWindowRect(fr);
|
| -}
|
| -
|
| -void DOMWindow::resizeTo(float x, float y) const {
|
| - if (!m_frame || !m_frame->page()) return;
|
| -
|
| - Page* page = m_frame->page();
|
| - FloatRect fr = page->chrome()->windowRect();
|
| - FloatSize dest = FloatSize(x, y);
|
| - FloatRect update(fr.location(), dest);
|
| - adjustWindowRect(screenAvailableRect(page->mainFrame()->view()), fr, update);
|
| - page->chrome()->setWindowRect(fr);
|
| -}
|
| -
|
| -void DOMWindow::resizeBy(float x, float y) const {
|
| - if (!m_frame || !m_frame->page()) return;
|
| -
|
| - Page* page = m_frame->page();
|
| - FloatRect fr = page->chrome()->windowRect();
|
| - FloatSize dest = fr.size() + FloatSize(x, y);
|
| - FloatRect update(fr.location(), dest);
|
| - adjustWindowRect(screenAvailableRect(page->mainFrame()->view()), fr, update);
|
| - page->chrome()->setWindowRect(fr);
|
| -}
|
| -
|
| -
|
| -void DOMWindow::scrollTo(int x, int y) const {
|
| - if (!m_frame || !m_frame->view())
|
| - return;
|
| -
|
| - if (m_frame->isDisconnected())
|
| - return;
|
| -
|
| - updateLayout();
|
| - m_frame->view()->setContentsPos(x, y);
|
| -}
|
| -
|
| -void DOMWindow::scrollBy(int x, int y) const {
|
| - if (!m_frame || !m_frame->view()) return;
|
| -
|
| - updateLayout();
|
| - m_frame->view()->scrollBy(x, y);
|
| -}
|
| -
|
| -#if ENABLE(DATABASE)
|
| -PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode& ec)
|
| -{
|
| - if (!m_frame)
|
| - return 0;
|
| - return;
|
| -
|
| - if (m_frame->isDisconnected())
|
| - return;
|
| -
|
| - Document* doc = m_frame->document();
|
| - ASSERT(doc);
|
| - if (!doc)
|
| - return 0;
|
| -
|
| - return Database::openDatabase(doc, name, version, displayName, estimatedSize, ec);
|
| -}
|
| -#endif
|
| -
|
| -
|
| -} // namespace WebCore
|
|
|