Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp

Issue 2538403002: Revert of binding: Removes Document::wrap that must be equivalent to Node::wrap. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2008, 2009, 2011 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 15 matching lines...) Expand all
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "bindings/core/v8/WindowProxy.h" 31 #include "bindings/core/v8/WindowProxy.h"
32 32
33 #include "bindings/core/v8/ConditionalFeatures.h" 33 #include "bindings/core/v8/ConditionalFeatures.h"
34 #include "bindings/core/v8/DOMWrapperWorld.h" 34 #include "bindings/core/v8/DOMWrapperWorld.h"
35 #include "bindings/core/v8/ScriptController.h" 35 #include "bindings/core/v8/ScriptController.h"
36 #include "bindings/core/v8/ToV8.h"
37 #include "bindings/core/v8/V8Binding.h" 36 #include "bindings/core/v8/V8Binding.h"
38 #include "bindings/core/v8/V8DOMActivityLogger.h" 37 #include "bindings/core/v8/V8DOMActivityLogger.h"
39 #include "bindings/core/v8/V8Document.h" 38 #include "bindings/core/v8/V8Document.h"
40 #include "bindings/core/v8/V8GCForContextDispose.h" 39 #include "bindings/core/v8/V8GCForContextDispose.h"
41 #include "bindings/core/v8/V8HTMLCollection.h" 40 #include "bindings/core/v8/V8HTMLCollection.h"
42 #include "bindings/core/v8/V8HTMLDocument.h" 41 #include "bindings/core/v8/V8HTMLDocument.h"
43 #include "bindings/core/v8/V8HiddenValue.h" 42 #include "bindings/core/v8/V8HiddenValue.h"
44 #include "bindings/core/v8/V8Initializer.h" 43 #include "bindings/core/v8/V8Initializer.h"
45 #include "bindings/core/v8/V8ObjectConstructor.h" 44 #include "bindings/core/v8/V8ObjectConstructor.h"
46 #include "bindings/core/v8/V8PagePopupControllerBinding.h" 45 #include "bindings/core/v8/V8PagePopupControllerBinding.h"
(...skipping 20 matching lines...) Expand all
67 #include "wtf/Assertions.h" 66 #include "wtf/Assertions.h"
68 #include "wtf/StringExtras.h" 67 #include "wtf/StringExtras.h"
69 #include "wtf/text/CString.h" 68 #include "wtf/text/CString.h"
70 #include <algorithm> 69 #include <algorithm>
71 #include <utility> 70 #include <utility>
72 #include <v8-debug.h> 71 #include <v8-debug.h>
73 #include <v8.h> 72 #include <v8.h>
74 73
75 namespace blink { 74 namespace blink {
76 75
76 static void checkDocumentWrapper(v8::Local<v8::Object> wrapper,
77 Document* document) {
78 ASSERT(V8Document::toImpl(wrapper) == document);
79 }
80
77 WindowProxy* WindowProxy::create(v8::Isolate* isolate, 81 WindowProxy* WindowProxy::create(v8::Isolate* isolate,
78 Frame* frame, 82 Frame* frame,
79 DOMWrapperWorld& world) { 83 DOMWrapperWorld& world) {
80 return new WindowProxy(frame, &world, isolate); 84 return new WindowProxy(frame, &world, isolate);
81 } 85 }
82 86
83 WindowProxy::WindowProxy(Frame* frame, 87 WindowProxy::WindowProxy(Frame* frame,
84 PassRefPtr<DOMWrapperWorld> world, 88 PassRefPtr<DOMWrapperWorld> world,
85 v8::Isolate* isolate) 89 v8::Isolate* isolate)
86 : m_frame(frame), m_isolate(isolate), m_world(world) {} 90 : m_frame(frame), m_isolate(isolate), m_world(world) {}
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 V8DOMWrapper::setNativeInfo(m_isolate, windowProperties, wrapperTypeInfo, 410 V8DOMWrapper::setNativeInfo(m_isolate, windowProperties, wrapperTypeInfo,
407 window); 411 window);
408 412
409 // TODO(keishi): Remove installPagePopupController and implement 413 // TODO(keishi): Remove installPagePopupController and implement
410 // PagePopupController in another way. 414 // PagePopupController in another way.
411 V8PagePopupControllerBinding::installPagePopupController(context, 415 V8PagePopupControllerBinding::installPagePopupController(context,
412 windowWrapper); 416 windowWrapper);
413 return true; 417 return true;
414 } 418 }
415 419
420 void WindowProxy::updateDocumentWrapper(v8::Local<v8::Object> wrapper) {
421 ASSERT(m_world->isMainWorld());
422 m_document.set(m_isolate, wrapper);
423 }
424
416 void WindowProxy::updateDocumentProperty() { 425 void WindowProxy::updateDocumentProperty() {
417 DCHECK(m_world->isMainWorld()); 426 if (!m_world->isMainWorld())
427 return;
418 428
419 if (m_frame->isRemoteFrame()) 429 if (m_frame->isRemoteFrame()) {
420 return; 430 return;
431 }
421 432
422 ScriptState::Scope scope(m_scriptState.get()); 433 ScriptState::Scope scope(m_scriptState.get());
423 v8::Local<v8::Context> context = m_scriptState->context(); 434 v8::Local<v8::Context> context = m_scriptState->context();
424 LocalFrame* frame = toLocalFrame(m_frame); 435 LocalFrame* frame = toLocalFrame(m_frame);
425 // In the main world, the window.document attribute must be set right after
426 // the initialization of the Window or right after the installation of a new
427 // document, thus this must be the first time of the wrapper instantiation of
428 // the document.
429 CHECK(!frame->document()->containsWrapper());
430 v8::Local<v8::Value> documentWrapper = 436 v8::Local<v8::Value> documentWrapper =
431 toV8(frame->document(), context->Global(), m_isolate); 437 toV8(frame->document(), context->Global(), context->GetIsolate());
432 DCHECK(documentWrapper->IsObject()); 438 if (documentWrapper.IsEmpty())
433 m_document.set(m_isolate, documentWrapper.As<v8::Object>()); 439 return;
440 ASSERT(documentWrapper == m_document.newLocal(m_isolate) ||
441 m_document.isEmpty());
442 if (m_document.isEmpty())
443 updateDocumentWrapper(v8::Local<v8::Object>::Cast(documentWrapper));
444 checkDocumentWrapper(m_document.newLocal(m_isolate), frame->document());
445
446 ASSERT(documentWrapper->IsObject());
434 447
435 // Update cached accessor. 448 // Update cached accessor.
436 CHECK(V8PrivateProperty::getWindowDocumentCachedAccessor(m_isolate).set( 449 CHECK(V8PrivateProperty::getWindowDocumentCachedAccessor(m_isolate).set(
437 context, context->Global(), documentWrapper)); 450 context, context->Global(), documentWrapper));
438 } 451 }
439 452
440 void WindowProxy::updateActivityLogger() { 453 void WindowProxy::updateActivityLogger() {
441 m_scriptState->perContextData()->setActivityLogger( 454 m_scriptState->perContextData()->setActivityLogger(
442 V8DOMActivityLogger::activityLogger( 455 V8DOMActivityLogger::activityLogger(
443 m_world->worldId(), 456 m_world->worldId(),
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 } 504 }
492 token = frameSecurityToken + token; 505 token = frameSecurityToken + token;
493 } 506 }
494 507
495 // NOTE: V8 does identity comparison in fast path, must use a symbol 508 // NOTE: V8 does identity comparison in fast path, must use a symbol
496 // as the security token. 509 // as the security token.
497 context->SetSecurityToken(v8AtomicString(m_isolate, token)); 510 context->SetSecurityToken(v8AtomicString(m_isolate, token));
498 } 511 }
499 512
500 void WindowProxy::updateDocument() { 513 void WindowProxy::updateDocument() {
501 DCHECK(m_world->isMainWorld()); 514 ASSERT(m_world->isMainWorld());
502 if (!isGlobalInitialized()) 515 if (!isGlobalInitialized())
503 return; 516 return;
504 if (!isContextInitialized()) 517 if (!isContextInitialized())
505 return; 518 return;
506 updateActivityLogger(); 519 updateActivityLogger();
507 updateDocumentProperty(); 520 updateDocumentProperty();
508 updateSecurityOrigin(m_frame->securityContext()->getSecurityOrigin()); 521 updateSecurityOrigin(m_frame->securityContext()->getSecurityOrigin());
509 } 522 }
510 523
511 static v8::Local<v8::Value> getNamedProperty( 524 static v8::Local<v8::Value> getNamedProperty(
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 return; 561 return;
549 } 562 }
550 v8::Local<v8::Value> value; 563 v8::Local<v8::Value> value;
551 if (info.Holder() 564 if (info.Holder()
552 ->GetRealNamedPropertyInPrototypeChain( 565 ->GetRealNamedPropertyInPrototypeChain(
553 info.GetIsolate()->GetCurrentContext(), property.As<v8::String>()) 566 info.GetIsolate()->GetCurrentContext(), property.As<v8::String>())
554 .ToLocal(&value)) 567 .ToLocal(&value))
555 v8SetReturnValue(info, value); 568 v8SetReturnValue(info, value);
556 } 569 }
557 570
558 void WindowProxy::checkDocumentWrapper(v8::Local<v8::Object> wrapper,
559 Document* document) const {
560 DCHECK(!wrapper.IsEmpty());
561 DCHECK_EQ(V8Document::toImpl(wrapper), document);
562 DCHECK(wrapper ==
563 toV8(document, m_globalProxy.newLocal(m_isolate), m_isolate));
564 }
565
566 void WindowProxy::namedItemAdded(HTMLDocument* document, 571 void WindowProxy::namedItemAdded(HTMLDocument* document,
567 const AtomicString& name) { 572 const AtomicString& name) {
568 DCHECK(m_world->isMainWorld()); 573 ASSERT(m_world->isMainWorld());
569 574
570 if (!isContextInitialized() || !m_scriptState->contextIsValid()) 575 if (!isContextInitialized() || !m_scriptState->contextIsValid())
571 return; 576 return;
572 577
573 ScriptState::Scope scope(m_scriptState.get()); 578 ScriptState::Scope scope(m_scriptState.get());
574 v8::Local<v8::Object> documentWrapper = m_document.newLocal(m_isolate); 579 ASSERT(!m_document.isEmpty());
575 checkDocumentWrapper(documentWrapper, document); 580 v8::Local<v8::Context> context = m_scriptState->context();
576 documentWrapper->SetAccessor(m_isolate->GetCurrentContext(), 581 v8::Local<v8::Object> documentHandle = m_document.newLocal(m_isolate);
577 v8String(m_isolate, name), getter); 582 checkDocumentWrapper(documentHandle, document);
583 documentHandle->SetAccessor(context, v8String(m_isolate, name), getter);
578 } 584 }
579 585
580 void WindowProxy::namedItemRemoved(HTMLDocument* document, 586 void WindowProxy::namedItemRemoved(HTMLDocument* document,
581 const AtomicString& name) { 587 const AtomicString& name) {
582 DCHECK(m_world->isMainWorld()); 588 ASSERT(m_world->isMainWorld());
583 589
584 if (!isContextInitialized()) 590 if (!isContextInitialized())
585 return; 591 return;
586 592
587 if (document->hasNamedItem(name) || document->hasExtraNamedItem(name)) 593 if (document->hasNamedItem(name) || document->hasExtraNamedItem(name))
588 return; 594 return;
589 595
590 ScriptState::Scope scope(m_scriptState.get()); 596 ScriptState::Scope scope(m_scriptState.get());
591 v8::Local<v8::Object> documentWrapper = m_document.newLocal(m_isolate); 597 ASSERT(!m_document.isEmpty());
592 checkDocumentWrapper(documentWrapper, document); 598 v8::Local<v8::Object> documentHandle = m_document.newLocal(m_isolate);
593 documentWrapper->Delete(m_isolate->GetCurrentContext(), 599 checkDocumentWrapper(documentHandle, document);
594 v8String(m_isolate, name)); 600 documentHandle->Delete(m_isolate->GetCurrentContext(),
601 v8String(m_isolate, name));
595 } 602 }
596 603
597 void WindowProxy::updateSecurityOrigin(SecurityOrigin* origin) { 604 void WindowProxy::updateSecurityOrigin(SecurityOrigin* origin) {
598 if (!isContextInitialized()) 605 if (!isContextInitialized())
599 return; 606 return;
600 setSecurityToken(origin); 607 setSecurityToken(origin);
601 } 608 }
602 609
603 } // namespace blink 610 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/bindings/core/v8/WindowProxy.h ('k') | third_party/WebKit/Source/core/dom/Document.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698