diff options
Diffstat (limited to 'third_party/WebKit')
7 files changed, 76 insertions, 6 deletions
diff --git a/third_party/WebKit/Source/modules/modules.gypi b/third_party/WebKit/Source/modules/modules.gypi index 8cbe2bab..855af39 100644 --- a/third_party/WebKit/Source/modules/modules.gypi +++ b/third_party/WebKit/Source/modules/modules.gypi @@ -1815,6 +1815,7 @@ 'indexeddb/IDBTransactionTest.cpp', 'mediastream/RTCDataChannelTest.cpp', 'notifications/NotificationDataTest.cpp', + 'presentation/PresentationAvailabilityTest.cpp', 'serviceworkers/ServiceWorkerContainerTest.cpp', 'webaudio/AudioBasicProcessorHandlerTest.cpp', 'webaudio/ConvolverNodeTest.cpp', diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp index a9ce847..17b5b0f 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp +++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp @@ -103,6 +103,8 @@ void PresentationAvailability::stop() void PresentationAvailability::pageVisibilityChanged() { + if (m_state == State::Inactive) + return; updateListening(); } @@ -141,4 +143,4 @@ DEFINE_TRACE(PresentationAvailability) ActiveDOMObject::trace(visitor); } -} // namespace +} // blink namespace diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h index 82e1f7d..07c302f 100644 --- a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h +++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.h @@ -8,6 +8,7 @@ #include "core/dom/ActiveDOMObject.h" #include "core/events/EventTarget.h" #include "core/page/PageLifecycleObserver.h" +#include "modules/ModulesExport.h" #include "platform/weborigin/KURL.h" #include "public/platform/WebURL.h" #include "public/platform/modules/presentation/WebPresentationAvailabilityObserver.h" @@ -21,7 +22,7 @@ class ScriptPromiseResolver; // object will be initialized with a default value passed via ::take() and will // then subscribe to receive callbacks if the status for |url| were to // change. The object will only listen to changes when required. -class PresentationAvailability final +class MODULES_EXPORT PresentationAvailability final : public RefCountedGarbageCollectedEventTargetWithInlineData<PresentationAvailability> , public ActiveDOMObject , public PageLifecycleObserver @@ -30,9 +31,6 @@ class PresentationAvailability final WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(PresentationAvailability); DEFINE_WRAPPERTYPEINFO(); public: - // For CallbackPromiseAdapter. - using WebType = bool; - static PresentationAvailability* take(ScriptPromiseResolver*, const KURL&, bool); ~PresentationAvailability() override; diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityTest.cpp b/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityTest.cpp new file mode 100644 index 0000000..7f56c10 --- /dev/null +++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailabilityTest.cpp @@ -0,0 +1,55 @@ +// Copyright 2015 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 "modules/presentation/PresentationAvailability.h" + +#include "bindings/core/v8/ScriptPromiseResolver.h" +#include "bindings/core/v8/V8BindingForTesting.h" +#include "core/frame/LocalFrame.h" +#include "core/page/Page.h" +#include "core/testing/DummyPageHolder.h" +#include "platform/testing/URLTestHelpers.h" +#include "platform/weborigin/KURL.h" +#include <gtest/gtest.h> +#include <v8.h> + +namespace blink { +namespace { + +class PresentationAvailabilityTest : public ::testing::Test { +public: + PresentationAvailabilityTest() + : m_scope(v8::Isolate::GetCurrent()) + , m_page(DummyPageHolder::create()) + { + } + + void SetUp() override + { + m_scope.scriptState()->setExecutionContext(&m_page->document()); + } + + Page& page() { return m_page->page(); } + LocalFrame& frame() { return m_page->frame(); } + ScriptState* scriptState() { return m_scope.scriptState(); } + +private: + V8TestingScope m_scope; + OwnPtr<DummyPageHolder> m_page; +}; + +TEST_F(PresentationAvailabilityTest, NoPageVisibilityChangeAfterDetach) +{ + const KURL url = URLTestHelpers::toKURL("https://example.com"); + Persistent<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState()); + Persistent<PresentationAvailability> availability = PresentationAvailability::take(resolver, url, false); + + // These two calls should not crash. + frame().detach(FrameDetachType::Remove); + page().setVisibilityState(PageVisibilityStateHidden, false); +} + +} // anonymous namespace +} // namespace blink diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi index 7a63b3e..add90dd 100644 --- a/third_party/WebKit/Source/platform/blink_platform.gypi +++ b/third_party/WebKit/Source/platform/blink_platform.gypi @@ -307,6 +307,7 @@ 'exported/WebPasswordCredential.cpp', 'exported/WebPrerender.cpp', 'exported/WebPrerenderingSupport.cpp', + 'exported/WebPresentationAvailabilityObserver.cpp', 'exported/WebPresentationController.cpp', 'exported/WebProcessMemoryDump.cpp', 'exported/WebRTCConfiguration.cpp', diff --git a/third_party/WebKit/Source/platform/exported/WebPresentationAvailabilityObserver.cpp b/third_party/WebKit/Source/platform/exported/WebPresentationAvailabilityObserver.cpp new file mode 100644 index 0000000..eb98ae9 --- /dev/null +++ b/third_party/WebKit/Source/platform/exported/WebPresentationAvailabilityObserver.cpp @@ -0,0 +1,12 @@ +// Copyright 2015 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 "public/platform/modules/presentation/WebPresentationAvailabilityObserver.h" + +// This WebPresentationAvailabilityObserver.cpp, which includes only config.h +// and WebPresentationAvailabilityObserver.h, should be in +// Source/platform/exported, because WebPresentationAvailabilityObserver is not +// compiled without this cpp. So if we don't have this cpp, we will see +// unresolved symbol error when constructor/destructor's address is required. diff --git a/third_party/WebKit/public/platform/modules/presentation/WebPresentationAvailabilityObserver.h b/third_party/WebKit/public/platform/modules/presentation/WebPresentationAvailabilityObserver.h index e70e766..49d6835 100644 --- a/third_party/WebKit/public/platform/modules/presentation/WebPresentationAvailabilityObserver.h +++ b/third_party/WebKit/public/platform/modules/presentation/WebPresentationAvailabilityObserver.h @@ -5,6 +5,7 @@ #ifndef WebPresentationAvailabilityObserver_h #define WebPresentationAvailabilityObserver_h +#include "public/platform/WebCommon.h" #include "public/platform/WebURL.h" namespace blink { @@ -12,7 +13,7 @@ namespace blink { // WebPresentationAvailabilityObserver is an interface that is implemented by // objects that wish to be notified when there is a presentation display // availability change for a given URL. -class WebPresentationAvailabilityObserver { +class BLINK_PLATFORM_EXPORT WebPresentationAvailabilityObserver { public: virtual ~WebPresentationAvailabilityObserver() = default; |