OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/renderer/script_context.h" | 5 #include "extensions/renderer/script_context.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 if (data_source && | 293 if (data_source && |
294 frame->GetSecurityOrigin().CanAccess(blink::WebSecurityOrigin::Create( | 294 frame->GetSecurityOrigin().CanAccess(blink::WebSecurityOrigin::Create( |
295 data_source->GetRequest().Url()))) { | 295 data_source->GetRequest().Url()))) { |
296 return GURL(data_source->GetRequest().Url()); | 296 return GURL(data_source->GetRequest().Url()); |
297 } | 297 } |
298 } | 298 } |
299 return GURL(weburl); | 299 return GURL(weburl); |
300 } | 300 } |
301 | 301 |
302 // static | 302 // static |
303 GURL ScriptContext::GetEffectiveDocumentURL(const blink::WebLocalFrame* frame, | 303 GURL ScriptContext::GetEffectiveDocumentURL(blink::WebLocalFrame* frame, |
304 const GURL& document_url, | 304 const GURL& document_url, |
305 bool match_about_blank) { | 305 bool match_about_blank) { |
306 // Common scenario. If |match_about_blank| is false (as is the case in most | 306 // Common scenario. If |match_about_blank| is false (as is the case in most |
307 // extensions), or if the frame is not an about:-page, just return | 307 // extensions), or if the frame is not an about:-page, just return |
308 // |document_url| (supposedly the URL of the frame). | 308 // |document_url| (supposedly the URL of the frame). |
309 if (!match_about_blank || !document_url.SchemeIs(url::kAboutScheme)) | 309 if (!match_about_blank || !document_url.SchemeIs(url::kAboutScheme)) |
310 return document_url; | 310 return document_url; |
311 | 311 |
312 // Non-sandboxed about:blank and about:srcdoc pages inherit their security | 312 // Non-sandboxed about:blank and about:srcdoc pages inherit their security |
313 // origin from their parent frame/window. So, traverse the frame/window | 313 // origin from their parent frame/window. So, traverse the frame/window |
314 // hierarchy to find the closest non-about:-page and return its URL. | 314 // hierarchy to find the closest non-about:-page and return its URL. |
315 const blink::WebFrame* parent = frame; | 315 blink::WebFrame* parent = frame; |
| 316 blink::WebDocument parent_document; |
316 do { | 317 do { |
317 if (parent->Parent()) | 318 if (parent->Parent()) |
318 parent = parent->Parent(); | 319 parent = parent->Parent(); |
319 else if (parent->Opener() != parent) | 320 else if (parent->Opener() != parent) |
320 parent = parent->Opener(); | 321 parent = parent->Opener(); |
321 else | 322 else |
322 parent = nullptr; | 323 parent = nullptr; |
323 } while (parent && !parent->GetDocument().IsNull() && | |
324 GURL(parent->GetDocument().Url()).SchemeIs(url::kAboutScheme)); | |
325 | 324 |
326 if (parent && !parent->GetDocument().IsNull()) { | 325 parent_document = parent && parent->IsWebLocalFrame() |
| 326 ? parent->ToWebLocalFrame()->GetDocument() |
| 327 : blink::WebDocument(); |
| 328 } while (!parent_document.IsNull() && |
| 329 GURL(parent_document.Url()).SchemeIs(url::kAboutScheme)); |
| 330 |
| 331 if (!parent_document.IsNull()) { |
327 // Only return the parent URL if the frame can access it. | 332 // Only return the parent URL if the frame can access it. |
328 const blink::WebDocument& parent_document = parent->GetDocument(); | |
329 if (frame->GetDocument().GetSecurityOrigin().CanAccess( | 333 if (frame->GetDocument().GetSecurityOrigin().CanAccess( |
330 parent_document.GetSecurityOrigin())) { | 334 parent_document.GetSecurityOrigin())) { |
331 return parent_document.Url(); | 335 return parent_document.Url(); |
332 } | 336 } |
333 } | 337 } |
334 return document_url; | 338 return document_url; |
335 } | 339 } |
336 | 340 |
337 ScriptContext* ScriptContext::GetContext() { | 341 ScriptContext* ScriptContext::GetContext() { |
338 DCHECK(thread_checker_.CalledOnValidThread()); | 342 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 | 525 |
522 v8::Local<v8::Object> global = v8_context()->Global(); | 526 v8::Local<v8::Object> global = v8_context()->Global(); |
523 if (!web_frame_) | 527 if (!web_frame_) |
524 return handle_scope.Escape(function->Call(global, argc, argv)); | 528 return handle_scope.Escape(function->Call(global, argc, argv)); |
525 return handle_scope.Escape( | 529 return handle_scope.Escape( |
526 v8::Local<v8::Value>(web_frame_->CallFunctionEvenIfScriptDisabled( | 530 v8::Local<v8::Value>(web_frame_->CallFunctionEvenIfScriptDisabled( |
527 function, global, argc, argv))); | 531 function, global, argc, argv))); |
528 } | 532 } |
529 | 533 |
530 } // namespace extensions | 534 } // namespace extensions |
OLD | NEW |