1 /* 2 * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved. 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 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. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef DOMWindow_h 28 #define DOMWindow_h 29 30 #include "bindings/v8/Dictionary.h" 31 #include "bindings/v8/ScriptWrappable.h" 32 #include "core/events/EventTarget.h" 33 #include "core/frame/DOMWindowBase64.h" 34 #include "core/frame/FrameDestructionObserver.h" 35 #include "platform/LifecycleContext.h" 36 #include "platform/Supplementable.h" 37 #include "platform/heap/Handle.h" 38 39 #include "wtf/Forward.h" 40 41 namespace WebCore { 42 class ApplicationCache; 43 class BarProp; 44 class CSSRuleList; 45 class CSSStyleDeclaration; 46 class Console; 47 class DOMPoint; 48 class DOMSelection; 49 class DOMURL; 50 class DOMWindowProperty; 51 class Database; 52 class DatabaseCallback; 53 class Document; 54 class DocumentInit; 55 class DOMWindowEventQueue; 56 class DOMWindowLifecycleNotifier; 57 class Element; 58 class EventListener; 59 class EventQueue; 60 class ExceptionState; 61 class FloatRect; 62 class FrameConsole; 63 class History; 64 class IDBFactory; 65 class LocalFrame; 66 class Location; 67 class MediaQueryList; 68 class MessageEvent; 69 class Navigator; 70 class Node; 71 class Page; 72 class Performance; 73 class PostMessageTimer; 74 class RequestAnimationFrameCallback; 75 class ScheduledAction; 76 class Screen; 77 class ScriptCallStack; 78 class SecurityOrigin; 79 class SerializedScriptValue; 80 class Storage; 81 class StyleMedia; 82 class DOMWindowCSS; 83 84 struct WindowFeatures; 85 86 typedef Vector<RefPtr<MessagePort>, 1> MessagePortArray; 87 88 enum PageshowEventPersistence { 89 PageshowEventNotPersisted = 0, 90 PageshowEventPersisted = 1 91 }; 92 93 enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList }; 94 95 class LocalDOMWindow FINAL : public RefCountedWillBeRefCountedGarbageCollected<LocalDOMWindow>, public ScriptWrappable, public EventTargetWithInlineData, public DOMWindowBase64, public FrameDestructionObserver, public WillBeHeapSupplementable<LocalDOMWindow>, public LifecycleContext<LocalDOMWindow> { 96 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(LocalDOMWindow); 97 REFCOUNTED_EVENT_TARGET(LocalDOMWindow); 98 public: 99 static PassRefPtrWillBeRawPtr<Document> createDocument(const String& mimeType, const DocumentInit&, bool forceXHTML); 100 static PassRefPtrWillBeRawPtr<LocalDOMWindow> create(LocalFrame& frame) 101 { 102 return adoptRefWillBeRefCountedGarbageCollected(new LocalDOMWindow(frame)); 103 } 104 virtual ~LocalDOMWindow(); 105 106 PassRefPtrWillBeRawPtr<Document> installNewDocument(const String& mimeType, const DocumentInit&, bool forceXHTML = false); 107 108 virtual const AtomicString& interfaceName() const OVERRIDE; 109 virtual ExecutionContext* executionContext() const OVERRIDE; 110 111 virtual LocalDOMWindow* toDOMWindow() OVERRIDE; 112 113 void registerProperty(DOMWindowProperty*); 114 void unregisterProperty(DOMWindowProperty*); 115 116 void reset(); 117 118 PassRefPtrWillBeRawPtr<MediaQueryList> matchMedia(const String&); 119 120 unsigned pendingUnloadEventListeners() const; 121 122 static FloatRect adjustWindowRect(LocalFrame&, const FloatRect& pendingChanges); 123 124 bool allowPopUp(); // Call on first window, not target window. 125 static bool allowPopUp(LocalFrame& firstFrame); 126 static bool canShowModalDialogNow(const LocalFrame*); 127 128 // DOM Level 0 129 130 Screen& screen() const; 131 History& history() const; 132 BarProp& locationbar() const; 133 BarProp& menubar() const; 134 BarProp& personalbar() const; 135 BarProp& scrollbars() const; 136 BarProp& statusbar() const; 137 BarProp& toolbar() const; 138 Navigator& navigator() const; 139 Navigator& clientInformation() const { return navigator(); } 140 141 Location& location() const; 142 void setLocation(const String& location, LocalDOMWindow* callingWindow, LocalDOMWindow* enteredWindow, 143 SetLocationLocking = LockHistoryBasedOnGestureState); 144 145 DOMSelection* getSelection(); 146 147 Element* frameElement() const; 148 149 void focus(ExecutionContext* = 0); 150 void blur(); 151 void close(ExecutionContext* = 0); 152 void print(); 153 void stop(); 154 155 PassRefPtrWillBeRawPtr<LocalDOMWindow> open(const String& urlString, const AtomicString& frameName, const String& windowFeaturesString, 156 LocalDOMWindow* callingWindow, LocalDOMWindow* enteredWindow); 157 158 typedef void (*PrepareDialogFunction)(LocalDOMWindow*, void* context); 159 void showModalDialog(const String& urlString, const String& dialogFeaturesString, 160 LocalDOMWindow* callingWindow, LocalDOMWindow* enteredWindow, PrepareDialogFunction, void* functionContext); 161 162 void alert(const String& message = String()); 163 bool confirm(const String& message); 164 String prompt(const String& message, const String& defaultValue); 165 166 bool find(const String&, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const; 167 168 bool offscreenBuffering() const; 169 170 int outerHeight() const; 171 int outerWidth() const; 172 int innerHeight() const; 173 int innerWidth() const; 174 int screenX() const; 175 int screenY() const; 176 int screenLeft() const { return screenX(); } 177 int screenTop() const { return screenY(); } 178 int scrollX() const; 179 int scrollY() const; 180 int pageXOffset() const { return scrollX(); } 181 int pageYOffset() const { return scrollY(); } 182 183 bool closed() const; 184 185 unsigned length() const; 186 187 const AtomicString& name() const; 188 void setName(const AtomicString&); 189 190 String status() const; 191 void setStatus(const String&); 192 String defaultStatus() const; 193 void setDefaultStatus(const String&); 194 195 // Self-referential attributes 196 197 LocalDOMWindow* self() const; 198 LocalDOMWindow* window() const { return self(); } 199 LocalDOMWindow* frames() const { return self(); } 200 201 LocalDOMWindow* opener() const; 202 LocalDOMWindow* parent() const; 203 LocalDOMWindow* top() const; 204 205 // DOM Level 2 AbstractView Interface 206 207 Document* document() const; 208 209 // CSSOM View Module 210 211 StyleMedia& styleMedia() const; 212 213 // DOM Level 2 Style Interface 214 215 PassRefPtrWillBeRawPtr<CSSStyleDeclaration> getComputedStyle(Element*, const String& pseudoElt) const; 216 217 // WebKit extensions 218 219 PassRefPtrWillBeRawPtr<CSSRuleList> getMatchedCSSRules(Element*, const String& pseudoElt) const; 220 double devicePixelRatio() const; 221 222 PassRefPtrWillBeRawPtr<DOMPoint> webkitConvertPointFromPageToNode(Node*, const DOMPoint*) const; 223 PassRefPtrWillBeRawPtr<DOMPoint> webkitConvertPointFromNodeToPage(Node*, const DOMPoint*) const; 224 225 Console& console() const; 226 FrameConsole* frameConsole() const; 227 228 void printErrorMessage(const String&); 229 String crossDomainAccessErrorMessage(LocalDOMWindow* callingWindow); 230 String sanitizedCrossDomainAccessErrorMessage(LocalDOMWindow* callingWindow); 231 232 void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, const String& targetOrigin, LocalDOMWindow* source, ExceptionState&); 233 void postMessageTimerFired(PostMessageTimer*); 234 void dispatchMessageEventWithOriginCheck(SecurityOrigin* intendedTargetOrigin, PassRefPtrWillBeRawPtr<Event>, PassRefPtrWillBeRawPtr<ScriptCallStack>); 235 236 void scrollBy(int x, int y) const; 237 void scrollBy(int x, int y, const Dictionary& scrollOptions, ExceptionState&) const; 238 void scrollTo(int x, int y) const; 239 void scrollTo(int x, int y, const Dictionary& scrollOptions, ExceptionState&) const; 240 void scroll(int x, int y) const { scrollTo(x, y); } 241 void scroll(int x, int y, const Dictionary& scrollOptions, ExceptionState& exceptionState) const { scrollTo(x, y, scrollOptions, exceptionState); } 242 243 void moveBy(float x, float y) const; 244 void moveTo(float x, float y) const; 245 246 void resizeBy(float x, float y) const; 247 void resizeTo(float width, float height) const; 248 249 // WebKit animation extensions 250 int requestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback>); 251 int webkitRequestAnimationFrame(PassOwnPtr<RequestAnimationFrameCallback>); 252 void cancelAnimationFrame(int id); 253 254 DOMWindowCSS& css() const; 255 256 // Events 257 // EventTarget API 258 virtual bool addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture = false) OVERRIDE; 259 virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture = false) OVERRIDE; 260 virtual void removeAllEventListeners() OVERRIDE; 261 262 using EventTarget::dispatchEvent; 263 bool dispatchEvent(PassRefPtrWillBeRawPtr<Event> prpEvent, PassRefPtrWillBeRawPtr<EventTarget> prpTarget); 264 265 void dispatchLoadEvent(); 266 267 DEFINE_ATTRIBUTE_EVENT_LISTENER(animationend); 268 DEFINE_ATTRIBUTE_EVENT_LISTENER(animationiteration); 269 DEFINE_ATTRIBUTE_EVENT_LISTENER(animationstart); 270 DEFINE_ATTRIBUTE_EVENT_LISTENER(search); 271 DEFINE_ATTRIBUTE_EVENT_LISTENER(transitionend); 272 DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel); 273 274 DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationstart, webkitAnimationStart); 275 DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationiteration, webkitAnimationIteration); 276 DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationend, webkitAnimationEnd); 277 DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkittransitionend, webkitTransitionEnd); 278 279 void captureEvents() { } 280 void releaseEvents() { } 281 282 void finishedLoading(); 283 284 // HTML 5 key/value storage 285 Storage* sessionStorage(ExceptionState&) const; 286 Storage* localStorage(ExceptionState&) const; 287 Storage* optionalSessionStorage() const { return m_sessionStorage.get(); } 288 Storage* optionalLocalStorage() const { return m_localStorage.get(); } 289 290 ApplicationCache* applicationCache() const; 291 ApplicationCache* optionalApplicationCache() const { return m_applicationCache.get(); } 292 293 // This is the interface orientation in degrees. Some examples are: 294 // 0 is straight up; -90 is when the device is rotated 90 clockwise; 295 // 90 is when rotated counter clockwise. 296 int orientation() const; 297 298 DEFINE_ATTRIBUTE_EVENT_LISTENER(orientationchange); 299 DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart); 300 DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove); 301 DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend); 302 DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel); 303 304 Performance& performance() const; 305 306 // FIXME: When this LocalDOMWindow is no longer the active LocalDOMWindow (i.e., 307 // when its document is no longer the document that is displayed in its 308 // frame), we would like to zero out m_frame to avoid being confused 309 // by the document that is currently active in m_frame. 310 bool isCurrentlyDisplayedInFrame() const; 311 312 void willDetachDocumentFromFrame(); 313 LocalDOMWindow* anonymousIndexedGetter(uint32_t); 314 315 bool isInsecureScriptAccess(LocalDOMWindow& callingWindow, const String& urlString); 316 317 PassOwnPtr<LifecycleNotifier<LocalDOMWindow> > createLifecycleNotifier(); 318 319 EventQueue* eventQueue() const; 320 void enqueueWindowEvent(PassRefPtrWillBeRawPtr<Event>); 321 void enqueueDocumentEvent(PassRefPtrWillBeRawPtr<Event>); 322 void enqueuePageshowEvent(PageshowEventPersistence); 323 void enqueueHashchangeEvent(const String& oldURL, const String& newURL); 324 void enqueuePopstateEvent(PassRefPtr<SerializedScriptValue>); 325 void dispatchWindowLoadEvent(); 326 void documentWasClosed(); 327 void statePopped(PassRefPtr<SerializedScriptValue>); 328 329 // FIXME: This shouldn't be public once LocalDOMWindow becomes ExecutionContext. 330 void clearEventQueue(); 331 332 void acceptLanguagesChanged(); 333 334 virtual void trace(Visitor*) OVERRIDE; 335 336 protected: 337 DOMWindowLifecycleNotifier& lifecycleNotifier(); 338 339 private: 340 explicit LocalDOMWindow(LocalFrame&); 341 342 Page* page(); 343 344 virtual void frameDestroyed() OVERRIDE; 345 virtual void willDetachFrameHost() OVERRIDE; 346 347 void clearDocument(); 348 void resetDOMWindowProperties(); 349 void willDestroyDocumentInFrame(); 350 351 // FIXME: Oilpan: the need for this internal method will fall 352 // away when EventTargets are no longer using refcounts and 353 // window properties are also on the heap. Inline the minimal 354 // do-not-broadcast handling then and remove the enum + 355 // removeAllEventListenersInternal(). 356 enum BroadcastListenerRemoval { 357 DoNotBroadcastListenerRemoval, 358 DoBroadcastListenerRemoval 359 }; 360 361 void removeAllEventListenersInternal(BroadcastListenerRemoval); 362 363 RefPtrWillBeMember<Document> m_document; 364 365 bool m_shouldPrintWhenFinishedLoading; 366 #if ASSERT_ENABLED 367 bool m_hasBeenReset; 368 #endif 369 370 HashSet<DOMWindowProperty*> m_properties; 371 372 mutable RefPtrWillBeMember<Screen> m_screen; 373 mutable RefPtrWillBeMember<History> m_history; 374 mutable RefPtrWillBeMember<BarProp> m_locationbar; 375 mutable RefPtrWillBeMember<BarProp> m_menubar; 376 mutable RefPtrWillBeMember<BarProp> m_personalbar; 377 mutable RefPtrWillBeMember<BarProp> m_scrollbars; 378 mutable RefPtrWillBeMember<BarProp> m_statusbar; 379 mutable RefPtrWillBeMember<BarProp> m_toolbar; 380 mutable RefPtrWillBeMember<Console> m_console; 381 mutable RefPtrWillBeMember<Navigator> m_navigator; 382 mutable RefPtrWillBeMember<Location> m_location; 383 mutable RefPtrWillBeMember<StyleMedia> m_media; 384 385 String m_status; 386 String m_defaultStatus; 387 388 mutable RefPtrWillBeMember<Storage> m_sessionStorage; 389 mutable RefPtrWillBeMember<Storage> m_localStorage; 390 mutable RefPtrWillBeMember<ApplicationCache> m_applicationCache; 391 392 mutable RefPtrWillBeMember<Performance> m_performance; 393 394 mutable RefPtrWillBeMember<DOMWindowCSS> m_css; 395 396 RefPtrWillBeMember<DOMWindowEventQueue> m_eventQueue; 397 RefPtr<SerializedScriptValue> m_pendingStateObject; 398 399 HashSet<OwnPtr<PostMessageTimer> > m_postMessageTimers; 400 }; 401 402 inline String LocalDOMWindow::status() const 403 { 404 return m_status; 405 } 406 407 inline String LocalDOMWindow::defaultStatus() const 408 { 409 return m_defaultStatus; 410 } 411 412 } // namespace WebCore 413 414 #endif // DOMWindow_h 415