| Index: content/browser/frame_host/navigation_request.cc
|
| diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
|
| index 8feb8e20b4703844c6e6de8b98378b9c01a30f04..6fb76918e43b3fe5a90079c39bb60c0c656d2a82 100644
|
| --- a/content/browser/frame_host/navigation_request.cc
|
| +++ b/content/browser/frame_host/navigation_request.cc
|
| @@ -6,6 +6,8 @@
|
|
|
| #include <utility>
|
|
|
| +#include "content/browser/appcache/appcache_frame_node_navigation.h"
|
| +#include "content/browser/appcache/appcache_service_impl.h"
|
| #include "content/browser/child_process_security_policy_impl.h"
|
| #include "content/browser/devtools/render_frame_devtools_agent_host.h"
|
| #include "content/browser/frame_host/frame_tree.h"
|
| @@ -28,6 +30,7 @@
|
| #include "content/public/browser/navigation_ui_data.h"
|
| #include "content/public/browser/storage_partition.h"
|
| #include "content/public/browser/stream_handle.h"
|
| +#include "content/public/common/appcache_info.h"
|
| #include "content/public/common/content_client.h"
|
| #include "content/public/common/request_context_type.h"
|
| #include "content/public/common/resource_response.h"
|
| @@ -222,7 +225,9 @@ NavigationRequest::NavigationRequest(
|
| restore_type_(RestoreType::NONE),
|
| is_view_source_(false),
|
| bindings_(NavigationEntryImpl::kInvalidBindings),
|
| - associated_site_instance_type_(AssociatedSiteInstanceType::NONE) {
|
| + associated_site_instance_type_(AssociatedSiteInstanceType::NONE),
|
| + appcache_host_id_(kAppCacheNoHostId),
|
| + navigation_committed_(false) {
|
| DCHECK(!browser_initiated || (entry != nullptr && frame_entry != nullptr));
|
| if (browser_initiated) {
|
| FrameNavigationEntry* frame_entry = entry->GetFrameEntry(frame_tree_node);
|
| @@ -256,6 +261,13 @@ NavigationRequest::NavigationRequest(
|
| }
|
|
|
| NavigationRequest::~NavigationRequest() {
|
| + // If the navigation was started but never committed we need to inform the
|
| + // AppCacheFrameNavigationHandler about this so it can clean up any state.
|
| + if ((state_ == STARTED || state_ == RESPONSE_STARTED) &&
|
| + !navigation_committed_) {
|
| + AppCacheFrameNavigationHandler::FailedNavigation(
|
| + frame_tree_node_->frame_tree_node_id());
|
| + }
|
| }
|
|
|
| void NavigationRequest::BeginNavigation() {
|
| @@ -264,6 +276,18 @@ void NavigationRequest::BeginNavigation() {
|
| state_ = STARTED;
|
| RenderFrameDevToolsAgentHost::OnBeforeNavigation(navigation_handle_.get());
|
|
|
| + SiteInstance* site_instance =
|
| + frame_tree_node_->current_frame_host()->GetSiteInstance();
|
| + StoragePartition* partition = BrowserContext::GetStoragePartition(
|
| + site_instance->GetBrowserContext(), site_instance);
|
| +
|
| + // Inform the AppCacheFrameNavigationHandler class about this navigation.
|
| + // This function returns the AppCache host id which we need to pass to the
|
| + // renderer when the navigation commits.
|
| + appcache_host_id_ = AppCacheFrameNavigationHandler::BeginNavigation(
|
| + static_cast<AppCacheServiceImpl*>(partition->GetAppCacheService()),
|
| + frame_tree_node_->frame_tree_node_id());
|
| +
|
| if (ShouldMakeNetworkRequestForURL(common_params_.url)) {
|
| // It's safe to use base::Unretained because this NavigationRequest owns
|
| // the NavigationHandle where the callback will be stored.
|
| @@ -436,6 +460,10 @@ void NavigationRequest::OnRequestFailed(bool has_stale_copy_in_cache,
|
| int net_error) {
|
| DCHECK(state_ == STARTED);
|
| state_ = FAILED;
|
| +
|
| + AppCacheFrameNavigationHandler::FailedNavigation(
|
| + frame_tree_node_->frame_tree_node_id());
|
| +
|
| navigation_handle_->set_net_error_code(static_cast<net::Error>(net_error));
|
| frame_tree_node_->navigator()->FailedNavigation(
|
| frame_tree_node_, has_stale_copy_in_cache, net_error);
|
| @@ -531,7 +559,8 @@ void NavigationRequest::OnStartChecksComplete(
|
| frame_tree_node_->current_origin(), frame_tree_node_->IsMainFrame(),
|
| parent_is_main_frame, IsSecureFrame(frame_tree_node_->parent()),
|
| frame_tree_node_->frame_tree_node_id(), is_for_guests_only,
|
| - report_raw_headers),
|
| + report_raw_headers, appcache_host_id_,
|
| + static_cast<AppCacheServiceImpl*>(partition->GetAppCacheService())),
|
| std::move(navigation_ui_data),
|
| navigation_handle_->service_worker_handle(), this);
|
| }
|
| @@ -588,6 +617,14 @@ void NavigationRequest::CommitNavigation() {
|
|
|
| DCHECK_EQ(request_params_.has_user_gesture, begin_params_.has_user_gesture);
|
|
|
| + AppCacheFrameNavigationHandler::CommitNavigation(
|
| + frame_tree_node_->frame_tree_node_id(),
|
| + render_frame_host->GetProcess()->GetID());
|
| +
|
| + navigation_committed_ = true;
|
| +
|
| + request_params_.appcache_host_id = appcache_host_id_;
|
| +
|
| render_frame_host->CommitNavigation(response_.get(), std::move(body_),
|
| common_params_, request_params_,
|
| is_view_source_);
|
|
|