Commit 1cd6baf6 authored by sammc's avatar sammc Committed by Commit bot

Fix a crash in MimeHandlerServiceImpl::AbortStream().

BUG=452799

Review URL: https://codereview.chromium.org/885563002

Cr-Commit-Position: refs/heads/master@{#313472}
parent 2c9ef53f
...@@ -188,6 +188,7 @@ if (false) { ...@@ -188,6 +188,7 @@ if (false) {
"browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc", "browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc",
"browser/api/declarative_webrequest/webrequest_condition_unittest.cc", "browser/api/declarative_webrequest/webrequest_condition_unittest.cc",
"browser/api/idle/idle_api_unittest.cc", "browser/api/idle/idle_api_unittest.cc",
"browser/api/mime_handler_private/mime_handler_private_unittest.cc",
"browser/api/sockets_tcp/sockets_tcp_api_unittest.cc", "browser/api/sockets_tcp/sockets_tcp_api_unittest.cc",
"browser/api/sockets_udp/sockets_udp_api_unittest.cc", "browser/api/sockets_udp/sockets_udp_api_unittest.cc",
"browser/api/storage/settings_quota_unittest.cc", "browser/api/storage/settings_quota_unittest.cc",
......
...@@ -60,6 +60,10 @@ void MimeHandlerServiceImpl::GetStreamInfo( ...@@ -60,6 +60,10 @@ void MimeHandlerServiceImpl::GetStreamInfo(
void MimeHandlerServiceImpl::AbortStream( void MimeHandlerServiceImpl::AbortStream(
const mojo::Callback<void()>& callback) { const mojo::Callback<void()>& callback) {
if (!stream_) {
callback.Run();
return;
}
stream_->Abort(base::Bind(&MimeHandlerServiceImpl::OnStreamClosed, stream_->Abort(base::Bind(&MimeHandlerServiceImpl::OnStreamClosed,
weak_factory_.GetWeakPtr(), callback)); weak_factory_.GetWeakPtr(), callback));
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
namespace extensions { namespace extensions {
class StreamContainer; class StreamContainer;
class MimeHandlerServiceImplTest;
class MimeHandlerServiceImpl class MimeHandlerServiceImpl
: public mojo::InterfaceImpl<mime_handler::MimeHandlerService> { : public mojo::InterfaceImpl<mime_handler::MimeHandlerService> {
...@@ -19,6 +20,8 @@ class MimeHandlerServiceImpl ...@@ -19,6 +20,8 @@ class MimeHandlerServiceImpl
mojo::InterfaceRequest<mime_handler::MimeHandlerService> request); mojo::InterfaceRequest<mime_handler::MimeHandlerService> request);
private: private:
friend class MimeHandlerServiceImplTest;
explicit MimeHandlerServiceImpl( explicit MimeHandlerServiceImpl(
base::WeakPtr<StreamContainer> stream_container); base::WeakPtr<StreamContainer> stream_container);
~MimeHandlerServiceImpl() override; ~MimeHandlerServiceImpl() override;
......
// 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 "base/memory/scoped_ptr.h"
#include "content/public/browser/stream_handle.h"
#include "content/public/browser/stream_info.h"
#include "extensions/browser/api/mime_handler_private/mime_handler_private.cc"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
class TestStreamHandle : public content::StreamHandle {
public:
TestStreamHandle() : url_("stream://url") {}
~TestStreamHandle() override {
while (!close_callbacks_.empty()) {
close_callbacks_.front().Run();
close_callbacks_.pop();
}
}
const GURL& GetURL() override { return url_; }
void AddCloseListener(const base::Closure& callback) override {
close_callbacks_.push(callback);
}
private:
GURL url_;
std::queue<base::Closure> close_callbacks_;
};
class MimeHandlerServiceImplTest : public testing::Test {
public:
void SetUp() override {
scoped_ptr<content::StreamInfo> stream_info(new content::StreamInfo);
stream_info->handle = make_scoped_ptr(new TestStreamHandle);
stream_info->mime_type = "test/unit";
stream_info->original_url = GURL("test://extensions_unittests");
stream_container_.reset(
new StreamContainer(stream_info.Pass(), 1, true, GURL(), ""));
service_.reset(new MimeHandlerServiceImpl(stream_container_->GetWeakPtr()));
}
void TearDown() override {
service_.reset();
stream_container_.reset();
}
void AbortCallback() { abort_called_ = true; }
void GetStreamInfoCallback(mime_handler::StreamInfoPtr stream_info) {
stream_info_ = stream_info.Pass();
}
scoped_ptr<StreamContainer> stream_container_;
scoped_ptr<mime_handler::MimeHandlerService> service_;
bool abort_called_ = false;
mime_handler::StreamInfoPtr stream_info_;
};
TEST_F(MimeHandlerServiceImplTest, Abort) {
service_->AbortStream(base::Bind(&MimeHandlerServiceImplTest::AbortCallback,
base::Unretained(this)));
EXPECT_TRUE(abort_called_);
abort_called_ = false;
service_->AbortStream(base::Bind(&MimeHandlerServiceImplTest::AbortCallback,
base::Unretained(this)));
EXPECT_TRUE(abort_called_);
stream_container_.reset();
abort_called_ = false;
service_->AbortStream(base::Bind(&MimeHandlerServiceImplTest::AbortCallback,
base::Unretained(this)));
EXPECT_TRUE(abort_called_);
}
TEST_F(MimeHandlerServiceImplTest, GetStreamInfo) {
service_->GetStreamInfo(
base::Bind(&MimeHandlerServiceImplTest::GetStreamInfoCallback,
base::Unretained(this)));
ASSERT_TRUE(stream_info_);
EXPECT_TRUE(stream_info_->embedded);
EXPECT_EQ(1, stream_info_->tab_id);
EXPECT_EQ("test/unit", stream_info_->mime_type);
EXPECT_EQ("test://extensions_unittests", stream_info_->original_url);
EXPECT_EQ("stream://url", stream_info_->stream_url);
service_->AbortStream(base::Bind(&MimeHandlerServiceImplTest::AbortCallback,
base::Unretained(this)));
EXPECT_TRUE(abort_called_);
service_->GetStreamInfo(
base::Bind(&MimeHandlerServiceImplTest::GetStreamInfoCallback,
base::Unretained(this)));
ASSERT_FALSE(stream_info_);
stream_container_.reset();
service_->GetStreamInfo(
base::Bind(&MimeHandlerServiceImplTest::GetStreamInfoCallback,
base::Unretained(this)));
ASSERT_FALSE(stream_info_);
}
} // namespace extensions
...@@ -41,13 +41,14 @@ StreamContainer::StreamContainer(scoped_ptr<content::StreamInfo> stream, ...@@ -41,13 +41,14 @@ StreamContainer::StreamContainer(scoped_ptr<content::StreamInfo> stream,
handler_url_(handler_url), handler_url_(handler_url),
extension_id_(extension_id), extension_id_(extension_id),
weak_factory_(this) { weak_factory_(this) {
DCHECK(stream_);
} }
StreamContainer::~StreamContainer() { StreamContainer::~StreamContainer() {
} }
void StreamContainer::Abort(const base::Closure& callback) { void StreamContainer::Abort(const base::Closure& callback) {
if (!stream_) { if (!stream_->handle) {
callback.Run(); callback.Run();
return; return;
} }
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
'browser/api/declarative_webrequest/webrequest_condition_unittest.cc', 'browser/api/declarative_webrequest/webrequest_condition_unittest.cc',
'browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc', 'browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc',
'browser/api/idle/idle_api_unittest.cc', 'browser/api/idle/idle_api_unittest.cc',
'browser/api/mime_handler_private/mime_handler_private_unittest.cc',
'browser/api/power/power_api_unittest.cc', 'browser/api/power/power_api_unittest.cc',
'browser/api/sockets_tcp/sockets_tcp_api_unittest.cc', 'browser/api/sockets_tcp/sockets_tcp_api_unittest.cc',
'browser/api/sockets_udp/sockets_udp_api_unittest.cc', 'browser/api/sockets_udp/sockets_udp_api_unittest.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment