Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 35 #include "bindings/core/v8/ScopedPersistent.h" | 35 #include "bindings/core/v8/ScopedPersistent.h" |
| 36 #include "core/CoreExport.h" | 36 #include "core/CoreExport.h" |
| 37 #include "platform/heap/Handle.h" | 37 #include "platform/heap/Handle.h" |
| 38 #include "v8/include/v8.h" | 38 #include "v8/include/v8.h" |
| 39 #include "wtf/RefPtr.h" | 39 #include "wtf/RefPtr.h" |
| 40 | 40 |
| 41 namespace blink { | 41 namespace blink { |
| 42 | 42 |
| 43 class DOMWindow; | 43 class DOMWindow; |
| 44 class Frame; | 44 class Frame; |
| 45 class ScriptController; | |
| 46 | 45 |
| 47 // WindowProxy implements the split window model of a window for a frame. In the | 46 // WindowProxy implements the split window model of a window for a frame. In the |
| 48 // HTML standard, the split window model is composed of the Window interface | 47 // HTML standard, the split window model is composed of the Window interface |
| 49 // (the inner global object) and the WindowProxy interface (the outer global | 48 // (the inner global object) and the WindowProxy interface (the outer global |
| 50 // proxy). | 49 // proxy). |
| 51 // | 50 // |
| 52 // The Window interface is backed by the Blink DOMWindow C++ implementation. | 51 // The Window interface is backed by the Blink DOMWindow C++ implementation. |
| 53 // In contrast, the WindowProxy interface does not have a corresponding | 52 // In contrast, the WindowProxy interface does not have a corresponding |
| 54 // C++ implementation in Blink: the WindowProxy class defined here only manages | 53 // C++ implementation in Blink: the WindowProxy class defined here only manages |
| 55 // context initialization and detach. Instead, the behavior of the WindowProxy | 54 // context initialization and detach. Instead, the behavior of the WindowProxy |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 v8::Local<v8::Object> releaseGlobal(); | 155 v8::Local<v8::Object> releaseGlobal(); |
| 157 void setGlobal(v8::Local<v8::Object>); | 156 void setGlobal(v8::Local<v8::Object>); |
| 158 | 157 |
| 159 // TODO(dcheng): Temporarily exposed to avoid include cycles. Remove the need | 158 // TODO(dcheng): Temporarily exposed to avoid include cycles. Remove the need |
| 160 // for this and remove this getter. | 159 // for this and remove this getter. |
| 161 DOMWrapperWorld& world() { return *m_world; } | 160 DOMWrapperWorld& world() { return *m_world; } |
| 162 | 161 |
| 163 virtual bool isLocal() const { return false; } | 162 virtual bool isLocal() const { return false; } |
| 164 | 163 |
| 165 protected: | 164 protected: |
| 166 // TODO(dcheng): Remove this friend declaration once LocalWindowProxyManager | 165 // Lifecycle represents the following four states. |
| 167 // and ScriptController are merged. | 166 // |
| 168 friend class ScriptController; | 167 // * ContextIsUninitialized |
| 169 | 168 // We lazily initialize WindowProxies for performance reasons, and this state |
| 170 // A valid transition is from ContextUninitialized to ContextInitialized, | 169 // is "to be initialized on demand". WindowProxy basically behaves the same as |
| 171 // and then ContextDetached. Other transitions are forbidden. | 170 // |ContextIsInitialized| from a point of view of call sites. |
| 171 // - Possible next states: ContextIsInitialized | |
| 172 // It's possible to detach the context's frame from the DOM or navigate to a | |
| 173 // new page without initializing the WindowProxy, however, there is no | |
| 174 // transition to |FrameIsDetached| or |GlobalObjectIsDetached| | |
| 175 // because |disposeContext| does not change the state if the state is | |
| 176 // |ContextIsUninitialized|. In either case of a) the browsing context | |
| 177 // container is detached from the DOM or b) the page is navigated away, there | |
| 178 // must be no way for author script to access the context of | |
| 179 // |ContextIsUninitialized| because |ContextIsUninitialized| means that author | |
| 180 // script has never accessed the context, hence there must exist no reference | |
| 181 // to the context. | |
| 182 // | |
| 183 // * ContextIsInitialized | |
| 184 // The context is initialized and its frame is still attached to the DOM. | |
| 185 // - Possible next states: FrameIsDetached, GlobalObjectIsDetached | |
| 186 // | |
| 187 // * GlobalObjectIsDetached | |
| 188 // The context is initialized and its frame is still attached to the DOM, and | |
| 189 // the page is now navigated away. The global object (inner global) is | |
|
dcheng
2017/03/30 21:03:01
Maybe something like this would be slightly cleare
Yuki
2017/03/31 07:32:09
Done.
| |
| 190 // detached from the global proxy (outer global), but the (detached) global | |
| 191 // object and context are still alive, and author script may have references | |
| 192 // to the context. | |
| 193 // The spec does not support full web features in this state. Blink supports | |
| 194 // less things than the spec. | |
| 195 // - Possible next states: ContextIsInitialized | |
| 196 // This state is in the middle of navigation. Once document loading is | |
| 197 // completed, the WindowProxy will always be reinitialized, as | |
| 198 // |DocumentLoader::installNewDocument| ends up calling to | |
| 199 // |WindowProxy::updateDocument|, which reinitializes the WindowProxy. | |
| 200 // | |
| 201 // * FrameIsDetached | |
| 202 // The context was initialized, but its frame has been detached from the DOM. | |
| 203 // Note that the context is still alive and author script may have references | |
| 204 // to the context and hence author script may run in the context. | |
| 205 // The spec does not support some of web features such as setTimeout, etc. on | |
| 206 // a detached window. Blink supports less things than the spec. | |
| 207 // V8PerContextData is cut off from the context. | |
| 208 // - Possible next states: n/a | |
| 172 enum class Lifecycle { | 209 enum class Lifecycle { |
| 173 ContextUninitialized, | 210 // v8::Context is not yet initialized. |
| 174 ContextInitialized, | 211 ContextIsUninitialized, |
| 175 ContextDetached, | 212 // v8::Context is initialized. |
| 213 ContextIsInitialized, | |
| 214 // The global object (inner global) is detached from the global proxy (outer | |
| 215 // global). | |
| 216 GlobalObjectIsDetached, | |
| 217 // The context's frame is detached from the DOM. | |
| 218 FrameIsDetached, | |
| 176 }; | 219 }; |
| 177 | 220 |
| 178 WindowProxy(v8::Isolate*, Frame&, RefPtr<DOMWrapperWorld>); | 221 WindowProxy(v8::Isolate*, Frame&, RefPtr<DOMWrapperWorld>); |
| 179 | 222 |
| 180 virtual void initialize() = 0; | 223 virtual void initialize() = 0; |
| 181 | 224 |
| 182 enum GlobalDetachmentBehavior { DoNotDetachGlobal, DetachGlobal }; | 225 enum GlobalDetachmentBehavior { DoNotDetachGlobal, DetachGlobal }; |
| 183 virtual void disposeContext(GlobalDetachmentBehavior) = 0; | 226 virtual void disposeContext(GlobalDetachmentBehavior) = 0; |
| 184 | 227 |
| 185 WARN_UNUSED_RESULT v8::Local<v8::Object> associateWithWrapper( | 228 WARN_UNUSED_RESULT v8::Local<v8::Object> associateWithWrapper( |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 205 protected: | 248 protected: |
| 206 // TODO(dcheng): Consider making these private and using getters. | 249 // TODO(dcheng): Consider making these private and using getters. |
| 207 const RefPtr<DOMWrapperWorld> m_world; | 250 const RefPtr<DOMWrapperWorld> m_world; |
| 208 ScopedPersistent<v8::Object> m_globalProxy; | 251 ScopedPersistent<v8::Object> m_globalProxy; |
| 209 Lifecycle m_lifecycle; | 252 Lifecycle m_lifecycle; |
| 210 }; | 253 }; |
| 211 | 254 |
| 212 } // namespace blink | 255 } // namespace blink |
| 213 | 256 |
| 214 #endif // WindowProxy_h | 257 #endif // WindowProxy_h |
| OLD | NEW |