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

Side by Side Diff: chrome/browser/extensions/extension_host.cc

Issue 195093: handle mole/toolstrip URLs properly (Closed)
Patch Set: Created 11 years, 3 months 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 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/extension_host.h" 5 #include "chrome/browser/extensions/extension_host.h"
6 6
7 #include "app/resource_bundle.h" 7 #include "app/resource_bundle.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "chrome/browser/browser.h" 9 #include "chrome/browser/browser.h"
10 #include "chrome/browser/browser_list.h" 10 #include "chrome/browser/browser_list.h"
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 render_view_host_->CreateRenderView(); 91 render_view_host_->CreateRenderView();
92 NavigateToURL(url_); 92 NavigateToURL(url_);
93 DCHECK(IsRenderViewLive()); 93 DCHECK(IsRenderViewLive());
94 NotificationService::current()->Notify( 94 NotificationService::current()->Notify(
95 NotificationType::EXTENSION_PROCESS_CREATED, 95 NotificationType::EXTENSION_PROCESS_CREATED,
96 Source<Profile>(profile_), 96 Source<Profile>(profile_),
97 Details<ExtensionHost>(this)); 97 Details<ExtensionHost>(this));
98 } 98 }
99 99
100 void ExtensionHost::NavigateToURL(const GURL& url) { 100 void ExtensionHost::NavigateToURL(const GURL& url) {
101 // Prevent explicit navigation to another extension id's pages.
102 // This method is only called by some APIs, so we still need to protect
103 // DidNavigate below (location = "").
104 if (url.SchemeIs(chrome::kExtensionScheme) &&
105 url.host() != extension_->id()) {
106 // TODO(erikkay) communicate this back to the caller?
107 return;
108 }
109
101 url_ = url; 110 url_ = url;
102 111
103 if (!is_background_page() && !extension_->GetBackgroundPageReady()) { 112 if (!is_background_page() && !extension_->GetBackgroundPageReady()) {
104 // Make sure the background page loads before any others. 113 // Make sure the background page loads before any others.
105 registrar_.Add(this, NotificationType::EXTENSION_BACKGROUND_PAGE_READY, 114 registrar_.Add(this, NotificationType::EXTENSION_BACKGROUND_PAGE_READY,
106 Source<Extension>(extension_)); 115 Source<Extension>(extension_));
107 return; 116 return;
108 } 117 }
109 render_view_host_->NavigateToURL(url_); 118 render_view_host_->NavigateToURL(url_);
110 } 119 }
(...skipping 23 matching lines...) Expand all
134 143
135 void ExtensionHost::DidNavigate(RenderViewHost* render_view_host, 144 void ExtensionHost::DidNavigate(RenderViewHost* render_view_host,
136 const ViewHostMsg_FrameNavigate_Params& params) { 145 const ViewHostMsg_FrameNavigate_Params& params) {
137 // We only care when the outer frame changes. 146 // We only care when the outer frame changes.
138 switch (params.transition) { 147 switch (params.transition) {
139 case PageTransition::AUTO_SUBFRAME: 148 case PageTransition::AUTO_SUBFRAME:
140 case PageTransition::MANUAL_SUBFRAME: 149 case PageTransition::MANUAL_SUBFRAME:
141 return; 150 return;
142 } 151 }
143 152
144 url_ = params.url; 153 if (!params.url.SchemeIs(chrome::kExtensionScheme)) {
145 if (!url_.SchemeIs(chrome::kExtensionScheme)) { 154 extension_function_dispatcher_.reset(NULL);
155 url_ = params.url;
156 return;
157 }
158
159 // This catches two bogus use cases:
160 // (1) URLs that look like chrome-extension://somethingbogus or
161 // chrome-extension://nosuchid/, in other words, no Extension would
162 // be found.
163 // (2) URLs that refer to a different extension than this one.
164 // In both cases, we preserve the old URL and reset the EFD to NULL. This
165 // will leave the host in kind of a bad state with poor UI and errors, but
166 // it's better than the alternative.
167 // TODO(erikkay) Perhaps we should display log errors or display a big 404
168 // in the toolstrip or something like that.
169 if (params.url.host() != extension_->id()) {
146 extension_function_dispatcher_.reset(NULL); 170 extension_function_dispatcher_.reset(NULL);
147 return; 171 return;
148 } 172 }
173
174 url_ = params.url;
149 extension_function_dispatcher_.reset( 175 extension_function_dispatcher_.reset(
150 new ExtensionFunctionDispatcher(render_view_host_, this, url_)); 176 new ExtensionFunctionDispatcher(render_view_host_, this, url_));
151 } 177 }
152 178
153 void ExtensionHost::DidStopLoading(RenderViewHost* render_view_host) { 179 void ExtensionHost::DidStopLoading(RenderViewHost* render_view_host) {
154 static const base::StringPiece toolstrip_css( 180 static const base::StringPiece toolstrip_css(
155 ResourceBundle::GetSharedInstance().GetRawDataResource( 181 ResourceBundle::GetSharedInstance().GetRawDataResource(
156 IDR_EXTENSIONS_TOOLSTRIP_CSS)); 182 IDR_EXTENSIONS_TOOLSTRIP_CSS));
157 #if defined(TOOLKIT_VIEWS) 183 #if defined(TOOLKIT_VIEWS)
158 ExtensionView* view = view_.get(); 184 ExtensionView* view = view_.get();
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 window_id = ExtensionTabUtil::GetWindowId( 382 window_id = ExtensionTabUtil::GetWindowId(
357 const_cast<ExtensionHost* >(this)->GetBrowser()); 383 const_cast<ExtensionHost* >(this)->GetBrowser());
358 } else if (extension_host_type_ == ViewType::EXTENSION_BACKGROUND_PAGE) { 384 } else if (extension_host_type_ == ViewType::EXTENSION_BACKGROUND_PAGE) {
359 // Background page is not attached to any browser window, so pass -1. 385 // Background page is not attached to any browser window, so pass -1.
360 window_id = -1; 386 window_id = -1;
361 } else { 387 } else {
362 NOTREACHED(); 388 NOTREACHED();
363 } 389 }
364 return window_id; 390 return window_id;
365 } 391 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698